Index: locales/en/plugins.po
===================================================================
--- locales/en/plugins.po	(revision 1989)
+++ locales/en/plugins.po	(revision 2044)
@@ -959,7 +959,19 @@
 msgstr ""
 
+msgid "Tools to maintain the performance of your blogs."
+msgstr ""
+
 msgid "Backup"
 msgstr ""
 
+msgid "Tools to back up your content."
+msgstr ""
+
+msgid "Development"
+msgstr ""
+
+msgid "Tools to assist in development of plugins, themes and core."
+msgstr ""
+
 msgid "Optimize"
 msgstr ""
@@ -980,5 +992,11 @@
 msgstr ""
 
-msgid "One task to execute"
+msgid "Compressed file for all blogs"
+msgstr ""
+
+msgid "Translations"
+msgstr ""
+
+msgid "Maintain translations"
 msgstr ""
 
@@ -991,5 +1009,5 @@
 
 #, php-format
-msgid_plural "There are %s tasks to execute."
+msgid "There are %s tasks to execute."
 msgstr ""
 
@@ -1024,4 +1042,7 @@
 msgstr ""
 
+msgid "It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory <strong>/cbtpl/</strong> directly on the server with your FTP software."
+msgstr ""
+
 msgid "Count again comments and trackbacks"
 msgstr ""
@@ -1033,4 +1054,7 @@
 msgstr ""
 
+msgid "Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2)."
+msgstr ""
+
 msgid "Search engine index"
 msgstr ""
@@ -1052,4 +1076,7 @@
 msgstr ""
 
+msgid "Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages."
+msgstr ""
+
 msgid "Index all entries for search engine"
 msgstr ""
@@ -1064,4 +1091,25 @@
 msgstr ""
 
+msgid "Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages."
+msgstr ""
+
+msgid "Entries metadata"
+msgstr ""
+
+msgid "Synchronize entries metadata"
+msgstr ""
+
+msgid "Synchronize entry %d to %d."
+msgstr ""
+
+msgid "Entries metadata synchronize done."
+msgstr ""
+
+msgid "Failed to synchronize entries metadata."
+msgstr ""
+
+msgid "Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables."
+msgstr ""
+
 msgid "Delete all logs"
 msgstr ""
@@ -1073,4 +1121,7 @@
 msgstr ""
 
+msgid "Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time."
+msgstr ""
+
 msgid "optimize tables"
 msgstr ""
@@ -1082,10 +1133,19 @@
 msgstr ""
 
+msgid "After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export."
+msgstr ""
+
 msgid "Download media folder of current blog"
 msgstr ""
 
+msgid "It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big."
+msgstr ""
+
 msgid "Download active theme of current blog"
 msgstr ""
 
+msgid "It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file."
+msgstr ""
+
 msgid "Every week"
 msgstr ""
@@ -1124,14 +1184,29 @@
 msgstr ""
 
+msgid "Activation"
+msgstr ""
+
 msgid "Display alert messages on late tasks"
 msgstr ""
 
+msgid "You can place list of late tasks on your %s."
+msgstr ""
+
+msgid "Frequency"
+msgstr "Périodicité"
+
+msgid "Use one recall time for all tasks"
+msgstr ""
+
 msgid "Recall time for all tasks:"
 msgstr ""
 
+msgid "Use one recall time per task"
+msgstr ""
+
 msgid "Recall time per task:"
 msgstr ""
 
-msgid "You can place list of late tasks on your %s."
+msgid "Save this settings"
 msgstr ""
 
Index: locales/fr/plugins.po
===================================================================
--- locales/fr/plugins.po	(revision 2022)
+++ locales/fr/plugins.po	(revision 2044)
@@ -1184,7 +1184,19 @@
 msgstr "Entretien"
 
+msgid "Tools to maintain the performance of your blogs."
+msgstr "Outils pour maintenir les performances de vos blogs."
+
 msgid "Backup"
 msgstr "Sauvegarde"
 
+msgid "Tools to back up your content."
+msgstr "Outils de sauvegarde du contenu"
+
+msgid "Development"
+msgstr "Développement"
+
+msgid "Tools to assist in development of plugins, themes and core."
+msgstr "Outils pour aider au developpement de plugins, thèmes et au core."
+
 msgid "Optimize"
 msgstr "Optimiser"
@@ -1204,4 +1216,10 @@
 msgid "Compressed file for all blogs"
 msgstr "Fichier compressé pour tous les blogs (zip)"
+
+msgid "Translations"
+msgstr "Traductions"
+
+msgid "Maintain translations"
+msgstr "Maintenir les traductions"
 
 #, php-format
@@ -1248,4 +1266,7 @@
 msgstr "Impossible de vider le répertoire de cache des « templates »."
 
+msgid "It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory <strong>/cbtpl/</strong> directly on the server with your FTP software."
+msgstr "La suppression du répertoire du cache des templates peut se révéler nécessaire lors de modifications dans les fichiers .html ou .css d'un thème (voire lors d'un changement de thème ou de mise à jour de plugin). Attention : chez certains hébergeurs (Free par exemple), le cache du répertoire des templates ne peut pas être vidé grâce à l'extension Maintenance, il faut supprimer le répertoire <strong>cbtpl</strong> situé dans le répertoire cache (dotclear/cache par défaut) avec un logiciel FTP."
+
 msgid "Count again comments and trackbacks"
 msgstr "Recompter les commentaires et rétroliens"
@@ -1257,4 +1278,7 @@
 msgstr "Impossible de recompter les commentaires et rétroliens."
 
+msgid "Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2)."
+msgstr "Recompter commentaires et des rétroliens a pour effet de donner le nombre exact de ceux-ci pour chaque billet. Cette opération peut se révéler utile lors de l'import d'un blog d'une autre plateforme (ou d'une migration de Dotclear 1 vers Dotclear 2)."
+
 msgid "Search engine index"
 msgstr "Index du moteur de recherche"
@@ -1276,4 +1300,7 @@
 msgstr "Impossible d'indexer les commentaires."
 
+msgid "Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages."
+msgstr "Indexer tous les commentaires et rétroliens dans le moteur de recherche. Cette opération s'effectue généralement suite à un import afin d'obtenir des résultats lors des recherches, aussi bien depuis l'administration du blog qu'en partie publique."
+
 msgid "Index all entries for search engine"
 msgstr "Indexer tous les billets pour le moteur de recherche"
@@ -1289,4 +1316,25 @@
 msgstr "Impossible d'indexer les billets."
 
+msgid "Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages."
+msgstr "Indexer tous les billets dans le moteur de recherche. Cette opération s'effectue généralement suite à un import afin d'obtenir des résultats lors des recherches, aussi bien depuis l'administration du blog qu'en partie publique."
+
+msgid "Entries metadata"
+msgstr "Métadonnées des billets"
+
+msgid "Synchronize entries metadata"
+msgstr "Synchroniser les métadonnées des billets"
+
+msgid "Synchronize entry %d to %d."
+msgstr "Synchronisation des billets %d à %d."
+
+msgid "Entries metadata synchronize done."
+msgstr "La synchronisation des métadonnées des billets a été effectuée."
+
+msgid "Failed to synchronize entries metadata."
+msgstr "Impossible de synchroniser les métadonnées des billets."
+
+msgid "Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables."
+msgstr "La synchronisation des métadonnées des billets peut être utile après l'import de contenu dans votre blog ou après une mauvaise opération sur la base de données."
+
 msgid "Delete all logs"
 msgstr "Supprimer tous les journaux (logs)"
@@ -1298,4 +1346,7 @@
 msgstr "Impossible de supprimer les journaux."
 
+msgid "Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time."
+msgstr "Sauf si vous avez un besoin précis de conservation des activités de connexion sur votre blog, pensez à vider régulièrement la table des journaux : elle contient l'enregistrement de chaque connexion à l'administration et des opérations qui s'y sont déroulées."
+
 msgid "optimize tables"
 msgstr "Optimiser les tables"
@@ -1307,10 +1358,19 @@
 msgstr "Impossible d'optimiser les tables."
 
+msgid "After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export."
+msgstr "Au fur at à mesure des suppressions ou modifications dans vos billets, les tables de la base de données se fragmentent. L'opération d'optimisation permet de compacter celles-ci. Cette opération n'a aucun impact sur l'intégrité de vos données. Il est fortement conseillé d'optimiser la base de données avant tout export de blog."
+
 msgid "Download media folder of current blog"
 msgstr "Télécharger la médiathèque du blog courant"
 
+msgid "It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big."
+msgstr "Il peut être utile de sauvegarder votre médiathèque. Ceci comprime tout le contenu du répertoire de média dans un seul fichier Zip. Remarque : chez certains hébergeurs, la médiathèque ne peut pas être compressée avec ce plugin si elle est trop grande."
+
 msgid "Download active theme of current blog"
 msgstr "Télécharger le theme actif du blog courant"
 
+msgid "It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file."
+msgstr "Il peut être utile de sauvegarder le thème courant avant tout changement ou mise à jour. Ceci comprime tout le contenu du répertoire du thème dans un seul fichier Zip."
+
 msgid "Every week"
 msgstr "Chaque semaine"
@@ -1365,7 +1425,13 @@
 msgstr "Périodicité"
 
+msgid "Use one recall time for all tasks"
+msgstr "Utiliser le même délai de rappel pour toutes les tâches"
+
 msgid "Recall time for all tasks:"
 msgstr "Délai de rappel pour toutes les tâches :"
 
+msgid "Use one recall time per task"
+msgstr "Utiliser un délai de rappel différent pour chaque tâche"
+
 msgid "Recall time per task:"
 msgstr "Délai de rappel par tâche :"
Index: plugins/buildtools/_admin.php
===================================================================
--- plugins/buildtools/_admin.php	(revision 1977)
+++ plugins/buildtools/_admin.php	(revision 2044)
@@ -11,10 +11,10 @@
 # -- END LICENSE BLOCK -----------------------------------------
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
-$core->addBehavior('dcMaintenanceRegister', array('dcBuildTools', 'maintenanceAdmin'));
+$core->addBehavior('dcMaintenanceInit', array('dcBuildTools', 'maintenanceAdmin'));
 
 class dcBuildTools
 {
-	public static function maintenanceAdmin($core, $tasks, $groups, $tabs) {
-		$tasks[] = 'dcMaintenanceBuildtools';
+	public static function maintenanceAdmin($maintenance) {
+		$maintenance->addTask('dcMaintenanceBuildtools');
 	}
 }
Index: plugins/buildtools/class.dc.maintenance.buildtools.php
===================================================================
--- plugins/buildtools/class.dc.maintenance.buildtools.php	(revision 1978)
+++ plugins/buildtools/class.dc.maintenance.buildtools.php	(revision 2044)
@@ -4,5 +4,6 @@
 class dcMaintenanceBuildtools extends dcMaintenanceTask
 {
-	protected $group = 'other';
+	protected $tab = 'dev';
+	protected $group = 'l10n';
 
 	protected function init()
@@ -11,4 +12,5 @@
 		$this->success 		= __('fake l10n file generated.');
 		$this->error 		= __('Failed to generate fake l10n file.');
+		$this->description	= __('Generate a php file that contents strings to translate that are not be done with core tools.');
 	}
 
Index: plugins/importExport/_admin.php
===================================================================
--- plugins/importExport/_admin.php	(revision 840)
+++ plugins/importExport/_admin.php	(revision 2044)
@@ -33,3 +33,12 @@
 	));
 }
-?>
+
+$core->addBehavior('dcMaintenanceInit', 'ieMaintenanceInit');
+
+function ieMaintenanceInit($maintenance)
+{
+	$maintenance
+	->addTask('ieMaintenanceExportblog')
+	->addTask('ieMaintenanceExportfull')
+	;
+}
Index: plugins/importExport/_prepend.php
===================================================================
--- plugins/importExport/_prepend.php	(revision 1955)
+++ plugins/importExport/_prepend.php	(revision 2044)
@@ -45,11 +45,2 @@
 $__autoload['ieMaintenanceExportblog'] = dirname(__FILE__).'/inc/lib.ie.maintenance.php';
 $__autoload['ieMaintenanceExportfull'] = dirname(__FILE__).'/inc/lib.ie.maintenance.php';
-
-$this->core->addBehavior('dcMaintenanceRegister', 'ieMaintenanceRegister');
-
-function ieMaintenanceRegister($core, $tasks, $groups, $tabs)
-{
-	$tasks[] = 'ieMaintenanceExportblog';
-	$tasks[] = 'ieMaintenanceExportfull';
-}
-?>
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 1989)
+++ plugins/maintenance/_admin.php	(revision 2044)
@@ -22,5 +22,5 @@
 
 // Admin behaviors
-$core->addBehavior('dcMaintenanceRegister', array('dcMaintenanceAdmin', 'dcMaintenanceRegister'));
+$core->addBehavior('dcMaintenanceInit', array('dcMaintenanceAdmin', 'dcMaintenanceInit'));
 $core->addBehavior('adminDashboardFavs', array('dcMaintenanceAdmin', 'adminDashboardFavs'));
 $core->addBehavior('adminDashboardFavsIcon', array('dcMaintenanceAdmin', 'adminDashboardFavsIcon'));
@@ -28,4 +28,5 @@
 $core->addBehavior('adminDashboardOptionsForm',	array('dcMaintenanceAdmin',	'adminDashboardOptionsForm'));
 $core->addBehavior('adminAfterDashboardOptionsUpdate',	array('dcMaintenanceAdmin',	'adminAfterDashboardOptionsUpdate'));
+$core->addBehavior('adminPageHelpBlock',	array('dcMaintenanceAdmin',	'adminPageHelpBlock'));
 
 /**
@@ -41,29 +42,32 @@
 	 * Register default tasks.
 	 *
-	 * @param	$core	<b>dcCore</b>	dcCore instance
-	 * @param	$tasks	<b>arrayObject</b>	Array of tasks to register
-	 * @param	$groups	<b>arrayObject</b>	Array of groups to register
-	 * @param	$tabs	<b>arrayObject</b>	Array of tabs to register
-	 */
-	 public static function dcMaintenanceRegister($core, $tasks, $groups, $tabs)
-	{
-		$tabs['maintenance'] = __('Servicing');
-		$tabs['backup'] = __('Backup');
-
-		$groups['optimize'] = __('Optimize');
-		$groups['index'] = __('Count and index');
-		$groups['purge'] = __('Purge');
-		$groups['other'] = __('Other');
-		$groups['zipblog'] = __('Compressed file for current blog');
-		$groups['zipfull'] = __('Compressed file for all blogs');
-
-		$tasks[] = 'dcMaintenanceCache';
-		$tasks[] = 'dcMaintenanceIndexposts';
-		$tasks[] = 'dcMaintenanceIndexcomments';
-		$tasks[] = 'dcMaintenanceCountcomments';
-		$tasks[] = 'dcMaintenanceLogs';
-		$tasks[] = 'dcMaintenanceVacuum';
-		$tasks[] = 'dcMaintenanceZipmedia';
-		$tasks[] = 'dcMaintenanceZiptheme';
+	 * @param	$maintenance	<b>dcMaintenance</b>	dcMaintenance instance
+	 */
+	 public static function dcMaintenanceInit($maintenance)
+	{
+		$maintenance
+		->addTab('maintenance', __('Servicing'), array('summary' => __('Tools to maintain the performance of your blogs.')))
+		->addTab('backup', __('Backup'), array('summary' => __('Tools to back up your content.')))
+		->addTab('dev', __('Development'), array('summary' => __('Tools to assist in development of plugins, themes and core.')))
+
+		->addGroup('optimize', __('Optimize'))
+		->addGroup('index', __('Count and index'))
+		->addGroup('purge', __('Purge'))
+		->addGroup('other', __('Other'))
+		->addGroup('zipblog', __('Compressed file for current blog'))
+		->addGroup('zipfull', __('Compressed file for all blogs'))
+
+		->addGroup('l10n', __('Translations'), array('summary' => __('Maintain translations')))
+
+		->addTask('dcMaintenanceCache')
+		->addTask('dcMaintenanceIndexposts')
+		->addTask('dcMaintenanceIndexcomments')
+		->addTask('dcMaintenanceCountcomments')
+		->addTask('dcMaintenanceSynchpostsmeta')
+		->addTask('dcMaintenanceLogs')
+		->addTask('dcMaintenanceVacuum')
+		->addTask('dcMaintenanceZipmedia')
+		->addTask('dcMaintenanceZiptheme')
+		;
 	}
 
@@ -218,3 +222,74 @@
 		$core->auth->user_prefs->maintenance->put('dashboard_item', !empty($_POST['maintenance_dashboard_item']), 'boolean');
 	}
+
+
+	/**
+	 * Build a well sorted help for tasks.
+	 *
+	 * This method is not so good if used with lot of tranlsations 
+	 * as it grows memory usage and translations files size, 
+	 * it is better to use help ressource files 
+	 * but keep it for exemple of how to use behavior adminPageHelpBlock.
+	 * Cheers, JC
+	 *
+	 * @param	$block	<b>arrayObject</b>	Called helpblocks
+	 */
+	public static function adminPageHelpBlock($blocks)
+	{
+		$found = false;
+		foreach($blocks as $block) {
+			if ($block == 'maintenancetasks') {
+				$found = true;
+				break;
+			}
+		}
+		if (!$found) {
+			return null;
+		}
+
+		$maintenance = new dcMaintenance($GLOBALS['core']);
+
+		$res_tab = '';
+		foreach($maintenance->getTabs() as $tab_obj)
+		{
+			$res_group = '';
+			foreach($maintenance->getGroups() as $group_obj)
+			{
+				$res_task = '';
+				foreach($maintenance->getTasks() as $t)
+				{
+					if ($t->group() != $group_obj->id() 
+					 || $t->tab() != $tab_obj->id()) {
+						continue;
+					}
+					if (($desc = $t->description()) != '') {
+						$res_task .= 
+						'<dt>'.$t->task().'</dt>'.
+						'<dd>'.$desc.'</dd>';
+					}
+				}
+				if (!empty($res_task)) {
+					$desc = $group_obj->description ? $group_obj->description : $group_obj->summary;
+
+					$res_group .= 
+					'<h5>'.$group_obj->name().'</h5>'.
+					($desc ? '<p>'.$desc.'</p>' : '').
+					'<dl>'.$res_task.'</dl>';
+				}
+			}
+			if (!empty($res_group)) {
+				$desc = $tab_obj->description ? $tab_obj->description : $tab_obj->summary;
+
+				$res_tab .= 
+				'<h4>'.$tab_obj->name().'</h4>'.
+				($desc ? '<p>'.$desc.'</p>' : '').
+				$res_group;
+			}
+		}
+		if (!empty($res_tab)) {
+			$res = new ArrayObject();
+			$res->content = $res_tab;
+			$blocks[] = $res;
+		}
+	}
 }
Index: plugins/maintenance/_prepend.php
===================================================================
--- plugins/maintenance/_prepend.php	(revision 1955)
+++ plugins/maintenance/_prepend.php	(revision 2044)
@@ -15,6 +15,8 @@
 
 $__autoload['dcMaintenance'] = dirname(__FILE__).'/inc/class.dc.maintenance.php';
+$__autoload['dcMaintenanceDescriptor'] = dirname(__FILE__).'/inc/class.dc.maintenance.descriptor.php';
 $__autoload['dcMaintenanceTask'] = dirname(__FILE__).'/inc/class.dc.maintenance.task.php';
 $__autoload['dcMaintenanceRest'] = dirname(__FILE__).'/_services.php';
+
 
 $__autoload['dcMaintenanceCache'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.cache.php';
@@ -22,4 +24,5 @@
 $__autoload['dcMaintenanceIndexcomments'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.indexcomments.php';
 $__autoload['dcMaintenanceIndexposts'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.indexposts.php';
+$__autoload['dcMaintenanceSynchpostsmeta'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.synchpostsmeta.php';
 $__autoload['dcMaintenanceLogs'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.logs.php';
 $__autoload['dcMaintenanceVacuum'] = dirname(__FILE__).'/inc/tasks/class.dc.maintenance.vacuum.php';
Index: plugins/maintenance/inc/class.dc.maintenance.descriptor.php
===================================================================
--- plugins/maintenance/inc/class.dc.maintenance.descriptor.php	(revision 2044)
+++ plugins/maintenance/inc/class.dc.maintenance.descriptor.php	(revision 2044)
@@ -0,0 +1,86 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+if (!defined('DC_RC_PATH')) { return; }
+
+/**
+@ingroup PLUGIN_MAINTENANCE
+@nosubgrouping
+@brief Simple descriptor for tabs, groups and more
+
+At this time this class is used in same way an arrayObject 
+but in futur it could be completed with advance methods.
+*/
+class dcMaintenanceDescriptor
+{
+	protected $id;
+	protected $name;
+	protected $options;
+
+	/**
+	 * Constructor (really ?!).
+	 *
+	 * @param	id		<b>string<b> Tab ID
+	 * @param	name	<b>string<b> Tab name
+	 * @param	options	<b>string<b> Options
+	 */
+	public function __construct($id, $name, $options=array())
+	{
+		$this->id = (string) $id;
+		$this->name = (string) $name;
+		$this->options = (array) $options;
+	}
+
+	/**
+	 * Get ID.
+	 *
+	 * @return <b>string</b>	ID
+	 */
+	public function id()
+	{
+		return $this->id;
+	}
+
+	/**
+	 * Get name.
+	 *
+	 * @return <b>string</b>	Name
+	 */
+	public function name()
+	{
+		return $this->name;
+	}
+
+	/**
+	 * Get option.
+	 *
+	 * Option called "summary" and "description" are used.
+	 *
+	 * @param	key		<b>string<b> Option key
+	 * @return <b>string</b>	Option value
+	 */
+	public function option($key)
+	{
+		return isset($this->options[$key]) ? $this->options[$key] : null;
+	}
+
+	/* @ignore */
+	public function __get($key)
+	{
+		return $this->option($key);
+	}
+
+	/* @ignore */
+	public function __isset($key)
+	{
+		return isset($this->options[$key]);
+	}
+}
Index: plugins/maintenance/inc/class.dc.maintenance.php
===================================================================
--- plugins/maintenance/inc/class.dc.maintenance.php	(revision 1989)
+++ plugins/maintenance/inc/class.dc.maintenance.php	(revision 2044)
@@ -26,4 +26,6 @@
 {
 	public $core;
+	public $p_url = 'plugin.php?p=maintenance';
+
 	private $tasks = array();
 	private $tabs = array();
@@ -34,6 +36,4 @@
 	 * Constructor.
 	 *
-	 * Here you register tasks and groups for tasks.
-	 *
 	 * @param	core	<b>dcCore</b>	dcCore instance
 	 */
@@ -41,65 +41,43 @@
 	{
 		$this->core = $core;
-
-		$tasks = new ArrayObject();
-		$tabs = new ArrayObject();
-		$groups = new ArrayObject();
 		$logs = $this->getLogs();
-
-		# --BEHAVIOR-- dcMaintenanceRegister
-		$core->callBehavior('dcMaintenanceRegister', $core, $tasks, $groups, $tabs);
-
-		$this->init($tasks, $groups, $tabs);
-	}
-
-	/**
-	 * Initialize list of groups and tasks.
-	 *
-	 * @param	tasks	<b>arrayObject</b>	Array of task to register
-	 * @param	groups	<b>arrayObject</b>	Array of groups to add
-	 * @param	tabs	<b>arrayObject</b>	Array of tabs to add
-	 */
-	public function init($tasks, $groups, $tabs)
-	{
-		$this->tasks = $this->groups = array();
-
-		foreach($tasks as $task)
-		{
-			if (!class_exists($task)) {
-				continue;
-			}
-
-			$r = new ReflectionClass($task);
-			$p = $r->getParentClass();
-
-			if (!$p || $p->name != 'dcMaintenanceTask') {
-				continue;
-			}
-
-			if (($t = new $task($this, 'plugin.php?p=maintenance')) === null
-			|| $t->perm() === null && !$this->core->auth->isSuperAdmin()
-			|| !$this->core->auth->check($t->perm(), $this->core->blog->id)) {
-				continue;
-			}
-
-			$this->tasks[$task] = $t;
-		}
-
-		foreach($groups as $id => $name)
-		{
-			$this->groups[(string) $id] = (string) $name;
-		}
-
-		foreach($tabs as $id => $name)
-		{
-			$this->tabs[(string) $id] = (string) $name;
-		}
-	}
-
-	/**
-	 * Get a tab name.
+		$this->init();
+	}
+
+	/**
+	 * Initialize list of tabs and groups and tasks.
+	 *
+	 * To register a tab or group or task, 
+	 * use behavior dcMaintenanceInit then a method of
+	 * dcMaintenance like addTab('myTab', ...).
+	 */
+	protected function init()
+	{
+		# --BEHAVIOR-- dcMaintenanceInit
+		$this->core->callBehavior('dcMaintenanceInit', $this);
+	}
+
+	/// @name Tab methods
+	//@{
+	/**
+	 * Add a tab.
+	 *
+	 * @param	id		<b>string<b> Tab ID
+	 * @param	name	<b>string<b> Tab name
+	 * @param	options	<b>string<b> Options
+	 * @return <b>dcMaintenance</b>	Self
+	 */
+	public function addTab($id, $name, $options=array())
+	{
+		$this->tabs[$id] = new dcMaintenanceDescriptor($id, $name, $options);
+
+		return $this;
+	}
+
+	/**
+	 * Get a tab.
 	 *
 	 * @param	id	<b>string</b> Tab ID
-	 * @return	<b>mixed</b> tab name or null if not exists
+	 * @return	<b>object</b> dcMaintenanceDescriptor of a tab
 	 */
 	public function getTab($id)
@@ -117,10 +95,29 @@
 		return $this->tabs;
 	}
-
-	/**
-	 * Get a group name.
+	//@}
+
+
+	/// @name Group methods
+	//@{
+	/**
+	 * Add a group.
+	 *
+	 * @param	id		<b>string<b> Group ID
+	 * @param	name	<b>string<b> Group name
+	 * @param	options	<b>string<b> Options
+	 * @return <b>dcMaintenance</b>	Self
+	 */
+	public function addGroup($id, $name, $options=array())
+	{
+		$this->groups[$id] = new dcMaintenanceDescriptor($id, $name, $options);
+
+		return $this;
+	}
+
+	/**
+	 * Get a group.
 	 *
 	 * @param	id	<b>string</b> Group ID
-	 * @return	<b>mixed</b> Group name or null if not exists
+	 * @return	<b>object</b> dcMaintenanceDescriptor of a group
 	 */
 	public function getGroup($id)
@@ -132,9 +129,29 @@
 	 * Get groups.
 	 *
-	 * @return	<b>array</b> Array of groups ID and name
+	 * @return	<b>array</b> Array of groups ID and descriptor
 	 */
 	public function getGroups()
 	{
 		return $this->groups;
+	}
+	//@}
+
+
+	/// @name Task methods
+	//@{
+	/**
+	 * Add a task.
+	 *
+	 * @param	task <b>mixed<b> Class name or object
+	 * @return	<b>boolean</b>	True if it is added
+	 * @return <b>dcMaintenance</b>	Self
+	 */
+	public function addTask($task)
+	{
+		if (class_exists($task) && is_subclass_of($task, 'dcMaintenanceTask')) {
+			$this->tasks[$task] = new $task($this);
+		}
+
+		return $this;
 	}
 
@@ -174,5 +191,9 @@
 		return $res;
 	}
-
+	//@}
+
+
+	/// @name Log methods
+	//@{
 	/**
 	 * Set log for a task.
@@ -268,3 +289,4 @@
 		return $this->logs;
 	}
+	//@}
 }
Index: plugins/maintenance/inc/class.dc.maintenance.task.php
===================================================================
--- plugins/maintenance/inc/class.dc.maintenance.task.php	(revision 1989)
+++ plugins/maintenance/inc/class.dc.maintenance.task.php	(revision 2044)
@@ -33,4 +33,5 @@
 	protected $id;
 	protected $name;
+	protected $description;
 	protected $tab = 'maintenance';
 	protected $group = 'other';
@@ -50,5 +51,5 @@
 	 * @param	p_url	<b>string</b>	Maintenance plugin url
 	 */
-	public function __construct($maintenance, $p_url)
+	public function __construct($maintenance)
 	{
 		$this->maintenance = $maintenance;
@@ -61,5 +62,5 @@
 		}
 
-		$this->p_url = $p_url;
+		$this->p_url = $maintenance->p_url;
 		$this->id = get_class($this);
 
@@ -191,4 +192,14 @@
 
 	/**
+	 * Get task description.
+	 *
+	 * @return	<b>string</b>	Description
+	 */
+	public function description()
+	{
+		return $this->description;
+	}
+
+	/**
 	 * Get task tab.
 	 *
@@ -322,3 +333,8 @@
 		$this->maintenance->setLog($this->id);
 	}
+
+	public function help()
+	{
+		return null;
+	}
 }
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.cache.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.cache.php	(revision 1925)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.cache.php	(revision 2044)
@@ -21,4 +21,6 @@
 		$this->success 		= __('Templates cache directory emptied.');
 		$this->error 		= __('Failed to empty templates cache directory.');
+
+		$this->description = __("It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating a theme or plugin). Notice : with some hosters, the templates cache cannot be emptied with this plugin. You may then have to delete the directory <strong>/cbtpl/</strong> directly on the server with your FTP software.");
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.countcomments.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.countcomments.php	(revision 1984)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.countcomments.php	(revision 2044)
@@ -21,4 +21,6 @@
 		$this->success 		= __('Comments and trackback counted.');
 		$this->error 		= __('Failed to count comments and trackbacks.');
+
+		$this->description = __('Count again comments and trackbacks allows to check their exact numbers. This operation can be useful when importing from another blog platform (or when migrating from dotclear 1 to dotclear 2).');
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.indexcomments.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.indexcomments.php	(revision 1989)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.indexcomments.php	(revision 2044)
@@ -27,4 +27,6 @@
 		$this->success 		= __('Comments index done.');
 		$this->error 		= __('Failed to index comments.');
+
+		$this->description = __('Index all comments and trackbacks in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.');
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.indexposts.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.indexposts.php	(revision 1989)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.indexposts.php	(revision 2044)
@@ -27,4 +27,6 @@
 		$this->success 		= __('Entries index done.');
 		$this->error 		= __('Failed to index entries.');
+
+		$this->description = __('Index all entries in search engine index. This operation is necessary, after importing content in your blog, to use internal search engine, on public and private pages.');
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php	(revision 1925)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.logs.php	(revision 2044)
@@ -21,4 +21,6 @@
 		$this->success 		= __('Logs deleted.');
 		$this->error 		= __('Failed to delete logs.');
+
+		$this->description = __('Logs record all activity and connection to your blog history. Unless you need to keep this history, consider deleting these logs from time to time.');
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.synchpostsmeta.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.synchpostsmeta.php	(revision 2044)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.synchpostsmeta.php	(revision 2044)
@@ -0,0 +1,83 @@
+<?php
+# -- BEGIN LICENSE BLOCK ---------------------------------------
+#
+# This file is part of Dotclear 2.
+#
+# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
+# Licensed under the GPL version 2.0 license.
+# See LICENSE file or
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+#
+# -- END LICENSE BLOCK -----------------------------------------
+if (!defined('DC_RC_PATH')) { return; }
+
+class dcMaintenanceSynchpostsmeta extends dcMaintenanceTask
+{
+	protected $ajax = true;
+	protected $group = 'index';
+	protected $limit = 100;
+	protected $step_task;
+
+	protected function init()
+	{
+		$this->name 		= __('Entries metadata');
+		$this->task 		= __('Synchronize entries metadata');
+		$this->step_task	= __('Next');
+		$this->step 		= __('Synchronize entry %d to %d.');
+		$this->success 		= __('Entries metadata synchronize done.');
+		$this->error 		= __('Failed to synchronize entries metadata.');
+
+		$this->description = __('Synchronize all entries metadata could be useful after importing content in your blog or do bad operation on database tables.');
+	}
+
+	public function execute()
+	{
+		$this->code = $this->synchronizeAllPostsmeta($this->code, $this->limit);
+
+		return $this->code ? $this->code : true;
+	}
+
+	public function task()
+	{
+		return $this->code ? $this->step_task : $this->task;
+	}
+
+	public function step()
+	{
+		return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : null;
+	}
+
+	public function success()
+	{
+		return $this->code ? sprintf($this->step, $this->code - $this->limit, $this->code) : $this->success;
+	}
+
+	protected function synchronizeAllPostsmeta($start=null,$limit=null)
+	{
+		// Get number of posts
+		$rs = $this->core->con->select('SELECT COUNT(post_id) FROM '.$this->core->prefix.'post');
+		$count = $rs->f(0);
+
+		// Get posts ids to update
+		$req_limit = $start !== null && $limit !== null ? $this->core->con->limit($start, $limit) : '';
+		$rs = $this->core->con->select('SELECT post_id FROM '.$this->core->prefix.'post '.$req_limit, true);
+
+		// Update posts meta
+		while ($rs->fetch()) {
+			$rs_meta = $this->core->con->select('SELECT meta_id, meta_type FROM '.$this->core->prefix.'meta WHERE post_id = '.$rs->post_id.' ');
+
+			$meta = array();
+			while ($rs_meta->fetch()) {
+				$meta[$rs_meta->meta_type][] = $rs_meta->meta_id;
+			}
+
+			$cur = $this->core->con->openCursor($this->core->prefix.'post');
+			$cur->post_meta = serialize($meta);
+			$cur->update('WHERE post_id = '.$rs->post_id);
+		}
+		$this->core->blog->triggerBlog();
+
+		// Return next step
+		return $start + $limit > $count ? null : $start + $limit;
+	}
+}
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.vacuum.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.vacuum.php	(revision 1984)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.vacuum.php	(revision 2044)
@@ -18,7 +18,10 @@
 	protected function init()
 	{
+		$this->name			= __('Optimise database');
 		$this->task 		= __('optimize tables');
 		$this->success 		= __('Optimization successful.');
 		$this->error 		= __('Failed to optimize tables.');
+
+		$this->description = __("After numerous delete or update operations on Dotclear's database, it gets fragmented. Optimizing will allow to defragment it. It has no incidence on your data's integrity. It is recommended to optimize before any blog export.");
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.zipmedia.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.zipmedia.php	(revision 1989)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.zipmedia.php	(revision 2044)
@@ -22,4 +22,6 @@
 	{
 		$this->task = __('Download media folder of current blog');
+
+		$this->description = __('It may be useful to backup your media folder. This compress all content of media folder into a single zip file. Notice : with some hosters, the media folder cannot be compressed with this plugin if it is too big.');
 	}
 
Index: plugins/maintenance/inc/tasks/class.dc.maintenance.ziptheme.php
===================================================================
--- plugins/maintenance/inc/tasks/class.dc.maintenance.ziptheme.php	(revision 1989)
+++ plugins/maintenance/inc/tasks/class.dc.maintenance.ziptheme.php	(revision 2044)
@@ -22,4 +22,6 @@
 	{
 		$this->task = __('Download active theme of current blog');
+
+		$this->description = __('It may be useful to backup the active theme before any change or update. This compress theme folder into a single zip file.');
 	}
 
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 2032)
+++ plugins/maintenance/index.php	(revision 2044)
@@ -43,9 +43,9 @@
 
 		foreach($tasks as $t) {
-			if (!empty($_POST['settings_recall_time']) && $_POST['settings_recall_time'] == 'seperate') {
-				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
+			if (!empty($_POST['settings_recall_all'])) {
+				$ts = $_POST['settings_recall_time'];
 			}
 			else {
-				$ts = $_POST['settings_recall_time'];
+				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
 			}
 			$core->blog->settings->maintenance->put(
@@ -99,4 +99,5 @@
 
 $combo_ts = array(
+	__('Never') 			=> 0,
 	__('Every week') 		=> 604800,
 	__('Every two weeks') 	=> 1209600,
@@ -105,14 +106,4 @@
 );
 
-$full_combo_ts = array_merge(array(
-	__('Use different periods for each task') => 'seperate'), 
-	$combo_ts
-);
-
-$task_combo_ts = array_merge(array(
-	__('Never') => 0), 
-	$combo_ts
-);
-
 // Display page
 
@@ -120,5 +111,5 @@
 <title>'.__('Maintenance').'</title>'.
 dcPage::jsPageTabs($tab).
-dcPage::jsLoad('index.php?pf=maintenance/js/settings.js');;
+dcPage::jsLoad('index.php?pf=maintenance/js/settings.js');
 
 if ($task && $task->ajax()) {
@@ -142,6 +133,5 @@
 		array(
 			__('Plugins') => '',
-			'<a href="'.$p_url.'">'.__('Maintenance').'</a>' => '',
-			'<span class="page-title">'.html::escapeHTML($task->name()).'</span>' => ''
+			'<span class="page-title">'.__('Maintenance').'</span>' => ''
 		)
 	).
@@ -211,17 +201,18 @@
 	// Simple task (with only a button to start it)
 
-	foreach($maintenance->getTabs() as $tab_id => $tab_name)
+	foreach($maintenance->getTabs() as $tab_obj)
 	{
 		$res_group = '';
-		foreach($maintenance->getGroups() as $group_id => $group_name)
+		foreach($maintenance->getGroups() as $group_obj)
 		{
 			$res_task = '';
 			foreach($tasks as $t)
 			{
-				if ($t->group() != $group_id || $t->tab() != $tab_id) {
+				if ($t->group() != $group_obj->id() 
+				 || $t->tab() != $tab_obj->id()) {
 					continue;
 				}
 
-				$res_task .=  
+				$res_task .= 
 				'<p>'.form::radio(array('task', $t->id()), $t->id()).' '.
 				'<label class="classic" for="'.$t->id().'">'.
@@ -254,5 +245,5 @@
 				$res_group .= 
 				'<div class="fieldset">'.
-				'<h4 id="'.$group_id.'">'.$group_name.'</h4>'.
+				'<h4 id="'.$group_obj->id().'">'.$group_obj->name().'</h4>'.
 				$res_task.
 				'</div>';
@@ -262,10 +253,11 @@
 		if (!empty($res_group)) {
 			echo 
-			'<div id="'.$tab_id.'" class="multi-part" title="'.$tab_name.'">'.
-			'<h3>'.$tab_name.'</h3>'.
+			'<div id="'.$tab_obj->id().'" class="multi-part" title="'.$tab_obj->name().'">'.
+			'<h3>'.$tab_obj->name().'</h3>'.
+			// ($tab_obj->option('summary') ? '<p>'.$tab_obj->option('summary').'</p>' : '').
 			'<form action="'.$p_url.'" method="post">'.
 			$res_group.
 			'<p><input type="submit" value="'.__('Execute task').'" /> '.
-			form::hidden(array('tab'), $tab_id).
+			form::hidden(array('tab'), $tab_obj->id()).
 			$core->formNonce().'</p>'.
 			'<p class="form-note info">'.__('This may take a very long time.').'</p>'.
@@ -315,9 +307,15 @@
 	'<h4 class="pretty-title">'.__('Frequency').'</h4>'.
 
+	'<p>'.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '.
+	'<label class="classic" for="settings_recall_all">'.
+	__('Use one recall time for all tasks').'</label>'.
+
 	'<p><label for="settings_recall_time">'.__('Recall time for all tasks:').'</label>'.
-	form::combo('settings_recall_time', $full_combo_ts, 'seperate', 'recall-for-all').
+	form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all').
 	'</p>'.
 
-	'<h5 class="vertical-separator">'.__('Recall time per task:').'</h5>';
+	'<p>'.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '.
+	'<label class="classic" for="settings_recall_separate">'.
+	__('Use one recall time per task').'</label>';
 
 	foreach($tasks as $t)
@@ -327,5 +325,5 @@
 
 		'<p><label for="settings_ts_'.$t->id().'">'.$t->task().'</label>'.
-		form::combo('settings_ts_'.$t->id(), $task_combo_ts, $t->ts(), 'recall-per-task').
+		form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task').
 		'</p>'.
 
@@ -342,5 +340,5 @@
 }
 
-dcPage::helpBlock('maintenance');
+dcPage::helpBlock('maintenance', 'maintenancetasks');
 
 echo '</body></html>';
Index: plugins/maintenance/js/settings.js
===================================================================
--- plugins/maintenance/js/settings.js	(revision 1984)
+++ plugins/maintenance/js/settings.js	(revision 2044)
@@ -1,10 +1,14 @@
 $(function(){
-
-	$('.recall-for-all').change(function(){
-		var v=$(this).val();
-		if(v=='seperate'){
+$('.recall-for-all').attr('disabled','disabled');
+	$('#settings_recall_all').change(function(){
+		if($(this).attr('selected')!='selected'){
+			$('.recall-per-task').attr('disabled','disabled');
+			$('.recall-for-all').removeAttr('disabled');
+		}
+	});
+	$('#settings_recall_separate').change(function(){
+		if($(this).attr('selected')!='selected'){
 			$('.recall-per-task').removeAttr('disabled');
-		}else{
-			$('.recall-per-task').attr('disabled','disabled');
+			$('.recall-for-all').attr('disabled','disabled');
 		}
 	});
Index: plugins/maintenance/locales/en/help/maintenance.html
===================================================================
--- plugins/maintenance/locales/en/help/maintenance.html	(revision 1802)
+++ plugins/maintenance/locales/en/help/maintenance.html	(revision 2044)
@@ -6,33 +6,15 @@
 <body>
 
+<h4>Settings</h4>
+
 <dl>
-  <dt>Optimize database room</dt>
-  <dd>After numerous delete or update operations on Dotclear's database, it gets fragmented.
-  Optimizing will allow to defragment it.<br />
-  It has no incidence on your data's integrity.<br />
-  It is recommended to optimize before any blog export.</dd>
+  <dt>Activation</dt>
+  <dd>If this options is active, on tabs of plugin maintenance, 
+  when a task has expired or has been nerver executed, a alert message is show below this task.<br />
+  Options to display maintenance related tasks on dashboard are available in user preferences.</dd>
   
-  <dt>Counters</dt>
-  <dd>Initializing comments and trackbacks counters allows to check their exact numbers. 
-  This operation can be useful when importing from another blog platform
-  (or when migrating from dotclear 1 to dotclear 2).</dd>
-  
-  <dt>Search engine index</dt>
-  <dd>These operations are necessary, after importing content in your blog, to use internal search engine, on public and private pages.
-    <ul>
-      <li><strong>Index all posts:</strong> allows to index all posts</li>
-      <li><strong>Index all comments:</strong> allows to index all comments and trackbacks</li>
-    </ul>
-  </dd>
-  
-  <dt>Vacuum logs</dt>
-  <dd>Logs record all activity and connection to your blog history. Unless you need to keep this history, 
-  consider deleting these logs from time to time.</dd>
-  
-  <dt>Empty templates cache directory</dt>
-  <dd>It may be useful to empty this cache when modifying a theme's .html or .css files (or when updating 
-  a theme or plugin).<br />
-  Notice : with some hosters, the templates cache cannot be emptied with this plugin. 
-  You may then have to delete the directory <strong>/cbtpl/</strong> directly on the server with your FTP software.</dd>
+  <dt>Frequency</dt>
+  <dd>It is possible to set same recall time for all tasks at one time. <br/>
+  Otherwise this setting can be done per task and so on for exemple deactivate some of them.</dd>
 </dl>
 </body>
Index: plugins/maintenance/locales/fr/help/maintenance.html
===================================================================
--- plugins/maintenance/locales/fr/help/maintenance.html	(revision 1956)
+++ plugins/maintenance/locales/fr/help/maintenance.html	(revision 2044)
@@ -6,45 +6,16 @@
 <body>
 
-<h4>Entretien</h4>
+<h4>Paramètres</h4>
 
 <dl>
-  <dt>Optimiser l'espace de la base de données</dt>
-  <dd>Au fur at à mesure des suppressions ou modifications dans vos billets,
-  les tables de la base de données se fragmentent. L'opération d'optimisation
-  permet de compacter celles-ci.<br />
-  Cette opération n'a aucun impact sur l'intégrité de vos données.<br />
-  Il est fortement conseillé d'optimiser la base de données avant tout export
-  de blog.</dd>
+  <dt>Activation</dt>
+  <dd>Si l'option est activé, dans les onglets du plugin maintenance, 
+  lorsqu'une tâche est en retard ou n'a jamais été exécutée, un message s'affiche sous cette tâche.<br />
+  Des options pour permettre l'affichage d'informations relatives à la maintenance sur le tableau de bord 
+  sous disponible dans les préférences de l'utilisateur.</dd>
   
-  <dt>Compteurs</dt>
-  <dd>Réinitialiser les compteurs des commentaires et des rétroliens a pour effet
-  de donner le nombre exact de ceux-ci pour chaque billet. Cette opération peut se
-  révéler utile lors de l'import d'un blog d'une autre plateforme (ou d'une migration
-  de Dotclear 1 vers Dotclear 2).</dd>
-  
-  <dt>Index du moteur de recherche</dt>
-  <dd>Ces opérations s'effectuent généralement suite à un import afin d'obtenir
-  des résultats lors des recherches, aussi bien depuis l'administration du blog
-  qu'en partie publique.
-    <ul>
-      <li><strong>Indexer tous les billets&nbsp;:</strong> permet d'indexer les billets.</li>
-      <li><strong>Indexer tous les commentaires&nbsp;:</strong> permet d'indexer les commentaires.</li>
-    </ul>
-  </dd>
-  
-  <dt>Vider les journaux</dt>
-  <dd>Sauf si vous avez un besoin précis de conservation des activités de
-  connexion sur votre blog, pensez à vider régulièrement la table des journaux&nbsp;:
-  elle contient l'enregistrement de chaque connexion à l'administration et des
-  opérations qui s'y sont déroulées.</dd>
-  
-  <dt>Vider le répertoire du cache des templates</dt>
-  <dd>La suppression du répertoire du cache des templates peut se révéler
-  nécessaire lors de modifications dans les fichiers .html ou .css d'un thème
-  (voire lors d'un changement de thème ou de mise à jour de plugin).<br />
-  Attention : chez certains hébergeurs (Free par exemple), le cache du répertoire
-  des templates ne peut pas être vidé grâce à l'extension Maintenance, il faut
-  supprimer le répertoire <strong>cbtpl</strong> situé dans le répertoire cache
-  (dotclear/cache par défaut) avec un logiciel FTP.</dd>
+  <dt>Périodicité</dt>
+  <dd>Il est possible de règler le délai de rappel des tâche à exécuter à l'identique pour toutes les tâches. <br/>
+  Sinon ce réglage peut se faire tâche par tâche et ainsi permettre par exemple de n'en désactiver que certaines.</dd>
 </dl>
 </body>
