Index: plugins/aboutConfig/_define.php
===================================================================
--- plugins/aboutConfig/_define.php	(revision 589)
+++ plugins/aboutConfig/_define.php	(revision 270)
@@ -16,5 +16,6 @@
 	/* Description*/		"Manage every blog configuration directive",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'0.4'
+	/* Version */			'0.3',
+	/* Permissions */		null
 );
 ?>
Index: plugins/aboutConfig/index.php
===================================================================
--- plugins/aboutConfig/index.php	(revision 589)
+++ plugins/aboutConfig/index.php	(revision 270)
@@ -11,14 +11,4 @@
 # -- END LICENSE BLOCK -----------------------------------------
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
-
-# Local navigation
-if (!empty($_POST['gs_nav'])) {
-	http::redirect($p_url.$_POST['gs_nav']);
-	exit;
-}
-if (!empty($_POST['ls_nav'])) {
-	http::redirect($p_url.$_POST['ls_nav']);
-	exit;
-}
 
 # Local settings update
@@ -86,5 +76,5 @@
 	return
 	'<tr>'.
-	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
@@ -98,22 +88,6 @@
   <?php echo dcPage::jsPageTabs($part); ?>
   <style type="text/css">
-  table.settings { border: 1px solid #999; margin-bottom: 2em; }
-  table.settings th { background: #f5f5f5; color: #444; padding-top: 0.3em; padding-bottom: 0.3em; }
-  p.anchor-nav {float: right; }
+  .ns-name { background: #dfdfdf; color: #333; padding-top: 0.3em; padding-bottom: 0.3em; font-size: 1.1em; }
   </style>
-	<script type="text/javascript">
-	//<![CDATA[
-	$(function() {
-		$("#gs_submit").hide();
-		$("#ls_submit").hide();
-		$("#gs_nav").change(function() {
-			window.location = $("#gs_nav option:selected").val();
-		})
-		$("#ls_nav").change(function() {
-			window.location = $("#ls_nav option:selected").val();
-		})
-	});
-	//]]>
-	</script>
 </head>
 
@@ -128,22 +102,18 @@
 }
 ?>
-<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; <span class="page-title">about:config</span></h2>
+<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; about:config</h2>
 
 <div id="local" class="multi-part" title="<?php echo __('blog settings'); ?>">
+<form action="plugin.php" method="post">
+<table>
+<tr>
+  <th class="nowrap">Setting ID</th>
+  <th><?php echo __('Value'); ?></th>
+  <th><?php echo __('Type'); ?></th>
+  <th class="maximal"><?php echo __('Description'); ?></th>
+</tr>
+<?php
+$settings = array();
 
-<?php 
-$table_header = '<table class="settings" id="%s"><caption>%s</caption>'.
-'<thead>'.
-'<tr>'."\n".
-'  <th class="nowrap">Setting ID</th>'."\n".
-'  <th>'.__('Value').'</th>'."\n".
-'  <th>'.__('Type').'</th>'."\n".
-'  <th class="maximalx">'.__('Description').'</th>'."\n".
-'</tr>'."\n".
-'</thead>'."\n".
-'<tbody>';
-$table_footer = '</tbody></table>';
-
-$settings = array();
 foreach ($core->blog->settings->dumpNamespaces() as $ns => $namespace) {
 	foreach ($namespace->dumpSettings() as $k => $v) {
@@ -151,35 +121,19 @@
 	}
 }
+
 ksort($settings);
-if (count($settings) > 0) {
-	$ns_combo = array();
-	foreach ($settings as $ns => $s) {
-		$ns_combo[$ns] = '#l_'.$ns;
-	}
-	echo 
-		'<form action="plugin.php" method="post">'.
-		'<p class="anchor-nav">'.
-		'<label for="ls_nav" class="classic">'.__('Goto:').'</label> '.form::combo('ls_nav',$ns_combo).
-		' <input type="submit" value="'.__('Ok').'" id="ls_submit" />'.
-		'<input type="hidden" name="p" value="aboutConfig" />'.
-		$core->formNonce().'</p></form>';
-}
-?>
 
-<form action="plugin.php" method="post">
-
-<?php
 foreach ($settings as $ns => $s)
 {
 	ksort($s);
-	echo sprintf($table_header,'l_'.$ns,$ns);
+	echo '<tr><td colspan="4" class="ns-name">namespace: <strong>'.$ns.'</strong></td></tr>';
+	
 	foreach ($s as $k => $v)
 	{
 		echo settingLine($k,$v,$ns,'s',!$v['global']);
 	}
-	echo $table_footer;
 }
 ?>
-
+</table>
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="aboutConfig" />
@@ -189,5 +143,12 @@
 
 <div id="global" class="multi-part" title="<?php echo __('global settings'); ?>">
-
+<form action="plugin.php" method="post">
+<table>
+<tr>
+  <th class="nowrap">Setting ID</th>
+  <th><?php echo __('Value'); ?></th>
+  <th><?php echo __('Type'); ?></th>
+  <th class="maximal"><?php echo __('Description'); ?></th>
+</tr>
 <?php
 $settings = array();
@@ -201,34 +162,16 @@
 ksort($settings);
 
-if (count($settings) > 0) {
-	$ns_combo = array();
-	foreach ($settings as $ns => $s) {
-		$ns_combo[$ns] = '#g_'.$ns;
-	}
-	echo 
-		'<form action="plugin.php" method="post">'.
-		'<p class="anchor-nav">'.
-		'<label for="gs_nav" class="classic">'.__('Goto:').'</label> '.form::combo('gs_nav',$ns_combo).
-		' <input type="submit" value="'.__('Ok').'" id="gs_submit" />'.
-		'<input type="hidden" name="p" value="aboutConfig" />'.
-		$core->formNonce().'</p></form>';
-}
-?>
-
-<form action="plugin.php" method="post">
-
-<?php
 foreach ($settings as $ns => $s)
 {
 	ksort($s);
-	echo sprintf($table_header,'g_'.$ns,$ns);
+	echo '<tr><td colspan="4" class="ns-name">namespace: <strong>'.$ns.'</strong></td></tr>';
+	
 	foreach ($s as $k => $v)
 	{
 		echo settingLine($k,$v,$ns,'gs',false);
 	}
-	echo $table_footer;
 }
 ?>
-
+</table>
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="aboutConfig" />
Index: plugins/akismet/_define.php
===================================================================
--- plugins/akismet/_define.php	(revision 464)
+++ plugins/akismet/_define.php	(revision 270)
@@ -17,8 +17,6 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	array(
-		'permissions' =>	'usage,contentadmin',
-		'priority' =>		200
-	)
+	/* Permissions */		'usage,contentadmin',
+	/* Priority */			200
 );
 ?>
Index: plugins/akismet/class.dc.filter.akismet.php
===================================================================
--- plugins/akismet/class.dc.filter.akismet.php	(revision 536)
+++ plugins/akismet/class.dc.filter.akismet.php	(revision 270)
@@ -136,5 +136,5 @@
 		
 		$res =
-		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
+		'<form action="'.html::escapeURL($url).'" method="post">'.
 		'<p><label for="ak_key" class="classic">'.__('Akismet API key:').' '.
 		form::field('ak_key',12,128,$ak_key).'</label>';
Index: plugins/antispam/_admin.php
===================================================================
--- plugins/antispam/_admin.php	(revision 324)
+++ plugins/antispam/_admin.php	(revision 270)
@@ -29,5 +29,5 @@
 function antispamDashboardFavs($core,$favs)
 {
-	$favs['antispam'] = new ArrayObject(array('antispam','Antispam','plugin.php?p=antispam',
+	$favs['antispam'] = new ArrayObject(array('antispam',__('Antispam'),'plugin.php?p=antispam',
 		'index.php?pf=antispam/icon.png','index.php?pf=antispam/icon-big.png',
 		'admin',null,null));
Index: plugins/antispam/_define.php
===================================================================
--- plugins/antispam/_define.php	(revision 464)
+++ plugins/antispam/_define.php	(revision 270)
@@ -17,8 +17,6 @@
 	/* Author */			"Alain Vagner",
 	/* Version */			'1.3.1',
-	array(
-		'permissions' =>	'usage,contentadmin',
-		'priority' =>		10
-	)
+	/* Permissions */		'usage,contentadmin',
+	/* Priority */			10
 );
 ?>
Index: plugins/antispam/filters/class.dc.filter.ip.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.ip.php	(revision 536)
+++ plugins/antispam/filters/class.dc.filter.ip.php	(revision 270)
@@ -123,7 +123,8 @@
 		'<div class="multi-part" id="tab_'.$type.'" title="'.$title.'">'.
 
-		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
+		'<form action="'.html::escapeURL($url).'" method="post">'.
+		'<fieldset><legend>'.__('Add an IP address').'</legend><p>'.
 		form::hidden(array('ip_type'),$type).
-		'<label class="classic" for="addip_'.$type.'">'.__('Add an IP address: ').' '.
+		'<label class="classic" for="addip_'.$type.'">'.__('Add an IP address').' '.
 		form::field(array('addip', 'addip_'.$type),18,255).
 		'</label>';
@@ -135,7 +136,6 @@
 		$res .=
 		$core->formNonce().
-		'</p>'.
-		'<p><input type="submit" value="'.__('Add').'"/></p>'.
-		'</form>';
+		'<input type="submit" value="'.__('Add').'"/></p>'.
+		'</fieldset></form>';
 
 		$rs = $this->getRules($type);
@@ -149,5 +149,5 @@
 			$res .=
 			'<form action="'.html::escapeURL($url).'" method="post">'.
-			'<h3>' . __('IP list') . '</h3>'.
+			'<fieldset><legend>' . __('IP list') . '</legend>'.
 			'<div style="'.$this->style_list.'">';
 
@@ -178,5 +178,5 @@
 			form::hidden(array('ip_type'),$type).
 			'</p>'.
-			'</form>';
+			'</fieldset></form>';
 		}
 
Index: plugins/antispam/filters/class.dc.filter.iplookup.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 536)
+++ plugins/antispam/filters/class.dc.filter.iplookup.php	(revision 270)
@@ -86,6 +86,5 @@
 		'<p><label for="bls">'.__('Add here a coma separated list of servers.').
 		form::textarea('bls',40,3,html::escapeHTML($bls),'maximal').
-		'</p>'.
-		'<p><input type="submit" value="'.__('Save').'" /></label></p>'.
+		'<input type="submit" value="'.__('Save').'" /></label></p>'.
 		$this->core->formNonce().'</p>'.
 		'</fieldset>'.
Index: plugins/antispam/filters/class.dc.filter.words.php
===================================================================
--- plugins/antispam/filters/class.dc.filter.words.php	(revision 536)
+++ plugins/antispam/filters/class.dc.filter.words.php	(revision 270)
@@ -119,6 +119,7 @@
 
 		$res .=
-		'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
-		'<p><label class="classic" for="swa">'.__('Add a word ').' '.form::field('swa',20,128).'</label>';
+		'<form action="'.html::escapeURL($url).'" method="post">'.
+		'<fieldset><legend>'.__('Add a word').'</legend>'.
+		'<p><label class="classic" for="swa">'.__('Add a word').' '.form::field('swa',20,128).'</label>';
 
 		if ($core->auth->isSuperAdmin()) {
@@ -129,6 +130,6 @@
 		$res .=
 		$core->formNonce().
-		'</p>'.
-		'<p><input type="submit" value="'.__('Add').'"/></p>'.
+		'<input type="submit" value="'.__('Add').'"/></p>'.
+		'</fieldset>'.
 		'</form>';
 
@@ -141,6 +142,6 @@
 		{
 			$res .=
-			'<form action="'.html::escapeURL($url).'" method="post" class="fieldset">'.
-			'<h3>' . __('List of bad words') . '</h3>'.
+			'<form action="'.html::escapeURL($url).'" method="post">'.
+			'<fieldset><legend>' . __('List') . '</legend>'.
 			'<div style="'.$this->style_list.'">';
 
@@ -166,5 +167,5 @@
 			$core->formNonce().
 			'<input class="submit delete" type="submit" value="' . __('Delete selected words') . '"/></p>'.
-			'</form>';
+			'</fieldset></form>';
 		}
 
Index: plugins/antispam/inc/lib.dc.antispam.php
===================================================================
--- plugins/antispam/inc/lib.dc.antispam.php	(revision 472)
+++ plugins/antispam/inc/lib.dc.antispam.php	(revision 270)
@@ -75,5 +75,5 @@
 		if (($count = self::countSpam($core)) > 0) {
 			$str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
-			$icons['comments'][0] .= '</a> <br /><a href="comments.php?status=-2"><span>'.sprintf($str,$count).'</span>';
+			$icons['comments'][0] .= '</a> <br /><a href="comments.php?status=-2">'.sprintf($str,$count);
 		}
 	}
@@ -83,5 +83,5 @@
 		if (($count = self::countSpam($core)) > 0) {
 			$str = ($count > 1) ? __('(including %d spam comments)') : __('(including %d spam comment)');
-			return '</a> <br /><a href="comments.php?status=-2"><span>'.sprintf($str,$count).'</span>';
+			return '</a> <br /><a href="comments.php?status=-2">'.sprintf($str,$count);
 		} else {
 			return '';
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 565)
+++ plugins/antispam/index.php	(revision 270)
@@ -110,9 +110,10 @@
 <body>
 <?php
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.$page_name.'</h2>';
 
 if ($filter_gui !== false)
 {
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.$p_url.'">'.$page_name.'</a>'.
-		' &rsaquo; <span class="page-title">'.sprintf(__('%s configuration'),$filter->name).'</span></h2>';
+	echo '<p><a href="'.$p_url.'">'.__('Return to filters').'</a></p>';
+	printf('<h3>'.__('%s configuration').'</h3>',$filter->name);
 
 	echo $filter_gui;
@@ -120,6 +121,4 @@
 else
 {
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.$page_name.'</span></h2>';
-
 	# Information
 	$spam_count = dcAntispam::countSpam($core);
@@ -128,6 +127,6 @@
 
 	echo
-	'<form action="'.$p_url.'" method="post" class="fieldset">'.
-	'<h3>'.__('Information').'</h3>';
+	'<form action="'.$p_url.'" method="post">'.
+	'<fieldset><legend>'.__('Information').'</legend>';
 
 	if (!empty($_GET['del'])) {
@@ -151,14 +150,13 @@
 	}
 	if ($moderationTTL != null && $moderationTTL >=0) {
-		echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).' '.
-		__('You can modify this duration in ').
-		'<a href="blog_pref.php"> '.__('Blog preferences').'</a></p>';
-	}
-	echo '</form>';
+		echo '<p>'.sprintf(__('All spam comments older than %s day(s) will be automatically deleted.'), $moderationTTL).'</p>';
+	}
+	echo '</fieldset></form>';
 
 
 	# Filters
 	echo
-	'<form action="'.$p_url.'" method="post" class="fieldset">';
+	'<form action="'.$p_url.'" method="post">'.
+	'<fieldset><legend>'.__('Available spam filters').'</legend>';
 
 	if (!empty($_GET['upd'])) {
@@ -168,5 +166,4 @@
 	echo
 	'<table class="dragable">'.
-	'<caption>'.__('Available spam filters').'</caption>'.
 	'<thead><tr>'.
 	'<th>'.__('Order').'</th>'.
@@ -194,5 +191,5 @@
 		'<td class="nowrap">'.form::checkbox(array('filters_active[]'),$fid,$f->active, '', '', false, 'title="'.__('Active').'"').'</td>'.
 		'<td class="nowrap">'.form::checkbox(array('filters_auto_del[]'),$fid,$f->auto_delete, '', '', false, 'title="'.__('Auto Del.').'"').'</td>'.
-		'<td class="nowrap" scope="raw">'.$f->name.'</td>'.
+		'<td class="nowrap">'.$f->name.'</td>'.
 		'<td class="maximal">'.$f->description.'</td>'.
 		'<td class="status">'.$gui_link.'</td>'.
@@ -205,5 +202,5 @@
 	$core->formNonce().
 	'<input type="submit" name="filters_upd" value="'.__('Save').'" /></p>'.
-	'</form>';
+	'</fieldset></form>';
 
 
@@ -215,9 +212,10 @@
 
 		echo
-		'<h3>'.__('Syndication').'</h3>'.
+		'<fieldset><legend>'.__('Syndication').'</legend>'.
 		'<ul class="spaminfo">'.
 		'<li class="feed"><a href="'.$spam_feed.'">'.__('Junk comments RSS feed').'</a></li>'.
 		'<li class="feed"><a href="'.$ham_feed.'">'.__('Published comments RSS feed').'</a></li>'.
-		'</ul>';
+		'</ul>'.
+		'</fieldset>';
 	}
 }
@@ -226,2 +224,3 @@
 </body>
 </html>
+
Index: plugins/attachments/_admin.php
===================================================================
--- plugins/attachments/_admin.php	(revision 416)
+++ 	(revision )
@@ -1,75 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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_CONTEXT_ADMIN')) { return; }
-
-$core->addBehavior ('adminPostFormSidebar',array('attachmentAdmin','adminPostFormSidebar'));
-$core->addBehavior ('adminPostAfterForm',array('attachmentAdmin','adminPostAfterForm'));
-
-class attachmentAdmin
-{
-	public static function adminPostFormSidebar($post) 
-	{
-		if ($post !== null)
-		{
-			$core =& $GLOBALS['core'];
-			$post_media = $core->media->getPostMedia($post->post_id);
-			echo
-			'<h3 class="clear">'.__('Attachments').'</h3>';
-			foreach ($post_media as $f)
-			{
-				$ftitle = $f->media_title;
-				if (strlen($ftitle) > 18) {
-					$ftitle = substr($ftitle,0,16).'...';
-				}
-				echo
-				'<div class="media-item">'.
-				'<a class="media-icon" href="media_item.php?id='.$f->media_id.'">'.
-				'<img src="'.$f->media_icon.'" alt="" title="'.$f->basename.'" /></a>'.
-				'<ul>'.
-				'<li><a class="media-link" href="media_item.php?id='.$f->media_id.'"'.
-				'title="'.$f->basename.'">'.$ftitle.'</a></li>'.
-				'<li>'.$f->media_dtstr.'</li>'.
-				'<li>'.files::size($f->size).' - '.
-				'<a href="'.$f->file_url.'">'.__('open').'</a>'.'</li>'.
-				
-				'<li class="media-action"><a class="attachment-remove" id="attachment-'.$f->media_id.'" '.
-				'href="post_media.php?post_id='.$post->post_id.'&amp;media_id='.$f->media_id.'&amp;remove=1">'.
-				'<img src="images/check-off.png" alt="'.__('remove').'" /></a>'.
-				'</li>'.
-				
-				'</ul>'.
-				'</div>';
-			}
-			unset($f);
-			
-			if (empty($post_media)) {
-				echo '<p>'.__('No attachment.').'</p>';
-			} else {
-			}
-			echo '<p><a class="button" href="media.php?post_id='.$post->post_id.'">'.__('Add files to this entry').'</a></p>';
-		}
-	}
-	
-	public static function adminPostAfterForm($post) {
-		if ($post !== null)
-		{
-			$core =& $GLOBALS['core'];
-			echo
-				'<form action="post_media.php" id="attachment-remove-hide" method="post">'.
-				'<div>'.form::hidden(array('post_id'),$post->post_id).
-				form::hidden(array('media_id'),'').
-				form::hidden(array('remove'),1).
-				$core->formNonce().'</div></form>';
-		}
-	}
-}
-?>
Index: plugins/attachments/_define.php
===================================================================
--- plugins/attachments/_define.php	(revision 464)
+++ 	(revision )
@@ -1,24 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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; }
-
-$this->registerModule(
-	/* Name */		"attachments",
-	/* Description*/	"Manage post attachments",
-	/* Author */		"Dotclear Team",
-	/* Version */		'1.0',
-	array(
-		'permissions' =>	'contentadmin,pages',
-		'priority' =>		999
-	)
-);
-?>
Index: plugins/attachments/_public.php
===================================================================
--- plugins/attachments/_public.php	(revision 464)
+++ 	(revision )
@@ -1,248 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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; }
-
-# Attachments
-$core->tpl->addBlock('Attachments',array('attachmentTpl','Attachments'));
-$core->tpl->addBlock('AttachmentsHeader',array('attachmentTpl','AttachmentsHeader'));
-$core->tpl->addBlock('AttachmentsFooter',array('attachmentTpl','AttachmentsFooter'));
-$core->tpl->addValue('AttachmentMimeType',array('attachmentTpl','AttachmentMimeType'));
-$core->tpl->addValue('AttachmentType',array('attachmentTpl','AttachmentType'));
-$core->tpl->addValue('AttachmentFileName',array('attachmentTpl','AttachmentFileName'));
-$core->tpl->addValue('AttachmentSize',array('attachmentTpl','AttachmentSize'));
-$core->tpl->addValue('AttachmentTitle',array('attachmentTpl','AttachmentTitle'));
-$core->tpl->addValue('AttachmentThumbnailURL',array('attachmentTpl','AttachmentThumbnailURL'));
-$core->tpl->addValue('AttachmentURL',array('attachmentTpl','AttachmentURL'));
-$core->tpl->addValue('MediaURL',array('attachmentTpl','MediaURL'));
-$core->tpl->addBlock('AttachmentIf',array('attachmentTpl','AttachmentIf'));
-
-$core->tpl->addValue('EntryAttachmentCount',array('attachmentTpl','EntryAttachmentCount'));
-
-$core->addBehavior('tplIfConditions',array('attachmentBehavior','tplIfConditions'));
-
-class attachmentTpl {
-	
-	/*dtd
-	<!ELEMENT tpl:Attachments - - -- Post Attachments loop -->
-	*/
-	public static function Attachments($attr,$content)
-	{
-		$res =
-		"<?php\n".
-		'if ($_ctx->posts !== null && $core->media) {'."\n".
-			'$_ctx->attachments = new ArrayObject($core->media->getPostMedia($_ctx->posts->post_id));'."\n".
-		"?>\n".
-		
-		'<?php foreach ($_ctx->attachments as $attach_i => $attach_f) : '.
-		'$GLOBALS[\'attach_i\'] = $attach_i; $GLOBALS[\'attach_f\'] = $attach_f;'.
-		'$_ctx->file_url = $attach_f->file_url; ?>'.
-		$content.
-		'<?php endforeach; $_ctx->attachments = null; unset($attach_i,$attach_f,$_ctx->file_url); ?>'.
-		
-		"<?php } ?>\n";
-		
-		return $res;
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsHeader - - -- First attachments result container -->
-	*/
-	public static function AttachmentsHeader($attr,$content)
-	{
-		return
-		"<?php if (\$attach_i == 0) : ?>".
-		$content.
-		"<?php endif; ?>";
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsFooter - - -- Last attachments result container -->
-	*/
-	public static function AttachmentsFooter($attr,$content)
-	{
-		return
-		"<?php if (\$attach_i+1 == count(\$_ctx->attachments)) : ?>".
-		$content.
-		"<?php endif; ?>";
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentsIf - - -- Test on attachment fields -->
-	<!ATTLIST tpl:AttachmentIf
-	is_image	(0|1)	#IMPLIED	-- test if attachment is an image (value : 1) or not (value : 0)
-	has_thumb	(0|1)	#IMPLIED	-- test if attachment has a square thumnail (value : 1) or not (value : 0)
-	is_mp3	(0|1)	#IMPLIED	-- test if attachment is a mp3 file (value : 1) or not (value : 0)
-	is_flv	(0|1)	#IMPLIED	-- test if attachment is a flv file (value : 1) or not (value : 0)
-	>
-	*/
-	public static function AttachmentIf($attr,$content)
-	{
-		$if = array();
-		
-		$operator = isset($attr['operator']) ? $this->getOperator($attr['operator']) : '&&';
-		
-		if (isset($attr['is_image'])) {
-			$sign = (boolean) $attr['is_image'] ? '' : '!';
-			$if[] = $sign.'$attach_f->media_image';
-		}
-		
-		if (isset($attr['has_thumb'])) {
-			$sign = (boolean) $attr['has_thumb'] ? '' : '!';
-			$if[] = $sign.'isset($attach_f->media_thumb[\'sq\'])';
-		}
-		
-		if (isset($attr['is_mp3'])) {
-			$sign = (boolean) $attr['is_mp3'] ? '==' : '!=';
-			$if[] = '$attach_f->type '.$sign.' "audio/mpeg3"';
-		}
-		
-		if (isset($attr['is_flv'])) {
-			$sign = (boolean) $attr['is_flv'] ? '' : '!';
-			$if[] = $sign.
-				'($attach_f->type == "video/x-flv" || '.
-				'$attach_f->type == "video/mp4" || '.
-				'$attach_f->type == "video/x-m4v")';
-		}
-		
-		if (count($if) != 0) {
-			return '<?php if('.implode(' '.$operator.' ', (array) $if).') : ?>'.$content.'<?php endif; ?>';
-		} else {
-			return $content;
-		}
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentMimeType - O -- Attachment MIME Type -->
-	*/
-	public static function AttachmentMimeType($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->type').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentType - O -- Attachment type -->
-	*/
-	public static function AttachmentType($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->media_type').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentFileName - O -- Attachment file name -->
-	*/
-	public static function AttachmentFileName($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->basename').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentSize - O -- Attachment size -->
-	<!ATTLIST tpl:AttachmentSize
-	full	CDATA	#IMPLIED	-- if set, size is rounded to a human-readable value (in KB, MB, GB, TB)
-	>
-	*/
-	public static function AttachmentSize($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		if (!empty($attr['full'])) {
-			return '<?php echo '.sprintf($f,'$attach_f->size').'; ?>';
-		}
-		return '<?php echo '.sprintf($f,'files::size($attach_f->size)').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentTitle - O -- Attachment title -->
-	*/
-	public static function AttachmentTitle($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->media_title').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentThumbnailURL - O -- Attachment square thumbnail URL -->
-	*/
-	public static function AttachmentThumbnailURL($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return
-		'<?php '.
-		'if (isset($attach_f->media_thumb[\'sq\'])) {'.
-			'echo '.sprintf($f,'$attach_f->media_thumb[\'sq\']').';'.
-		'}'.
-		'?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:AttachmentURL - O -- Attachment URL -->
-	*/
-	public static function AttachmentURL($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$attach_f->file_url').'; ?>';
-	}
-	
-	public static function MediaURL($attr)
-	{
-		$f = $GLOBALS['core']->tpl->getFilters($attr);
-		return '<?php echo '.sprintf($f,'$_ctx->file_url').'; ?>';
-	}
-	
-	/*dtd
-	<!ELEMENT tpl:EntryAttachmentCount - O -- Number of attachments for entry -->
-	<!ATTLIST tpl:EntryAttachmentCount
-	none	CDATA	#IMPLIED	-- text to display for "no attachment" (default: no attachment)
-	one	CDATA	#IMPLIED	-- text to display for "one attachment" (default: one attachment)
-	more	CDATA	#IMPLIED	-- text to display for "more attachment" (default: %s attachment, %s is replaced by the number of attachments)
-	>
-	*/
-	public static function EntryAttachmentCount($attr)
-	{
-		$none = 'no attachment';
-		$one = 'one attachment';
-		$more = '%d attachments';
-		
-		if (isset($attr['none'])) {
-			$none = addslashes($attr['none']);
-		}
-		if (isset($attr['one'])) {
-			$one = addslashes($attr['one']);
-		}
-		if (isset($attr['more'])) {
-			$more = addslashes($attr['more']);
-		}
-		
-		return
-		"<?php if (\$_ctx->posts->countMedia() == 0) {\n".
-		"  printf(__('".$none."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} elseif (\$_ctx->posts->countMedia() == 1) {\n".
-		"  printf(__('".$one."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} else {\n".
-		"  printf(__('".$more."'),(integer) \$_ctx->posts->countMedia());\n".
-		"} ?>";
-	}
-}
-
-class attachmentBehavior
-{
-	public static function tplIfConditions($tag,$attr,$content,$if)
-	{
-		if ($tag == "EntryIf" && isset($attr['has_attachment'])) {
-			$sign = (boolean) $attr['has_attachment'] ? '' : '!';
-			$if[] = $sign.'$_ctx->posts->countMedia()';
-		}
-	}
-}
-?>
Index: plugins/blogroll/_admin.php
===================================================================
--- plugins/blogroll/_admin.php	(revision 324)
+++ plugins/blogroll/_admin.php	(revision 270)
@@ -20,5 +20,5 @@
 function blogroll_dashboard_favs($core,$favs)
 {
-	$favs['blogroll'] = new ArrayObject(array('blogroll','Blogroll','plugin.php?p=blogroll',
+	$favs['blogroll'] = new ArrayObject(array('blogroll',__('Blogroll'),'plugin.php?p=blogroll',
 		'index.php?pf=blogroll/icon-small.png','index.php?pf=blogroll/icon.png',
 		'usage,contentadmin',null,null));
Index: plugins/blogroll/_define.php
===================================================================
--- plugins/blogroll/_define.php	(revision 464)
+++ plugins/blogroll/_define.php	(revision 270)
@@ -17,7 +17,5 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.2',
-	array(
-		'permissions' =>	'blogroll'
-	)
+	/* Permissions */		'blogroll'
 );
 ?>
Index: plugins/blogroll/index.php
===================================================================
--- plugins/blogroll/index.php	(revision 717)
+++ plugins/blogroll/index.php	(revision 270)
@@ -163,5 +163,5 @@
 <html>
 <head>
-  <title><?php echo __('Blogroll'); ?></title>
+  <title>Blogroll</title>
   <?php echo dcPage::jsToolMan(); ?>
   <?php echo dcPage::jsConfirmClose('links-form','add-link-form','add-category-form'); ?>
@@ -215,5 +215,5 @@
 
 <body>
-<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; <span class="page-title"><?php echo __('Blogroll'); ?></span></h2>
+<h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo; Blogroll</h2>
 
 <?php
@@ -311,21 +311,21 @@
 '<fieldset class="two-cols"><legend>'.__('Add a new link').'</legend>'.
 '<p class="col"><label for="link_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('link_title',30,255,$link_title).
+form::field('link_title',30,255,$link_title,'',2).
 '</label></p>'.
 
 '<p class="col"><label for="link_href" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('URL:').' '.
-form::field('link_href',30,255,$link_href).
+form::field('link_href',30,255,$link_href,'',3).
 '</label></p>'.
 
 '<p class="col"><label for="link_desc">'.__('Description:').' '.
-form::field('link_desc',30,255,$link_desc).
+form::field('link_desc',30,255,$link_desc,'',4).
 '</label></p>'.
 
 '<p class="col"><label for="link_lang">'.__('Language:').' '.
-form::field('link_lang',5,5,$link_lang).
+form::field('link_lang',5,5,$link_lang,'',5).
 '</label></p>'.
 '<p>'.form::hidden(array('p'),'blogroll').
 $core->formNonce().
-'<input type="submit" name="add_link" value="'.__('Save').'" /></p>'.
+'<input type="submit" name="add_link" value="'.__('Save').'" tabindex="6" /></p>'.
 '</fieldset>'.
 '</form>'.
@@ -337,8 +337,8 @@
 '<fieldset><legend>'.__('Add a new category').'</legend>'.
 '<p><label for="cat_title" class=" classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').' '.
-form::field('cat_title',30,255,$cat_title).'</label> '.
+form::field('cat_title',30,255,$cat_title,'',7).'</label> '.
 form::hidden(array('p'),'blogroll').
 $core->formNonce().
-'<input type="submit" name="add_cat" value="'.__('Save').'" /></p>'.
+'<input type="submit" name="add_cat" value="'.__('Save').'" tabindex="8" /></p>'.
 '</fieldset>'.
 '</form>'.
@@ -355,5 +355,5 @@
 	'<p>'.form::hidden(array('p'),'blogroll').
 	$core->formNonce().
-	'<input type="submit" name="import_links" value="'.__('Import').'" /></p>'.
+	'<input type="submit" name="import_links" value="'.__('import').'" tabindex="10" /></p>'.
 	'</fieldset>'.
 	'</form>';
@@ -398,6 +398,6 @@
 		form::hidden(array('p'),'blogroll').
 		$core->formNonce().
-		'<input type="submit" name="cancel_import" value="'.__('Cancel').'" />&nbsp;'.
-		'<input type="submit" name="import_links_do" value="'.__('Import').'" /></p>'.
+		'<input type="submit" name="cancel_import" value="'.__('cancel').'" tabindex="10" />&nbsp;'.
+		'<input type="submit" name="import_links_do" value="'.__('import').'" tabindex="11" /></p>'.
 		'</div>';
 	}
Index: plugins/blowupConfig/_define.php
===================================================================
--- plugins/blowupConfig/_define.php	(revision 464)
+++ plugins/blowupConfig/_define.php	(revision 270)
@@ -17,7 +17,5 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	array(
-		'permissions' =>	'admin'
-	)
+	/* Permissions */		'admin'
 );
 ?>
Index: plugins/blowupConfig/_public.php
===================================================================
--- plugins/blowupConfig/_public.php	(revision 295)
+++ plugins/blowupConfig/_public.php	(revision 270)
@@ -25,20 +25,20 @@
 		echo '<style type="text/css">'."\n".self::blowUpStyleHelper()."\n</style>\n";
 	}
-
+	
 	public static function blowUpStyleHelper()
 	{
 		$s = $GLOBALS['core']->blog->settings->themes->blowup_style;
-
+		
 		if ($s === null) {
 			return;
 		}
-
+		
 		$s = @unserialize($s);
 		if (!is_array($s)) {
 			return;
 		}
-
+		
 		$css = array();
-
+		
 		/* Sidebar position
 		---------------------------------------------- */
@@ -48,16 +48,16 @@
 			$css['#sidebar']['float'] = 'left';
 		}
-
+		
 		/* Properties
 		---------------------------------------------- */
 		self::prop($css,'body','background-color',$s['body_bg_c']);
-
+		
 		self::prop($css,'body','color',$s['body_txt_c']);
 		self::prop($css,'.post-tags li a:link, .post-tags li a:visited, .post-info-co a:link, .post-info-co a:visited','color',$s['body_txt_c']);
 		self::prop($css,'#page','font-size',$s['body_txt_s']);
 		self::prop($css,'body','font-family',blowupConfig::fontDef($s['body_txt_f']));
-
+		
 		self::prop($css,'.post-content, .post-excerpt, #comments dd, #pings dd, dd.comment-preview','line-height',$s['body_line_height']);
-
+		
 		if (!$s['blog_title_hide'])
 		{
@@ -65,10 +65,10 @@
 			self::prop($css,'#top h1','font-size',$s['blog_title_s']);
 			self::prop($css,'#top h1','font-family',blowupConfig::fontDef($s['blog_title_f']));
-
+			
 			if ($s['blog_title_a'] == 'right' || $s['blog_title_a'] == 'left') {
 				$css['#top h1'][$s['blog_title_a']] = '0px';
 				$css['#top h1']['width'] = 'auto';
 			}
-
+			
 			if ($s['blog_title_p'])
 			{
@@ -92,13 +92,13 @@
 		}
 		self::prop($css,'#top','height',$s['top_height']);
-
+		
 		self::prop($css,'.day-date','color',$s['date_title_c']);
 		self::prop($css,'.day-date','font-family',blowupConfig::fontDef($s['date_title_f']));
 		self::prop($css,'.day-date','font-size',$s['date_title_s']);
-
+		
 		self::prop($css,'a','color',$s['body_link_c']);
 		self::prop($css,'a:visited','color',$s['body_link_v_c']);
 		self::prop($css,'a:hover, a:focus, a:active','color',$s['body_link_f_c']);
-
+		
 		self::prop($css,'#comment-form input, #comment-form textarea','color',$s['body_link_c']);
 		self::prop($css,'#comment-form input.preview','color',$s['body_link_c']);
@@ -108,21 +108,21 @@
 		self::prop($css,'#comment-form input.submit:hover','background',$s['body_link_f_c']);
 		self::prop($css,'#comment-form input.submit:hover','border-color',$s['body_link_f_c']);
-
+		
 		self::prop($css,'#sidebar','font-family',blowupConfig::fontDef($s['sidebar_text_f']));
 		self::prop($css,'#sidebar','font-size',$s['sidebar_text_s']);
 		self::prop($css,'#sidebar','color',$s['sidebar_text_c']);
-
+		
 		self::prop($css,'#sidebar h2','font-family',blowupConfig::fontDef($s['sidebar_title_f']));
 		self::prop($css,'#sidebar h2','font-size',$s['sidebar_title_s']);
 		self::prop($css,'#sidebar h2','color',$s['sidebar_title_c']);
-
+		
 		self::prop($css,'#sidebar h3','font-family',blowupConfig::fontDef($s['sidebar_title2_f']));
 		self::prop($css,'#sidebar h3','font-size',$s['sidebar_title2_s']);
 		self::prop($css,'#sidebar h3','color',$s['sidebar_title2_c']);
-
+		
 		self::prop($css,'#sidebar ul','border-top-color',$s['sidebar_line_c']);
 		self::prop($css,'#sidebar li','border-bottom-color',$s['sidebar_line_c']);
 		self::prop($css,'#topnav ul','border-bottom-color',$s['sidebar_line_c']);
-
+		
 		self::prop($css,'#sidebar li a','color',$s['sidebar_link_c']);
 		self::prop($css,'#sidebar li a:visited','color',$s['sidebar_link_v_c']);
@@ -132,17 +132,17 @@
 		self::prop($css,'#search .submit:hover','background',$s['sidebar_link_f_c']);
 		self::prop($css,'#search .submit:hover','border-color',$s['sidebar_link_f_c']);
-
+		
 		self::prop($css,'.post-title','color',$s['post_title_c']);
 		self::prop($css,'.post-title a, .post-title a:visited','color',$s['post_title_c']);
 		self::prop($css,'.post-title','font-family',blowupConfig::fontDef($s['post_title_f']));
 		self::prop($css,'.post-title','font-size',$s['post_title_s']);
-
+		
 		self::prop($css,'#comments dd','background-color',$s['post_comment_bg_c']);
 		self::prop($css,'#comments dd','color',$s['post_comment_c']);
 		self::prop($css,'#comments dd.me','background-color',$s['post_commentmy_bg_c']);
 		self::prop($css,'#comments dd.me','color',$s['post_commentmy_c']);
-
+		
 		self::prop($css,'#prelude, #prelude a','color',$s['prelude_c']);
-
+		
 		self::prop($css,'#footer p','background-color',$s['footer_bg_c']);
 		self::prop($css,'#footer p','color',$s['footer_c']);
@@ -150,5 +150,5 @@
 		self::prop($css,'#footer p','font-family',blowupConfig::fontDef($s['footer_f']));
 		self::prop($css,'#footer p a','color',$s['footer_l_c']);
-
+		
 		/* Images
 		------------------------------------------------------ */
@@ -164,5 +164,5 @@
 		self::backgroundImg($css,'#comments dt.me',$s['post_commentmy_bg_c'],'commentmy-t.png');
 		self::backgroundImg($css,'#comments dd.me',$s['post_commentmy_bg_c'],'commentmy-b.png');
-
+		
 		$res = '';
 		foreach ($css as $selector => $values) {
@@ -173,10 +173,7 @@
 			$res .= "}\n";
 		}
-
-		$res .= $s['extra_css'];
-
 		return $res;
 	}
-
+	
 	protected static function prop(&$css,$selector,$prop,$value)
 	{
@@ -185,5 +182,5 @@
 		}
 	}
-
+	
 	protected static function backgroundImg(&$css,$selector,$value,$image)
 	{
Index: plugins/blowupConfig/index.php
===================================================================
--- plugins/blowupConfig/index.php	(revision 683)
+++ plugins/blowupConfig/index.php	(revision 270)
@@ -24,14 +24,14 @@
 	'body_bg_c' => null,
 	'body_bg_g' => 'light',
-
+	
 	'body_txt_f' => null,
 	'body_txt_s' => null,
 	'body_txt_c' => null,
 	'body_line_height' => null,
-
+	
 	'top_image' => 'default',
 	'top_height' => null,
 	'uploaded' => null,
-
+	
 	'blog_title_hide' => null,
 	'blog_title_f' => null,
@@ -40,9 +40,9 @@
 	'blog_title_a' => null,
 	'blog_title_p' => null,
-
+	
 	'body_link_c' => null,
 	'body_link_f_c' => null,
 	'body_link_v_c' => null,
-
+	
 	'sidebar_position' => null,
 	'sidebar_text_f' => null,
@@ -59,9 +59,9 @@
 	'sidebar_link_f_c' => null,
 	'sidebar_link_v_c' => null,
-
+	
 	'date_title_f' => null,
 	'date_title_s' => null,
 	'date_title_c' => null,
-
+	
 	'post_title_f' => null,
 	'post_title_s' => null,
@@ -71,5 +71,5 @@
 	'post_commentmy_bg_c' => null,
 	'post_commentmy_c' => null,
-
+	
 	'prelude_c' => null,
 	'footer_f' => null,
@@ -78,6 +78,4 @@
 	'footer_l_c' => null,
 	'footer_bg_c' => null,
-
-	'extra_css' => null
 );
 
@@ -110,5 +108,5 @@
 		$blowup_user['body_txt_c'] = blowupConfig::adjustColor($_POST['body_txt_c']);
 		$blowup_user['body_line_height'] = blowupConfig::adjustFontSize($_POST['body_line_height']);
-
+		
 		$blowup_user['blog_title_hide'] = (integer) !empty($_POST['blog_title_hide']);
 		$update_blog_title = !$blowup_user['blog_title_hide'] && (
@@ -117,5 +115,5 @@
 			!empty($_POST['blog_title_p'])
 		);
-
+		
 		if ($update_blog_title)
 		{
@@ -126,9 +124,9 @@
 			$blowup_user['blog_title_p'] = blowupConfig::adjustPosition($_POST['blog_title_p']);
 		}
-
+		
 		$blowup_user['body_link_c'] = blowupConfig::adjustColor($_POST['body_link_c']);
 		$blowup_user['body_link_f_c'] = blowupConfig::adjustColor($_POST['body_link_f_c']);
 		$blowup_user['body_link_v_c'] = blowupConfig::adjustColor($_POST['body_link_v_c']);
-
+		
 		$blowup_user['sidebar_text_f'] = $_POST['sidebar_text_f'];
 		$blowup_user['sidebar_text_s'] = blowupConfig::adjustFontSize($_POST['sidebar_text_s']);
@@ -144,11 +142,11 @@
 		$blowup_user['sidebar_link_f_c'] = blowupConfig::adjustColor($_POST['sidebar_link_f_c']);
 		$blowup_user['sidebar_link_v_c'] = blowupConfig::adjustColor($_POST['sidebar_link_v_c']);
-
+		
 		$blowup_user['sidebar_position'] = ($_POST['sidebar_position'] == 'left') ? 'left' : null;
-
+		
 		$blowup_user['date_title_f'] = $_POST['date_title_f'];
 		$blowup_user['date_title_s'] = blowupConfig::adjustFontSize($_POST['date_title_s']);
 		$blowup_user['date_title_c'] = blowupConfig::adjustColor($_POST['date_title_c']);
-
+		
 		$blowup_user['post_title_f'] = $_POST['post_title_f'];
 		$blowup_user['post_title_s'] = blowupConfig::adjustFontSize($_POST['post_title_s']);
@@ -156,6 +154,6 @@
 		$blowup_user['post_comment_c'] = blowupConfig::adjustColor($_POST['post_comment_c']);
 		$blowup_user['post_commentmy_c'] = blowupConfig::adjustColor($_POST['post_commentmy_c']);
-
-
+		
+		
 		$blowup_user['footer_f'] = $_POST['footer_f'];
 		$blowup_user['footer_s'] = blowupConfig::adjustFontSize($_POST['footer_s']);
@@ -163,8 +161,5 @@
 		$blowup_user['footer_l_c'] = blowupConfig::adjustColor($_POST['footer_l_c']);
 		$blowup_user['footer_bg_c'] = blowupConfig::adjustColor($_POST['footer_bg_c']);
-
-
-		$blowup_user['extra_css'] = blowupConfig::cleanCSS($_POST['extra_css']);
-
+		
 		if ($can_write_images)
 		{
@@ -173,5 +168,5 @@
 				$uploaded = blowupConfig::imagesPath().'/'.$blowup_user['uploaded'];
 			}
-
+			
 			if (!empty($_FILES['upfile']) && !empty($_FILES['upfile']['name'])) {
 				files::uploadStatus($_FILES['upfile']);
@@ -179,7 +174,7 @@
 				$blowup_user['uploaded'] = basename($uploaded);
 			}
-
+			
 			$blowup_user['top_image'] = in_array($_POST['top_image'],$top_images) ? $_POST['top_image'] : 'default';
-
+			
 			$blowup_user['body_bg_c'] = blowupConfig::adjustColor($_POST['body_bg_c']);
 			$blowup_user['body_bg_g'] = in_array($_POST['body_bg_g'],$gradient_types) ? $_POST['body_bg_g'] : '';
@@ -189,9 +184,9 @@
 			blowupConfig::createImages($blowup_user,$uploaded);
 		}
-
+		
 		$core->blog->settings->addNamespace('themes');
 		$core->blog->settings->themes->put('blowup_style',serialize($blowup_user));
 		$core->blog->triggerBlog();
-
+		
 		http::redirect($p_url.'&upd=1');
 	}
@@ -223,5 +218,5 @@
 echo
 '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Blowup configuration').'</span></h2>'.
+' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; '.__('Blowup configuration').'</h2>'.
 '<p><a class="back" href="blog_theme.php">'.__('back').'</a></p>';
 
@@ -238,5 +233,5 @@
 
 echo '<form id="theme_config" action="'.$p_url.'" method="post" enctype="multipart/form-data">';
-
+		
 echo '<fieldset><legend>'.__('General').'</legend>';
 
@@ -245,5 +240,5 @@
 	'<p class="field"><label for="body_bg_c">'.__('Background color:').' '.
 	form::field('body_bg_c',7,7,$blowup_user['body_bg_c'],'colorpicker').'</label></p>'.
-
+	
 	'<p class="field"><label for="body_bg_g">'.__('Background color fill:').' '.
 	form::combo('body_bg_g',$gradient_types,$blowup_user['body_bg_g']).'</label></p>';
@@ -309,5 +304,5 @@
 		$preview_image = 'index.php?pf=blowupConfig/alpha-img/page-t/'.$blowup_user['top_image'].'.png';
 	}
-
+	
 	echo
 	'<fieldset><legend>'.__('Top image').'</legend>'.
@@ -315,10 +310,10 @@
 	form::combo('top_image',$top_images,($blowup_user['top_image'] ? $blowup_user['top_image'] : 'default')).'</label></p>'.
 	'<p>'.__('Choose "Custom..." to upload your own image.').'</p>'.
-
+	
 	'<p id="uploader"><label for="upfile">'.__('Add your image:').
 	' ('.sprintf(__('JPEG or PNG file, 800 pixels wide, maximum size %s'),files::size(DC_MAX_UPLOAD_SIZE)).')'.
 	'<input type="file" name="upfile" id="upfile" size="35" />'.
 	'</label></p>'.
-
+	
 	'<h3>'.__('Preview').'</h3>'.
 	'<div class="grid" style="width:800px;border:1px solid #ccc;">'.
@@ -430,11 +425,4 @@
 '</fieldset>';
 
-echo
-'<fieldset><legend>'.__('Additional CSS').'</legend>'.
-'<p>'.form::textarea('extra_css',72,5,html::escapeHTML($blowup_user['extra_css']),'maximal','',false,'title="'.__('Additional CSS').'"').'</p>'.
-'</fieldset>';
-
-
-
 // Import / Export configuration
 $tmp_array = array();
Index: plugins/blowupConfig/lib/class.blowup.config.php
===================================================================
--- plugins/blowupConfig/lib/class.blowup.config.php	(revision 696)
+++ plugins/blowupConfig/lib/class.blowup.config.php	(revision 270)
@@ -22,5 +22,5 @@
 			'ss5' => 'Impact, Charcoal, sans-serif'
 		),
-
+		
 		'serif' => array(
 			's1' => 'Times, "Times New Roman", serif',
@@ -28,5 +28,5 @@
 			's3' => 'Baskerville, "Palatino Linotype", serif'
 		),
-
+		
 		'monospace' => array(
 			'm1' => '"Andale Mono", "Courier New", monospace',
@@ -34,8 +34,8 @@
 		)
 	);
-
+	
 	protected static $fonts_combo = array();
 	protected static $fonts_list = array();
-
+	
 	public static $top_images = array(
 		'default' => 'Default',
@@ -53,7 +53,7 @@
 		'roadrunner-1' => 'Road Runner 1',
 		'roadrunner-2' => 'Road Runner 2',
-		'typo' => 'Typo'
+		'typo' => 'Typo',
 	);
-
+	
 	public static function fontsList()
 	{
@@ -70,8 +70,8 @@
 			}
 		}
-
+		
 		return self::$fonts_combo;
 	}
-
+	
 	public static function fontDef($c)
 	{
@@ -85,8 +85,8 @@
 			}
 		}
-
+		
 		return isset(self::$fonts_list[$c]) ? self::$fonts_list[$c] : null;
 	}
-
+	
 	public static function adjustFontSize($s)
 	{
@@ -97,8 +97,8 @@
 			return $m[1].$m[2];
 		}
-
+		
 		return null;
 	}
-
+	
 	public static function adjustPosition($p)
 	{
@@ -106,10 +106,10 @@
 			return null;
 		}
-
+		
 		$p = explode(':',$p);
-
+		
 		return $p[0].(count($p) == 1 ? ':0' : ':'.$p[1]);
 	}
-
+	
 	public static function adjustColor($c)
 	{
@@ -117,28 +117,22 @@
 			return '';
 		}
-
+		
 		$c = strtoupper($c);
-
+		
 		if (preg_match('/^[A-F0-9]{3,6}$/',$c)) {
 			$c = '#'.$c;
 		}
-
+		
 		if (preg_match('/^#[A-F0-9]{6}$/',$c)) {
 			return $c;
 		}
-
+		
 		if (preg_match('/^#[A-F0-9]{3,}$/',$c)) {
 			return '#'.substr($c,1,1).substr($c,1,1).substr($c,2,1).substr($c,2,1).substr($c,3,1).substr($c,3,1);
 		}
-
+		
 		return '';
 	}
-
-	public static function cleanCSS($css)
-	{
-		// TODO ?
-		return $css;
-	}
-
+	
 	public static function imagesPath()
 	{
@@ -146,5 +140,5 @@
 		return path::real($core->blog->public_path).'/blowup-images';
 	}
-
+	
 	public static function imagesURL()
 	{
@@ -152,12 +146,12 @@
 		return $core->blog->settings->system->public_url.'/blowup-images';
 	}
-
+	
 	public static function canWriteImages($create=false)
 	{
 		global $core;
-
+		
 		$public = path::real($core->blog->public_path);
 		$imgs = self::imagesPath();
-
+		
 		if (!function_exists('imagecreatetruecolor') || !function_exists('imagepng') || !function_exists('imagecreatefrompng')) {
 			$core->error->add(__('At least one of the following functions is not available: '.
@@ -165,10 +159,10 @@
 			return false;
 		}
-
+		
 		if (!is_dir($public)) {
 			$core->error->add(__('The \'public\' directory does not exist.'));
 			return false;
 		}
-
+		
 		if (!is_dir($imgs)) {
 			if (!is_writable($public)) {
@@ -181,13 +175,13 @@
 			return true;
 		}
-
+		
 		if (!is_writable($imgs)) {
 			$core->error->add(sprintf(__('The \'%s\' directory cannot be modified.'),'public/blowup-images'));
 			return false;
 		}
-
+		
 		return true;
 	}
-
+	
 	public static function uploadImage($f)
 	{
@@ -195,26 +189,26 @@
 			throw new Exception(__('Unable to create images.'));
 		}
-
+		
 		$name = $f['name'];
 		$type = files::getMimeType($name);
-
+		
 		if ($type != 'image/jpeg' && $type != 'image/png') {
 			throw new Exception(__('Invalid file type.'));
 		}
-
+		
 		$dest = self::imagesPath().'/uploaded'.($type == 'image/png' ? '.png' : '.jpg');
-
+		
 		if (@move_uploaded_file($f['tmp_name'],$dest) === false) {
 			throw new Exception(__('An error occurred while writing the file.'));
 		}
-
+		
 		$s = getimagesize($dest);
 		if ($s[0] != 800) {
 			throw new Exception(__('Uploaded image is not 800 pixels wide.'));
 		}
-
+		
 		return $dest;
 	}
-
+	
 	public static function createImages(&$config,$uploaded)
 	{
@@ -225,7 +219,7 @@
 		$comment_color_my = $config['post_commentmy_bg_c'];
 		$top_image = $config['top_image'];
-
+		
 		$config['top_height'] = null;
-
+		
 		if ($top_image != 'custom' && !isset(self::$top_images[$top_image])) {
 			$top_image = 'default';
@@ -234,9 +228,9 @@
 			$uploaded = null;
 		}
-
+		
 		if (!self::canWriteImages(true)) {
 			throw new Exception(__('Unable to create images.'));
 		}
-
+		
 		$body_fill = array(
 			'light' => dirname(__FILE__).'/../alpha-img/gradient-l.png',
@@ -244,7 +238,7 @@
 			'dark' => dirname(__FILE__).'/../alpha-img/gradient-d.png'
 		);
-
+		
 		$body_g = isset($body_fill[$gradient]) ? $body_fill[$gradient] : false;
-
+		
 		if ($top_image == 'custom' && $uploaded) {
 			$page_t = $uploaded;
@@ -252,5 +246,5 @@
 			$page_t = dirname(__FILE__).'/../alpha-img/page-t/'.$top_image.'.png';
 		}
-
+		
 		$body_bg = dirname(__FILE__).'/../alpha-img/body-bg.png';
 		$page_t_mask = dirname(__FILE__).'/../alpha-img/page-t/image-mask.png';
@@ -260,5 +254,5 @@
 		$default_bg = '#e0e0e0';
 		$default_prelude = '#ededed';
-
+		
 		self::dropImage(basename($body_bg));
 		self::dropImage('page-t.png');
@@ -266,9 +260,9 @@
 		self::dropImage(basename($comment_t));
 		self::dropImage(basename($comment_b));
-
+		
 		$body_color = self::adjustColor($body_color);
 		$prelude_color = self::adjustColor($prelude_color);
 		$comment_color = self::adjustColor($comment_color);
-
+		
 		if ($top_image || $body_color || $gradient != 'light' || $prelude_color || $uploaded)
 		{
@@ -277,10 +271,10 @@
 			}
 			$body_color = sscanf($body_color,'#%2X%2X%2X');
-
+			
 			# Create body gradient with color
 			$d_body_bg = imagecreatetruecolor(50,180);
 			$fill = imagecolorallocate($d_body_bg,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_body_bg,0,0,$fill);
-
+			
 			# User choosed a gradient
 			if ($body_g) {
@@ -290,18 +284,18 @@
 				imagedestroy($s_body_bg);
 			}
-
+			
 			if (!$prelude_color) {
 				$prelude_color = $default_prelude;
 			}
 			$prelude_color = sscanf($prelude_color,'#%2X%2X%2X');
-
+			
 			$s_prelude = imagecreatetruecolor(50,30);
 			$fill = imagecolorallocate($s_prelude,$prelude_color[0],$prelude_color[1],$prelude_color[2]);
 			imagefill($s_prelude,0,0,$fill);
 			imagecopy($d_body_bg,$s_prelude,0,0,0,0,50,30);
-
+			
 			imagepng($d_body_bg,self::imagesPath().'/'.basename($body_bg));
 		}
-
+		
 		if ($top_image || $body_color || $gradient != 'light')
 		{
@@ -310,7 +304,7 @@
 			$size = $size[1];
 			$type = files::getMimeType($page_t);
-
+			
 			$d_page_t = imagecreatetruecolor(800,$size);
-
+			
 			if ($type == 'image/png') {
 				$s_page_t = @imagecreatefrompng($page_t);
@@ -318,12 +312,12 @@
 				$s_page_t = @imagecreatefromjpeg($page_t);
 			}
-
+			
 			if (!$s_page_t) {
 				throw new exception(__('Unable to open image.'));
 			}
-
+			
 			$fill = imagecolorallocate($d_page_t,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_page_t,0,0,$fill);
-
+			
 			if ($type == 'image/png')
 			{
@@ -337,15 +331,15 @@
 				# JPEG, we add image and a frame with rounded corners
 				imagecopy($d_page_t,$s_page_t,0,0,0,0,800,$size);
-
+				
 				imagecopy($d_page_t,$d_body_bg,0,0,0,50,8,4);
 				imagecopy($d_page_t,$d_body_bg,0,4,0,54,4,4);
 				imagecopy($d_page_t,$d_body_bg,792,0,0,50,8,4);
 				imagecopy($d_page_t,$d_body_bg,796,4,0,54,4,4);
-
+				
 				$mask = imagecreatefrompng($page_t_mask);
 				imagealphablending($mask,true);
 				imagecopy($d_page_t,$mask,0,0,0,0,800,11);
 				imagedestroy($mask);
-
+				
 				$fill = imagecolorallocate($d_page_t,255,255,255);
 				imagefilledrectangle($d_page_t,0,11,3,$size-1,$fill);
@@ -353,28 +347,28 @@
 				imagefilledrectangle($d_page_t,0,$size-9,799,$size-1,$fill);
 			}
-
+			
 			$config['top_height'] = ($size).'px';
-
+			
 			imagepng($d_page_t,self::imagesPath().'/page-t.png');
-
+			
 			imagedestroy($d_body_bg);
 			imagedestroy($d_page_t);
 			imagedestroy($s_page_t);
-
+			
 			# Create bottom image with color
 			$d_page_b = imagecreatetruecolor(800,8);
 			$fill = imagecolorallocate($d_page_b,$body_color[0],$body_color[1],$body_color[2]);
 			imagefill($d_page_b,0,0,$fill);
-
+			
 			$s_page_b = imagecreatefrompng($page_b);
 			imagealphablending($s_page_b,true);
 			imagecopy($d_page_b,$s_page_b,0,0,0,0,800,160);
-
+			
 			imagepng($d_page_b,self::imagesPath().'/'.basename($page_b));
-
+			
 			imagedestroy($d_page_b);
 			imagedestroy($s_page_b);
 		}
-
+		
 		if ($comment_color) {
 			self::commentImages($comment_color,$comment_t,$comment_b,basename($comment_t),basename($comment_b));
@@ -384,34 +378,34 @@
 		}
 	}
-
+	
 	protected static function commentImages($comment_color,$comment_t,$comment_b,$dest_t,$dest_b)
 	{
 		$comment_color = sscanf($comment_color,'#%2X%2X%2X');
-
+			
 		$d_comment_t = imagecreatetruecolor(500,25);
 		$fill = imagecolorallocate($d_comment_t,$comment_color[0],$comment_color[1],$comment_color[2]);
 		imagefill($d_comment_t,0,0,$fill);
-
+		
 		$s_comment_t = imagecreatefrompng($comment_t);
 		imagealphablending($s_comment_t,true);
 		imagecopy($d_comment_t,$s_comment_t,0,0,0,0,500,25);
-
+		
 		imagepng($d_comment_t,self::imagesPath().'/'.$dest_t);
 		imagedestroy($d_comment_t);
 		imagedestroy($s_comment_t);
-
+		
 		$d_comment_b = imagecreatetruecolor(500,7);
 		$fill = imagecolorallocate($d_comment_b,$comment_color[0],$comment_color[1],$comment_color[2]);
 		imagefill($d_comment_b,0,0,$fill);
-
+		
 		$s_comment_b = imagecreatefrompng($comment_b);
 		imagealphablending($s_comment_b,true);
 		imagecopy($d_comment_b,$s_comment_b,0,0,0,0,500,7);
-
+		
 		imagepng($d_comment_b,self::imagesPath().'/'.$dest_b);
 		imagedestroy($d_comment_b);
 		imagedestroy($s_comment_b);
 	}
-
+	
 	public static function dropImage($img)
 	{
Index: plugins/dcRevisions/_admin.php
===================================================================
--- plugins/dcRevisions/_admin.php	(revision 721)
+++ plugins/dcRevisions/_admin.php	(revision 721)
@@ -0,0 +1,28 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+# 
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+# 
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+if (!defined('DC_CONTEXT_ADMIN')) { return; }
+
+$core->addBehavior('adminPostForm',array('dcRevisionsBehaviors','adminPostForm'));
+$core->addBehavior('adminPostHeaders',array('dcRevisionsBehaviors','adminPostHeaders'));
+$core->addBehavior('adminBeforePostUpdate',array('dcRevisionsBehaviors','adminBeforeUpdate'));
+$core->addBehavior('adminBeforePageUpdate',array('dcRevisionsBehaviors','adminBeforeUpdate'));
+
+$core->rest->addFunction('getPatch',array('dcRevisionsRestMethods','getPatch'));
+
+$core->blog->revisions = new dcRevisions($core);
+
+if (isset($_GET['id']) && isset($_GET['patch']) && preg_match('/post.php\?id=[0-9]+(.*)$/',$_SERVER['REQUEST_URI'])) {
+	$core->blog->revisions->setPatch($_GET['id'],$_GET['patch']);
+}
+
+?>
Index: plugins/dcRevisions/_define.php
===================================================================
--- plugins/dcRevisions/_define.php	(revision 721)
+++ plugins/dcRevisions/_define.php	(revision 721)
@@ -0,0 +1,21 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+$this->registerModule(
+		/* Name */			"dcRevisions",
+		/* Description*/		"Allows entries's versionning",
+		/* Author */			"Tomtom (http://blog.zenstyle.fr)",
+		/* Version */			'0.1',
+		/* Permissions */		'usage,contentadmin'
+);
+
+?>
Index: plugins/dcRevisions/_install.php
===================================================================
--- plugins/dcRevisions/_install.php	(revision 721)
+++ plugins/dcRevisions/_install.php	(revision 721)
@@ -0,0 +1,65 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+if (!defined('DC_CONTEXT_ADMIN')) { return; }
+
+$m_version = $core->plugins->moduleInfo('dcRevisions','version');
+$i_version = $core->getVersion('dcrevisions');
+
+if (version_compare($i_version,$m_version,'>=')) {
+	return;
+}
+
+$core->blog->settings->addNamespace('dcrevisions');
+$core->blog->settings->dcrevisions->put(
+	'enable',
+	false,
+	'boolean','Enable revisions',false,true
+);
+
+# --INSTALL AND UPDATE PROCEDURES--
+$s = new dbStruct($core->con,$core->prefix);
+
+$s->revision
+	->revision_id				('bigint',0,false)
+	->post_id					('bigint',0,false)
+	->user_id					('varchar',32,false)
+	->blog_id					('varchar',32,false)
+	->revision_dt				('timestamp',0,false,'now()')
+	->revision_tz				('varchar',128,false,"'UTC'")
+	->revision_type			('varchar',50,true,null)
+	->revision_excerpt_diff		('text',0,true,null)
+	->revision_excerpt_xhtml_diff	('text',0,true,null)
+	->revision_content_diff		('text',0,true,null)
+	->revision_content_xhtml_diff	('text',0,true,null)
+	;
+
+$s->revision->primary('pk_revision','revision_id');
+
+$s->revision->index('idx_revision_post_id','btree','post_id');
+
+$s->revision->reference('fk_revision_post','post_id','post','post_id','cascade','cascade');
+$s->revision->reference('fk_revision_blog','blog_id','blog','blog_id','cascade','cascade');
+
+$si = new dbStruct($core->con,$core->prefix);
+
+try {
+	$changes = $si->synchronize($s);
+} catch (Exception $e) {
+	$core->error->add($e);
+}
+
+$core->setVersion('dcrevisions',$m_version);
+
+return true;
+
+?>
Index: plugins/dcRevisions/_prepend.php
===================================================================
--- plugins/dcRevisions/_prepend.php	(revision 721)
+++ plugins/dcRevisions/_prepend.php	(revision 721)
@@ -0,0 +1,19 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRrevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+$__autoload['dcRevisions'] = dirname(__FILE__).'/inc/class.dc.revisions.php';
+$__autoload['dcRevisionsRestMethods'] = dirname(__FILE__).'/_services.php';
+$__autoload['dcRevisionsBehaviors'] = dirname(__FILE__).'/inc/class.dc.revisions.behaviors.php';
+$__autoload['dcRevisionsExtensions'] = dirname(__FILE__).'/inc/class.dc.revisions.extensions.php';
+$__autoload['dcRevisionsList'] = dirname(__FILE__).'/inc/class.dc.revisions.list.php';
+
+?>
Index: plugins/dcRevisions/_services.php
===================================================================
--- plugins/dcRevisions/_services.php	(revision 721)
+++ plugins/dcRevisions/_services.php	(revision 721)
@@ -0,0 +1,90 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+class dcRevisionsRestMethods
+{
+	public static function getPatch()
+	{
+		global $core;
+		
+		$pid = isset($_GET['pid']) ? $_GET['pid'] : null;
+		$rid = isset($_GET['rid']) ? $_GET['rid'] : null;
+		
+		if ($pid === null) {
+			throw new Exception(__('No post ID'));
+		}
+		if ($rid === null) {
+			throw new Exception(__('No revision ID'));
+		}
+		
+		$p = $core->blog->getPosts(array('post_id' => $pid));
+		$o = array(
+			'post_excerpt_xhtml' => $p->post_excerpt_xhtml,
+			'post_content_xhtml' => $p->post_content_xhtml
+		);
+		
+		$n = $core->blog->revisions->getPatch($pid,$rid);
+		unset($n['post_excerpt']);
+		unset($n['post_content']);
+		
+		$rsp = new xmlTag();
+		
+		foreach ($o as $k => $v) {
+			$rsp->insertNode(self::buildNode($v,$n[$k],2,$k));
+		}
+		
+		return $rsp;
+	}
+	
+	public static function buildNode($src,$dst,$ctx,$root)
+	{
+		$udiff = diff::uniDiff($src,$dst,$ctx);
+		$tdiff = new tidyDiff(htmlspecialchars($udiff),true);
+		
+		$rev = new xmlTag($root);
+		
+		foreach ($tdiff->getChunks() as $k => $chunk) {
+			foreach ($chunk->getLines() as $line) {
+				switch ($line->type) {
+					case 'context':
+						$node = new xmlTag('context');
+						$node->oline = $line->lines[0];
+						$node->nline = $line->lines[1];
+						$node->insertNode($line->content);
+						$rev->insertNode($node);
+						break;
+					case 'delete':
+						$node = new xmlTag('delete');
+						$node->oline = $line->lines[0];
+						$c = str_replace(array('\0','\1'),array('<del>','</del>'),$line->content);
+						$node->insertNode($c);
+						$rev->insertNode($node);
+						break;
+					case 'insert':
+						$node = new xmlTag('insert');
+						$node->nline = $line->lines[1];
+						$c = str_replace(array('\0','\1'),array('<ins>','</ins>'),$line->content);
+						$node->insertNode($c);
+						$rev->insertNode($node);
+						break;
+				}
+			}
+			if ($k < count($tdiff->getChunks()) - 1) {
+				$node = new xmlTag('skip');
+				$rev->insertNode($node);
+			}
+		}
+		return $rev;
+	}
+}
+
+?>
Index: plugins/dcRevisions/inc/class.dc.revisions.behaviors.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.behaviors.php	(revision 721)
+++ plugins/dcRevisions/inc/class.dc.revisions.behaviors.php	(revision 721)
@@ -0,0 +1,72 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2010 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+class dcRevisionsBehaviors
+{
+	public static function adminPostForm($post)
+	{
+		global $core;
+		
+		$id = isset($post) && !$post->isEmpty() ? $post->post_id : null;
+		$page = isset($_GET['page']) ? $_GET['page'] : 1;
+		$url = sprintf('post.php?id=%1$s&amp;patch=%2$s',$id,'%s');
+		
+		$params = array(
+			'post_id' => $id
+		);
+		
+		$rs = $core->blog->revisions->getRevisions($params);
+		
+		if (is_null($id)) {
+			$rs = staticRecord::newFromArray(array());
+			$rs->core = $core;
+		}
+		
+		$list = new dcRevisionsList($rs);
+		
+		echo '<div class="area" id="revisions-area"><label>'.__('Revisions:').'</label>'.
+		$list->display($url).
+		'</div>';
+	}
+	
+	public static function adminPostHeaders()
+	{
+		return
+		'<script type="text/javascript">'."\n".
+		"//<![CDATA[\n".
+		dcPage::jsVar('dotclear.msg.excerpt',__('Excerpt')).
+		dcPage::jsVar('dotclear.msg.content',__('Content')).
+		dcPage::jsVar('dotclear.msg.current',__('Current')).
+		dcPage::jsVar('dotclear.msg.content_identical',__('Content identical')).
+		dcPage::jsVar('dotclear.msg.confirm_apply_patch',
+			__('(CAUTION: This operation will replace all the content by the previous one)').' '.
+			__('Are you sure to want apply this patch on this entry?')
+		).
+		"\n//]]>\n".
+		"</script>\n".
+		'<script type="text/javascript" src="index.php?pf=dcRevisions/js/_revision.js"></script>'."\n".
+		'<link rel="stylesheet" type="text/css" href="index.php?pf=dcRevisions/style.css" />';
+	}
+	
+	public static function adminBeforeUpdate($cur,$post_id)
+	{
+		global $core;
+		
+		try {
+			$core->blog->revisions->addRevision($cur,$post_id);
+		} catch (Exception $e) {
+			$core->error->add($e->getMessage());
+		}
+	}
+}
+
+?>
Index: plugins/dcRevisions/inc/class.dc.revisions.extensions.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.extensions.php	(revision 338)
+++ plugins/dcRevisions/inc/class.dc.revisions.extensions.php	(revision 338)
@@ -0,0 +1,73 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2010 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+class dcRevisionsExtensions
+{
+	public static function getDate($rs,$format = null)
+	{
+		$format === null ? $format = $rs->core->blog->settings->system->date_format : $format;
+		
+		return dt::dt2str($format,$rs->revision_dt,$rs->revision_tz);
+	}
+	
+	public static function getTime($rs,$format = null)
+	{	
+		$format === null ? $format = $rs->core->blog->settings->system->time_format : $format;
+
+		return dt::dt2str($format,$rs->revision_dt,$rs->revision_tz);
+	}
+	
+	public static function getAuthorCN($rs)
+	{
+		return dcUtils::getUserCN($rs->user_id, $rs->user_name,
+		$rs->user_firstname, $rs->user_displayname);
+	}
+	
+	public static function getAuthorLink($rs)
+	{
+		$res = '%1$s';
+		$url = $rs->user_url;
+		if ($url) {
+			$res = '<a href="%2$s">%1$s</a>';
+		}
+		
+		return sprintf($res,html::escapeHTML($rs->getAuthorCN()),html::escapeHTML($url));
+	}
+	
+	public static function canPatch($rs)
+	{
+		# If user is super admin, true
+		if ($rs->core->auth->isSuperAdmin()) {
+			return true;
+		}
+		
+		# If user is admin or contentadmin, true
+		if ($rs->core->auth->check('contentadmin',$rs->core->blog->id)) {
+			return true;
+		}
+		
+		# No user id in result ? false
+		if (!$rs->exists('user_id')) {
+			return false;
+		}
+		
+		# If user is usage and owner of the entrie
+		if ($rs->core->auth->check('usage',$rs->core->blog->id)
+		&& $rs->user_id == $rs->core->auth->userID()) {
+			return true;
+		}
+		
+		return false;
+	}
+}
+
+?>
Index: plugins/dcRevisions/inc/class.dc.revisions.list.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.list.php	(revision 721)
+++ plugins/dcRevisions/inc/class.dc.revisions.list.php	(revision 721)
@@ -0,0 +1,86 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2010 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+class dcRevisionsList
+{
+	protected $rs = null;
+	
+	public function __construct($rs)
+	{
+		$this->rs = $rs;
+		$this->core = $rs->core;
+	}
+	
+	public function display($url)
+	{
+		$res = '';
+		
+		if (!$this->rs->isEmpty()) {
+			$html_block =
+				'<table id="revisions-list" summary="'.__('Revisions').'" class="clear maximal" style="display: none;">'.
+				'<thead>'.
+				'<tr>'.
+				'<th>'.__('Id').'</th>'.
+				'<th class="nowrap">'.__('Author').'</th>'.
+				'<th class="nowrap">'.__('Date').'</th>'.
+				'<th class="nowrap">'.__('Status').'</th>'.
+				'<th class="nowrap">'.__('Actions').'</th>'.
+				'</tr>'.
+				'</thead>'.
+				'<tbody>%s</tbody>'.
+				'</table>';
+				
+			$res .= sprintf($html_block,$this->getLines($url));
+		}
+		else {
+			$res .= '<p style="display:none">'.__('No revision').'</p>';
+		}
+		
+		return $res;
+	}
+	
+	private function getLines($url)
+	{
+		$res = '';
+		$p_img = '<img src="%1$s" alt="%2$s" title="%2$s" />';
+		$p_link = '<a href="%1$s" title="%3$s" class="patch"><img src="%2$s" alt="%3$s" /></a>';
+		
+		while ($this->rs->fetch()) {
+			$res .= 
+				'<tr class="line wide'.(!$this->rs->canPatch() ? ' offline' : '').'" id="r'.$this->rs->revision_id.'">'."\n".
+				'<td class="maximal nowrap rid">'.
+					'<strong>'.sprintf(__('Revision #%s'),$this->rs->revision_id).'</strong>'.
+				"</td>\n".
+				'<td class="minimal nowrap">'.
+					$this->rs->getAuthorLink().
+				"</td>\n".
+				'<td class="minimal nowrap">'.
+					$this->rs->getDate().' - '.$this->rs->getTime().
+				"</td>\n".
+				'<td class="minimal nowrap status">'.
+					sprintf(
+						$p_img,
+						('images/'.($this->rs->canPatch() ? 'check-on.png' : 'locker.png')),
+						($this->rs->canPatch() ? __('Revision allowed') : __('Revision blocked'))
+					).
+				"</td>\n".
+				'<td class="minimal nowrap status">'.
+					($this->rs->canPatch() ? sprintf($p_link,sprintf($url,$this->rs->revision_id),'index.php?pf=dcRevisions/images/apply.png',__('Apply patch')) : '').
+				"</td>\n".
+				"</tr>\n";
+		}
+		
+		return $res;
+	}
+}
+
+?>
Index: plugins/dcRevisions/inc/class.dc.revisions.php
===================================================================
--- plugins/dcRevisions/inc/class.dc.revisions.php	(revision 721)
+++ plugins/dcRevisions/inc/class.dc.revisions.php	(revision 721)
@@ -0,0 +1,254 @@
+<?php
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2010 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+
+class dcRevisions
+{
+	public function __construct($core)
+	{
+		$this->core = $core;
+	}
+	
+	public function getRevisions($params,$count_only = false)
+	{
+		if ($count_only) {
+			$f = 'COUNT(revision_id)';
+		}
+		else {
+			$f = 'R.revision_id, R.post_id, R.user_id, R.revision_type, '.
+			'R.revision_dt, R.revision_tz, R.revision_excerpt_diff, '.
+			'R.revision_excerpt_xhtml_diff, R.revision_content_diff, '.
+			'R.revision_content_xhtml_diff, U.user_url, U.user_name, '.
+			'U.user_firstname, U.user_displayname';
+		}
+		
+		$strReq = 'SELECT '.$f.' FROM '.$this->core->prefix.'revision R '.
+		'LEFT JOIN '.$this->core->prefix.'user U ON R.user_id = U.user_id ';
+		
+		if (!empty($params['from'])) {
+			$strReq .= $params['from'].' ';
+		}
+		
+		$strReq .= "WHERE R.blog_id = '".$this->core->con->escape($this->core->blog->id)."' ";
+		
+		if (!empty($params['post_id'])) {
+			if (is_array($params['post_id'])) {
+				array_walk($params['post_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}'));
+			} else {
+				$params['post_id'] = array((integer) $params['post_id']);
+			}
+			$strReq .= 'AND R.post_id '.$this->core->con->in($params['post_id']);
+		}
+		
+		if (!empty($params['revision_id'])) {
+			if (is_array($params['revision_id'])) {
+				array_walk($params['revision_id'],create_function('&$v,$k','if($v!==null){$v=(integer)$v;}'));
+			} else {
+				$params['revision_id'] = array((integer) $params['revision_id']);
+			}
+			$strReq .= 'AND R.revision_id '.$this->core->con->in($params['revision_id']);
+		}
+		
+		if (isset($params['post_type'])) {
+			if (is_array($params['post_type']) && !empty($params['post_type'])) {
+				$strReq .= 'AND R.revision_type '.$this->core->con->in($params['revision_type']);
+			} elseif ($params['post_type'] != '') {
+				$strReq .= "AND R.revision_type = '".$this->core->con->escape($params['revision_type'])."' ";
+			}
+		}
+		
+		if (!empty($params['sql'])) {
+			$strReq .= $params['sql'].' ';
+		}
+		
+		if (!$count_only) {
+			if (!empty($params['order'])) {
+				$strReq .= 'ORDER BY '.$this->core->con->escape($params['order']).' ';
+			} else {
+				$strReq .= 'ORDER BY revision_dt DESC ';
+			}
+		}
+		
+		if (!$count_only && !empty($params['limit'])) {
+			$strReq .= $this->core->con->limit($params['limit']);
+		}
+		
+		$rs = $this->core->con->select($strReq);
+		$rs->core = $this->core;
+		$rs->extend('dcRevisionsExtensions');
+		
+		return $rs;
+	}
+	
+	public function addRevision($pcur,$post_id)
+	{
+		$rs = $this->core->con->select(
+			'SELECT MAX(revision_id) '.
+			'FROM '.$this->core->prefix.'revision' 
+		);
+		$revision_id = $rs->f(0) + 1; 
+		
+		$rs = $this->core->blog->getPosts(array('post_id' => $post_id));
+		
+		$old = array(
+			'post_excerpt' => $rs->post_excerpt,
+			'post_excerpt_xhtml' => $rs->post_excerpt_xhtml,
+			'post_content' => $rs->post_content,
+			'post_content_xhtml' => $rs->post_content_xhtml
+		);
+		$new = array(
+			'post_excerpt' => $pcur->post_excerpt,
+			'post_excerpt_xhtml' => $pcur->post_excerpt_xhtml,
+			'post_content' => $pcur->post_content,
+			'post_content_xhtml' => $pcur->post_content_xhtml
+		);
+		
+		$diff = $this->getDiff($new,$old);
+		
+		$insert = false;
+		foreach ($diff as $k => $v) {
+			if ($v !== '') {
+				$insert = true;
+			}
+		}
+		
+		if ($insert) {
+			$rcur = $this->core->con->openCursor($this->core->prefix.'revision');
+			$rcur->revision_id = $revision_id;
+			$rcur->post_id = $post_id;
+			$rcur->user_id = $this->core->auth->userID();
+			$rcur->blog_id = $this->core->blog->id;
+			$rcur->revision_dt = date('Y-m-d H:i:s');
+			$rcur->revision_tz = $this->core->auth->getInfo('user_tz');
+			$rcur->revision_type = $pcur->post_type;
+			$rcur->revision_excerpt_diff = $diff['post_excerpt'];
+			$rcur->revision_excerpt_xhtml_diff = $diff['post_excerpt_xhtml'];
+			$rcur->revision_content_diff = $diff['post_content'];
+			$rcur->revision_content_xhtml_diff = $diff['post_content_xhtml'];
+	 
+			$this->core->con->writeLock($this->core->prefix.'revision');
+			$rcur->insert();
+			$this->core->con->unlock();
+		}
+	}
+	
+	public function getDiff($n,$o)
+	{
+		$diff = array(
+			'post_excerpt' => '',
+			'post_excerpt_xhtml' => '',
+			'post_content' => '',
+			'post_content_xhtml' => ''
+		);
+		
+		try {
+			foreach ($diff as $k => $v) {
+				$diff[$k] = diff::uniDiff($n[$k],$o[$k]);
+			}
+		
+			return $diff;
+		}
+		catch (Exception $e)
+		{
+			$this->core->error->add($e->getMessage());
+		}
+	}
+	
+	public function setPatch($pid,$rid)
+	{
+		if (!$this->canPatch($rid)) {
+			throw new Exception(__('You are not allowed to patch this entry with this revision'));
+		}
+		
+  		try
+		{
+			$patch = $this->getPatch($pid,$rid);
+
+			$p = $this->core->blog->getPosts(array('post_id' => $pid));
+
+			$cur = $this->core->con->openCursor($this->core->prefix.'post');
+
+			$cur->post_title = $p->post_title;
+			$cur->cat_id = $p->cat_id ? $p->cat_id : null;
+			$cur->post_dt = $p->post_dt ? date('Y-m-d H:i:00',strtotime($p->post_dt)) : '';
+			$cur->post_format = $p->post_format;
+			$cur->post_password = $p->post_password;
+			$cur->post_lang = $p->post_lang;
+			$cur->post_notes = $p->post_notes;
+			$cur->post_status = $p->post_status;
+			$cur->post_selected = (integer) $p->post_selected;
+			$cur->post_open_comment = (integer) $p->post_open_comment;
+			$cur->post_open_tb = (integer) $p->post_open_tb;
+
+			$cur->post_excerpt = $patch['post_excerpt'];
+			$cur->post_excerpt_xhtml = $patch['post_excerpt_xhtml'];
+			$cur->post_content = $patch['post_content'];
+			$cur->post_content_xhtml = $patch['post_content_xhtml'];
+
+			# --BEHAVIOR-- adminBeforePostUpdate
+			$this->core->callBehavior('adminBeforePostUpdate',$cur,$pid);
+			
+			$this->core->auth->sudo(array($this->core->blog,'updPost'),$pid,$cur);
+			
+			# --BEHAVIOR-- adminAfterPostUpdate
+			$this->core->callBehavior('adminAfterPostUpdate',$cur,$pid);
+			
+			http::redirect('post.php?id='.$pid.'&upd=1');
+		}
+		catch (Exception $e)
+		{
+			$this->core->error->add($e->getMessage());
+		}
+	}
+	
+	public function getPatch($pid,$rid)
+	{
+		$params = array(
+			'post_id' => $pid
+		);
+		
+		$p = $this->core->blog->getPosts($params);
+		$r = $this->getRevisions($params);
+		
+		$patch = array(
+			'post_excerpt' => $p->post_excerpt,
+			'post_excerpt_xhtml' => $p->post_excerpt_xhtml,
+			'post_content' => $p->post_content,
+			'post_content_xhtml' => $p->post_content_xhtml
+		);
+
+		while ($r->fetch()) {
+			foreach ($patch as $k => $v) {
+				if ($k === 'post_excerpt') { $f = 'revision_excerpt_diff'; }
+				if ($k === 'post_excerpt_xhtml') { $f = 'revision_excerpt_xhtml_diff'; }
+				if ($k === 'post_content') { $f = 'revision_content_diff'; }
+				if ($k === 'post_content_xhtml') { $f = 'revision_content_xhtml_diff'; }
+				
+				$patch[$k] = diff::uniPatch($v,$r->{$f});
+			}
+
+			if ($r->revision_id === $rid) {
+				break;
+			}
+		}
+		
+		return $patch;
+	}
+	
+	protected function canPatch($ird)
+	{
+		$r = $this->getRevisions(array('revision_id' => $rid));
+		
+		return ($r->canPatch());
+	}
+}
+
+?>
Index: plugins/dcRevisions/js/_revision.js
===================================================================
--- plugins/dcRevisions/js/_revision.js	(revision 721)
+++ plugins/dcRevisions/js/_revision.js	(revision 721)
@@ -0,0 +1,155 @@
+/*
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2010 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+*/
+dotclear.revisionExpander = function() {
+	$('#revisions-list tr.line').each(function() {
+		var img = document.createElement('img');
+		img.src = dotclear.img_plus_src;
+		img.alt = dotclear.img_plus_alt;
+		img.className = 'expand';
+		$(img).css('cursor','pointer');
+		img.line = this;
+		img.onclick = function() {
+			dotclear.viewRevisionContent(this,this.line);
+		};
+		$(this).find('td.rid').prepend(img);
+	});
+};
+
+dotclear.viewRevisionContent = function(img,line) {
+	var revisionId = line.id.substr(1);
+	var postId = $("#id").val();
+	var tr = document.getElementById('re' + revisionId);
+	if (!tr ){
+		tr = document.createElement('tr');
+		tr.id = 're' + revisionId;
+		var td = document.createElement('td');
+		td.colSpan = 5;
+		td.className = 'expand';
+		tr.appendChild(td);
+		img.src = dotclear.img_minus_src;
+		img.alt = dotclear.img_minus_alt;
+		$.get(
+			'services.php',{
+				f: 'getPatch',
+				pid: postId,
+				rid: revisionId
+			},
+			function(data){
+				var rsp = $(data).children('rsp')[0];
+				if(rsp.attributes[0].value == 'ok'){
+					var excerpt_nodes = $(rsp).find('post_excerpt_xhtml').children();
+					var content_nodes = $(rsp).find('post_content_xhtml').children();
+					if (excerpt_nodes.size() == 0 && content_nodes.size() == 0) {
+						$(td).append('<strong>' + dotclear.msg.content_identical + '</strong>');
+					}
+					else {
+						var excerpt = $(rsp).find('post_excerpt_xhtml');
+						var content = $(rsp).find('post_content_xhtml');
+						var table = '<table class="preview-rev">';
+						table += dotclear.viewRevisionRender(excerpt_nodes,dotclear.msg.excerpt,revisionId);
+						table += dotclear.viewRevisionRender(content_nodes,dotclear.msg.content,revisionId);
+						table += '</table>';
+						$(td).append(table);
+					}
+				}
+				else {
+					alert($(rsp).find('message').text());
+				}
+			}
+		);
+		$(line).toggleClass('expand');
+		line.parentNode.insertBefore(tr,line.nextSibling);
+	}
+	else if (tr.style.display=='none') {
+		$(tr).toggle();
+		$(line).toggleClass('expand');
+		img.src = dotclear.img_minus_src;
+		img.alt = dotclear.img_minus_alt
+	}
+	else {
+		$(tr).toggle();
+		$(line).toggleClass('expand');
+		img.src = dotclear.img_plus_src;
+		img.alt = dotclear.img_plus_alt;
+	}
+};
+
+dotclear.viewRevisionRender = function(nodes,title,revisionId){
+	var res = lines = previous = '';
+		
+	nodes.each(function(k) {
+		var name = this.nodeName;
+		var content = $(this).text();
+		
+		var ol = $(this).attr('oline') != undefined ? $(this).attr('oline') : '';
+		var nl = $(this).attr('nline') != undefined ? $(this).attr('nline') : '';
+		
+		if (name == 'skip') {
+			ol = nl = '&hellip;';
+		}
+		
+		var class = '';
+		
+		if (name == 'skip') {
+			class = ' skip';
+		}
+		if (name == 'context') {
+			class = ' context';
+		}
+		if (name == 'insert') {
+			class = ' insert';
+		}
+		if (name == 'delete') {
+			class = ' delete';
+		}
+		
+		if (name != previous && (previous == '' || previous == 'context')) {
+			class += ' first';
+		}
+		var next = nodes.size() > k+1 ? nodes.get(k+1).nodeName : '';
+		if (name != next && next != 'insert' && next != 'delete') {
+			class += ' last';
+		}
+		
+		previous = name;
+		
+		lines += '<tr><td class="minimal col-line">'+ol+
+		'</td><td class="minimal col-line">'+nl+
+		'</td><td class="'+class+'">'+content+
+		'</td></tr>';
+	});
+	
+	if (lines != '') {
+		res = '<thead><tr class="rev-header"><th colspan="3">'+title+'</th></tr>'+
+		'<tr class="rev-number"><th class="minimal nowrap">'+dotclear.msg.current+
+		'</th><th class="minimal nowrap">r'+revisionId+
+		'</th><th class="maximal"></th></tr></thead><tbody>'+
+		lines + '</tbody>';
+	}
+	
+	return res;
+};
+
+$(function() {
+	$('#edit-entry').onetabload(function() {
+		$('#revisions-area label').toggleWithLegend(
+			$('#revisions-area').children().not('label'),{
+				cookie:'dcx_post_revisions',
+				fn:dotclear.revisionExpander()
+			}
+		);
+		$('#revisions-list tr.line a.patch').click(function() {
+			return window.confirm(dotclear.msg.confirm_apply_patch);
+		});
+	});
+});
Index: plugins/dcRevisions/style.css
===================================================================
--- plugins/dcRevisions/style.css	(revision 721)
+++ plugins/dcRevisions/style.css	(revision 721)
@@ -0,0 +1,82 @@
+/*
+# -- BEGIN LICENSE BLOCK ----------------------------------
+# This file is part of dcRevisions, a plugin for Dotclear.
+#
+# Copyright (c) 2011 Tomtom and contributors
+# http://blog.zenstyle.fr/
+#
+# Licensed under the GPL version 2.0 license.
+# A copy of this license is available in LICENSE file or at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+# -- END LICENSE BLOCK ------------------------------------
+*/
+#revisions-area { padding-bottom: 1em; }
+table#revisions-list { display: none; overflow: scroll; }
+table.preview-rev {
+	border-spacing: 0px;
+	border-collapse: separate;
+	overflow: scroll;
+}
+table.preview-rev, table.preview-rev tr, table.preview-rev th, table.preview-rev td  { border: none; }
+table.preview-rev thead {
+	border: 1px dotted #aaa;
+	background-color: #f3f3f3;
+}
+table.preview-rev tbody {
+	border: 1px dotted #aaa;
+}
+table.preview-rev thead tr.rev-header th, table.preview-rev thead tr.rev-number th {
+	border: 1px dotted #aaa;
+	text-align: center;
+}
+table.preview-rev td { font: normal 11px monospace; }
+table.preview-rev td.center { text-align: center; }
+table.preview-rev td.col-line {
+	background-color: #eceade;
+	color: #aaa;
+	border-right: 1px solid #ccc;
+	border-bottom: 1px solid #aaa;
+	border-left: 1px solid #ccc;
+	text-align: right;
+}
+/* Insert line */
+table.preview-rev td.insert {
+	background-color: #dfd;
+	border-color: #0a0;
+	border-style: solid;
+	border-width: 0 1px 0 1px;
+}
+/* Delete line */
+table.preview-rev td.delete {
+	background-color: #fdd;
+	border-color: #c00;
+	border-style: solid;
+	border-width: 0 1px 0 1px;
+}
+/* Skip line */
+table.preview-rev td.skip {
+	background-color: #F7F7F7;
+	color: #D7D7D7;
+	border-color: #D7D7D7;
+	border-style: solid;
+}
+/* Common lines */
+table.preview-rev td.first {
+	border-width: 1px 1px 0 1px;
+}
+table.preview-rev td.last {
+	border-width: 0 1px 1px 1px;
+}
+table.preview-rev td.first.last {
+	border-width: 1px;
+}
+table.preview-rev td.delete del {
+	text-decoration: none;
+	background-color: #e99;
+	padding: 0.2em 0 0.2em 0;
+}
+table.preview-rev td.insert ins {
+	text-decoration: none;
+	background-color: #9e9;
+	padding: 0.2em 0 0.2em 0;
+}
Index: plugins/fairTrackbacks/_define.php
===================================================================
--- plugins/fairTrackbacks/_define.php	(revision 464)
+++ plugins/fairTrackbacks/_define.php	(revision 270)
@@ -17,8 +17,6 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	array(
-		'permissions' =>	'usage,contentadmin',
-		'priority' =>		200
-	)
+	/* Permissions */		'usage,contentadmin',
+	/* Priority */			200
 );
 ?>
Index: plugins/importExport/_admin.php
===================================================================
--- plugins/importExport/_admin.php	(revision 324)
+++ plugins/importExport/_admin.php	(revision 270)
@@ -25,5 +25,5 @@
 function importExportDashboardFavs($core,$favs)
 {
-	$favs['importExport'] = new ArrayObject(array('importExport','Import/Export','plugin.php?p=importExport',
+	$favs['importExport'] = new ArrayObject(array('importExport',__('Import/Export'),'plugin.php?p=importExport',
 		'index.php?pf=importExport/icon.png','index.php?pf=importExport/icon-big.png',
 		'admin',null,null));
Index: plugins/importExport/_define.php
===================================================================
--- plugins/importExport/_define.php	(revision 464)
+++ plugins/importExport/_define.php	(revision 270)
@@ -17,8 +17,6 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'2.4',
-	array(
-		'permissions' => 'admin',
-		'priority' => 10
-	)
+	/* Permissions */		'admin',
+	/* Priority */			10
 );
 ?>
Index: plugins/importExport/inc/class.dc.export.flat.php
===================================================================
--- plugins/importExport/inc/class.dc.export.flat.php	(revision 557)
+++ plugins/importExport/inc/class.dc.export.flat.php	(revision 270)
@@ -157,6 +157,7 @@
 		'<p>'.sprintf(__('This will create an export of your current blog: %s'),
 		'<strong>'.html::escapeHTML($this->core->blog->name).'</strong>').'</p>'.
-		'<p><label for="file_name" class="classic">'.__('File name:').'</label>'.
+		'<p><label for="file_name" class="classic">'.__('File name:').' '.
 		form::field(array('file_name','file_name'),25,255,date('Y-m-d-').html::escapeHTML($this->core->blog->id.'-backup.txt')).
+		'</label> '.
 		'<input type="submit" value="'.__('Export').'" />'.
 		form::hidden(array('do'),'export_blog').
@@ -171,6 +172,7 @@
 			'<form action="'.$this->getURL(true).'" method="post">'.
 			'<fieldset><legend>'.__('Export all content').'</legend>'.
-			'<p><label for="file_name2" class="classic">'.__('File name:').'</label>'.
+			'<p><label for="file_name2" class="classic">'.__('File name:').' '.
 			form::field(array('file_name','file_name2'),25,255,date('Y-m-d-').'dotclear-backup.txt').
+			'</label> '.
 			'<input type="submit" value="'.__('Export all content').'" />'.
 			form::hidden(array('do'),'export_all').
Index: plugins/importExport/inc/class.dc.import.feed.php
===================================================================
--- plugins/importExport/inc/class.dc.import.feed.php	(revision 557)
+++ plugins/importExport/inc/class.dc.import.feed.php	(revision 270)
@@ -86,11 +86,11 @@
 		'<form action="'.$this->getURL(true).'" method="post">'.
 		
-		'<div class="fieldset">'.
+		'<fieldset>'.
 		$this->core->formNonce().
 		form::hidden(array('do'),1).
-		'<p><label for="feed_url">'.__('Feed URL:').'</label>'.
-		form::field('feed_url',40,300,html::escapeHTML($this->feed_url)).'</p>'.
-		'<p><input type="submit" value="'.__('Import').'" /></p>'.
-		'</div>'.
+		'<p><label for="feed_url">'.__('Feed URL:').' '.
+		form::field('feed_url',40,300,html::escapeHTML($this->feed_url)).'</label></p>'.
+		'<p><input type="submit" value="'.__('Send').'" /></p>'.
+		'</fieldset>'.
 		'</form>';
 	}
Index: plugins/importExport/inc/class.dc.import.flat.php
===================================================================
--- plugins/importExport/inc/class.dc.import.flat.php	(revision 557)
+++ plugins/importExport/inc/class.dc.import.flat.php	(revision 270)
@@ -160,11 +160,11 @@
 		'<form action="'.$this->getURL(true).'" method="post" enctype="multipart/form-data">'.
 		
-		'<div class="fieldset">'.
+		'<fieldset>'.
 		$this->core->formNonce().
 		form::hidden(array('do'),1).
 		form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
-		'<p><label for="up_single_file">'.__('Upload a backup file').'</label>'.
+		'<p><label for="up_single_file">'.__('Upload a backup file').' '.
 		'<input type="file" id="up_single_file" name="up_single_file" size="20" />'.
-		'</p>';
+		'</label></p>';
 		
 		$public_files = $this->getPublicFiles();
@@ -178,6 +178,6 @@
 		
 		echo
-		'<p><input type="submit" value="'.__('Import').'" /></p>'.
-		'</div>'.
+		'<p><input type="submit" value="'.__('Send').'" /></p>'.
+		'</fieldset>'.
 		'</form>';
 		
@@ -189,25 +189,25 @@
 			'<div>'.form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).'</div>'.
 			
-			'<div class="fieldset">'.
+			'<fieldset>'.
 			$this->core->formNonce().
 			form::hidden(array('do'),1).
 			form::hidden(array('MAX_FILE_SIZE'),DC_MAX_UPLOAD_SIZE).
-			'<p><label for="up_full_file">'.__('Upload a backup file').'</label>'.
+			'<p><label for="up_full_file">'.__('Upload a backup file').' '.
 			'<input type="file" id="up_full_file" name="up_full_file" size="20" />'.
-			'</p>';
+			'</label></p>';
 			
 			echo
-			'<p><label for="public_full_file">'.__('or pick up a local file in your public directory').'</label>'.
+			'<p><label for="public_full_file">'.__('or pick up a local file in your public directory').' '.
 			form::combo('public_full_file',$public_files, '', '', '', $empty).
-			'</p>';
+			'</label></p>';
 			
 			echo
-			'<p class="form-note warning"><strong>'.__('Warning: This will reset all the content of your database, except users.').'</strong></p>'.
-			
-			'<p><label for="your_pwd" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label>'.
-			form::password('your_pwd',20,255).'</p>'.
-			
-			'<p><input type="submit" value="'.__('Import').'" /></p>'.
-			'</div>'.
+			'<p><strong>'.__('Warning: This will reset all the content of your database, except users.').'</strong></p>'.
+			
+			'<p><label for="your_pwd">'.__('Your password:').
+			form::password('your_pwd',20,255).'</label></p>'.
+			
+			'<p><input type="submit" value="'.__('Send').'" /></p>'.
+			'</fieldset>'.
 			'</form>';
 		}
Index: plugins/importExport/inc/flat/class.dc.import.php
===================================================================
--- plugins/importExport/inc/flat/class.dc.import.php	(revision 298)
+++ plugins/importExport/inc/flat/class.dc.import.php	(revision 270)
@@ -371,8 +371,4 @@
 	private function insertPref($pref)
 	{
-		if ($this->prefExists($pref->pref_ws,$pref->pref_id,$pref->user_id)) {
-			return;
-		}
-		
 		$this->cur_pref->clean();
 		
@@ -755,21 +751,4 @@
 		$this->stack['users'][$user_id] = !$rs->isEmpty();
 		return $this->stack['users'][$user_id];
-	}
-	
-	private function prefExists($pref_ws,$pref_id,$user_id)
-	{
-		$strReq = 'SELECT pref_id,pref_ws,user_id '.
-				'FROM '.$this->prefix.'pref '.
-				"WHERE pref_id = '".$this->con->escape($pref_id)."' ".
-				"AND pref_ws = '".$this->con->escape($pref_ws)."' ";
-		if (!$user_id) {
-			$strReq .= "AND user_id IS NULL ";
-		} else {
-			$strReq .= "AND user_id = '".$this->con->escape($user_id)."' ";
-		}
-		
-		$rs = $this->con->select($strReq);
-		
-		return !$rs->isEmpty();
 	}
 	
Index: plugins/importExport/index.php
===================================================================
--- plugins/importExport/index.php	(revision 696)
+++ plugins/importExport/index.php	(revision 270)
@@ -17,5 +17,5 @@
 $modules['i'] = new ArrayObject(array(
 	'dcImportFlat' => dirname(__FILE__).'/inc/class.dc.import.flat.php',
-	'dcImportFeed' => dirname(__FILE__).'/inc/class.dc.import.feed.php'
+	'dcImportFeed' => dirname(__FILE__).'/inc/class.dc.import.feed.php',
 ));
 $modules['e'] = new ArrayObject(array(
@@ -97,5 +97,5 @@
 {
 	echo '<h2><a href="'.$p_url.'">'.__('Import/Export').'</a>'.
-	' &rsaquo; <span class="page-title">'.html::escapeHTML($current_module->name).'</span></h2>';
+	' &rsaquo; '.html::escapeHTML($current_module->name).'</h2>';
 	
 	echo '<div id="ie-gui">';
@@ -105,5 +105,5 @@
 else
 {
-	echo '<h2 class="page-title">'.__('Import/Export').'</h2>';
+	echo '<h2>'.__('Import/Export').'</h2>';
 	echo '<h3>'.__('Import').'</h3>';
 	
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 324)
+++ plugins/maintenance/_admin.php	(revision 270)
@@ -20,5 +20,5 @@
 function maintenanceDashboardFavs($core,$favs)
 {
-	$favs['maintenance'] = new ArrayObject(array('maintenance','Maintenance','plugin.php?p=maintenance',
+	$favs['maintenance'] = new ArrayObject(array('maintenance',__('Maintenance'),'plugin.php?p=maintenance',
 		'index.php?pf=maintenance/icon.png','index.php?pf=maintenance/icon-big.png',
 		null,null,null));
Index: plugins/maintenance/_define.php
===================================================================
--- plugins/maintenance/_define.php	(revision 464)
+++ plugins/maintenance/_define.php	(revision 270)
@@ -16,5 +16,6 @@
 	/* Description*/		"Maintain your database",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'1.1'
+	/* Version */			'1.1',
+	/* Permissions */		null
 );
 ?>
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 500)
+++ plugins/maintenance/index.php	(revision 270)
@@ -69,5 +69,5 @@
 
 <body>
-<h2 class="page-title"><?php echo __('Maintenance'); ?></h2>
+<h2><?php echo __('Maintenance'); ?></h2>
 
 <?php
Index: plugins/pages/_admin.php
===================================================================
--- plugins/pages/_admin.php	(revision 324)
+++ plugins/pages/_admin.php	(revision 270)
@@ -21,8 +21,8 @@
 function pages_dashboard_favs($core,$favs)
 {
-	$favs['pages'] = new ArrayObject(array('pages','Pages','plugin.php?p=pages',
+	$favs['pages'] = new ArrayObject(array('pages',__('Pages'),'plugin.php?p=pages',
 		'index.php?pf=pages/icon.png','index.php?pf=pages/icon-big.png',
 		'contentadmin,pages',null,null));
-	$favs['newpage'] = new ArrayObject(array('newpage','New page','plugin.php?p=pages&amp;act=page',
+	$favs['newpage'] = new ArrayObject(array('newpage',__('New page'),'plugin.php?p=pages&amp;act=page',
 		'index.php?pf=pages/icon-np.png','index.php?pf=pages/icon-np-big.png',
 		'contentadmin,pages',null,null));
Index: plugins/pages/_define.php
===================================================================
--- plugins/pages/_define.php	(revision 464)
+++ plugins/pages/_define.php	(revision 270)
@@ -17,8 +17,6 @@
 	/* Author */		"Olivier Meunier",
 	/* Version */		'1.1.1',
-	array(
-		'permissions' =>	'contentadmin,pages',
-		'priority' =>	999
-	)
+	/* Permissions */	'contentadmin,pages',
+	999
 );
 ?>
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 578)
+++ plugins/pages/list.php	(revision 270)
@@ -147,5 +147,4 @@
 	$combo_action[__('publish')] = 'publish';
 	$combo_action[__('unpublish')] = 'unpublish';
-	$combo_action[__('schedule')] = 'schedule';
 	$combo_action[__('mark as pending')] = 'pending';
 }
@@ -177,5 +176,5 @@
 <body>
 <?php
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Pages').'</span></h2>'.
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Pages').'</h2>'.
 '<p class="top-add"><a class="button add" href="'.$p_url.'&amp;act=page">'.__('New page').'</a></p>';
 
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 559)
+++ plugins/pages/page.php	(revision 270)
@@ -320,15 +320,18 @@
 
 echo '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="'.$p_url.'">'.__('Pages').'</a> &rsaquo; <span class="page-title">'.$page_title; 
-	if ($post_id) {
-		echo ' &ldquo;'.$post_title.'&rdquo;';
-	}
-echo	'</span></h2>';
+' &rsaquo; <a href="'.$p_url.'">'.__('Pages').'</a> &rsaquo; '.$page_title;
 
 if ($post_id && $post->post_status == 1) {
-	echo '<p><a href="'.$post->getURL().'" onclick="window.open(this.href);return false;" title="'.$post_title.' ('.__('new window').')'.'">'.__('Go to this page on the site').' <img src="images/outgoing-blue.png" alt="" /></a></p>';
-}
-
-echo '';
+	echo ' - <a id="post-preview" href="'.$post->getURL().'" class="button">'.__('View page').'</a>';
+} elseif ($post_id) {
+	$preview_url =
+	$core->blog->url.$core->url->getBase('pagespreview').'/'.
+	$core->auth->userID().'/'.
+	http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
+	'/'.$post->post_url;
+	echo ' - <a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview page').'</a>';
+}
+
+echo '</h2>';
 
 if ($post_id)
@@ -358,87 +361,38 @@
 	echo '<div class="multi-part" title="'.__('Edit page').'" id="edit-entry">';
 	echo '<form action="'.html::escapeURL($redir_url).'" method="post" id="entry-form">';
-
-	echo '<div id="entry-wrapper">';
-	echo '<div id="entry-content"><div class="constrained">';
-	
-	echo
-	'<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
-	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal').
-	'</label></p>'.
-	
-	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
-	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt)).
-	'</p>'.
-	
-	'<p class="area"><label class="required" '.
-	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
-	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content)).
-	'</p>';
-	
-	echo
-	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
-	form::textarea('post_notes',50,5,html::escapeHTML($post_notes)).
-	'</p>';
-
-	# --BEHAVIOR-- adminPageForm
-	$core->callBehavior('adminPageForm',isset($post) ? $post : null);
-	
-	echo
-	'<p>'.
-	($post_id ? form::hidden('id',$post_id) : '').
-	'<input type="submit" value="'.__('Save').' (s)" '.
-	'accesskey="s" name="save" /> ';
-
-	if ($post_id) {
-		$preview_url =
-		$core->blog->url.$core->url->getBase('pagespreview').'/'.
-		$core->auth->userID().'/'.
-		http::browserUID(DC_MASTER_KEY.$core->auth->userID().$core->auth->getInfo('user_pwd')).
-		'/'.$post->post_url;
-		echo '<a id="post-preview" href="'.$preview_url.'" class="button">'.__('Preview').'</a>';
-	}
-	
-	echo
-	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
-	$core->formNonce().
-	'</p>';
-	
-	echo '</div></div>';		// End #entry-content
-	echo '</div>';		// End #entry-wrapper
-
 	echo '<div id="entry-sidebar">';
 	
 	echo
 	'<p><label for="post_status">'.__('Page status:').
-	form::combo('post_status',$status_combo,$post_status,'','',!$can_publish).
+	form::combo('post_status',$status_combo,$post_status,'',3,!$can_publish).
 	'</label></p>'.
 	
 	'<p><label for="post_dt">'.__('Published on:').
-	form::field('post_dt',16,16,$post_dt).'</label></p>'.
+	form::field('post_dt',16,16,$post_dt,'',3).'</label></p>'.
 	
 	'<p><label for="post_format">'.__('Text formating:').
-	form::combo('post_format',$formaters_combo,$post_format).
+	form::combo('post_format',$formaters_combo,$post_format,'',3).
 	($post_id && $post_format != 'xhtml' ? '<a href="'.html::escapeURL($redir_url).'&amp;id='.$post_id.'&amp;xconv=1">'.__('Convert to XHTML').'</a>' : '').
 	'</label></p>'.
 	
-	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment).' '.
+	'<p><label for="post_open_comment" class="classic">'.form::checkbox('post_open_comment',1,$post_open_comment,'',3).' '.
 	__('Accept comments').'</label></p>'.
-	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb).' '.
+	'<p><label for="post_open_tb" class="classic">'.form::checkbox('post_open_tb',1,$post_open_tb,'',3).' '.
 	__('Accept trackbacks').'</label></p>'.
 	
 	'<p><label for="post_position" class="classic">'.__('Page position:').' '.
-	form::field('post_position',3,3,(string) $post_position).
+	form::field('post_position',3,3,(string) $post_position,'',3).
 	'</label></p>'.
 	
 	'<p><label for="post_lang">'.__('Page lang:').
-	form::combo('post_lang',$lang_combo,$post_lang).'</label></p>'.
+	form::combo('post_lang',$lang_combo,$post_lang,'',5).'</label></p>'.
 	
 	'<p><label for="post_password">'.__('Page password:').
-	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal').
+	form::field('post_password',10,32,html::escapeHTML($post_password),'maximal',3).
 	'</label></p>'.
 	
 	'<div class="lockable">'.
 	'<p><label for="post_url">'.__('Basename:').
-	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal').
+	form::field('post_url',10,255,html::escapeHTML($post_url),'maximal',3).
 	'</label></p>'.
 	'<p class="form-note warn">'.
@@ -489,4 +443,38 @@
 	echo '</div>';		// End #entry-sidebar
 	
+	echo '<div id="entry-content"><fieldset class="constrained">';
+	
+	echo
+	'<p class="col"><label for="post_title" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Title:').
+	form::field('post_title',20,255,html::escapeHTML($post_title),'maximal',2).
+	'</label></p>'.
+	
+	'<p class="area" id="excerpt-area"><label for="post_excerpt">'.__('Excerpt:').'</label> '.
+	form::textarea('post_excerpt',50,5,html::escapeHTML($post_excerpt),'',2).
+	'</p>'.
+	
+	'<p class="area"><label class="required" '.
+	'for="post_content"><abbr title="'.__('Required field').'">*</abbr> '.__('Content:').'</label> '.
+	form::textarea('post_content',50,$core->auth->getOption('edit_size'),html::escapeHTML($post_content),'',2).
+	'</p>';
+	
+	echo
+	'<p class="area" id="notes-area"><label for="post_notes">'.__('Notes:').'</label>'.
+	form::textarea('post_notes',50,5,html::escapeHTML($post_notes),'',2).
+	'</p>';
+
+	# --BEHAVIOR-- adminPageForm
+	$core->callBehavior('adminPageForm',isset($post) ? $post : null);
+	
+	echo
+	'<p>'.
+	($post_id ? form::hidden('id',$post_id) : '').
+	'<input type="submit" value="'.__('Save').' (s)" tabindex="4" '.
+	'accesskey="s" name="save" /> '.
+	($can_delete ? '<input type="submit" class="delete" value="'.__('Delete').'" name="delete" />' : '').
+	$core->formNonce().
+	'</p>';
+	
+	echo '</fieldset></div>';		// End #entry-content
 	echo '</form>';
 	echo '</div>';
@@ -578,5 +566,5 @@
 	
 	'<form action="comment.php" method="post" id="comment-form">'.
-	'<div class="constrained">'.
+	'<fieldset class="constrained">'.
 	'<p><label for="comment_author" class="required"><abbr title="'.__('Required field').'">*</abbr> '.__('Name:').
 	form::field('comment_author',30,255,html::escapeHTML($core->auth->getInfo('user_cn'))).
@@ -598,5 +586,5 @@
 	$core->formNonce().
 	'<input type="submit" name="add" value="'.__('Save').'" /></p>'.
-	'</div>'.
+	'</fieldset>'.
 	'</form>'.
 	'</div>';
Index: plugins/pings/_admin.php
===================================================================
--- plugins/pings/_admin.php	(revision 324)
+++ plugins/pings/_admin.php	(revision 270)
@@ -41,5 +41,5 @@
 function pingDashboardFavs($core,$favs)
 {
-	$favs['pings'] = new ArrayObject(array('pings','Pings','plugin.php?p=pings',
+	$favs['pings'] = new ArrayObject(array('pings',__('Pings'),'plugin.php?p=pings',
 		'index.php?pf=pings/icon.png','index.php?pf=pings/icon-big.png',
 		null,null,null));
Index: plugins/pings/_define.php
===================================================================
--- plugins/pings/_define.php	(revision 464)
+++ plugins/pings/_define.php	(revision 270)
@@ -17,7 +17,5 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	array(
-		'permissions' =>	'usage,contentadmin'
-	)
+	/* Permissions */		'usage,contentadmin'
 );
 ?>
Index: plugins/pings/index.php
===================================================================
--- plugins/pings/index.php	(revision 500)
+++ plugins/pings/index.php	(revision 270)
@@ -51,5 +51,5 @@
 <body>
 <?php
-echo '<h2 class="page-title">'.__('Pings configuration').'</h2>';
+echo '<h2>'.__('Pings configuration').'</h2>';
 
 if (!empty($_GET['up'])) {
Index: plugins/simpleMenu/_admin.php
===================================================================
--- plugins/simpleMenu/_admin.php	(revision 683)
+++ 	(revision )
@@ -1,32 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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_CONTEXT_ADMIN')) { return; }
-
-$core->addBehavior('adminDashboardIcons','simpleMenu_dashboard');
-$core->addBehavior('adminDashboardFavs','simpleMenu_dashboard_favs');
-function simpleMenu_dashboard($core,$icons)
-{
-	$icons['simpleMenu'] = new ArrayObject(array(__('Simple menu'),'plugin.php?p=simpleMenu','index.php?pf=simpleMenu/icon.png'));
-}
-function simpleMenu_dashboard_favs($core,$favs)
-{
-	$favs['simpleMenu'] = new ArrayObject(array('simpleMenu','Simple menu','plugin.php?p=simpleMenu',
-		'index.php?pf=simpleMenu/icon-small.png','index.php?pf=simpleMenu/icon.png',
-		'usage,contentadmin',null,null));
-}
-
-$_menu['Plugins']->addItem(__('Simple menu'),'plugin.php?p=simpleMenu','index.php?pf=simpleMenu/icon-small.png',
-                preg_match('/plugin.php\?p=simpleMenu(&.*)?$/',$_SERVER['REQUEST_URI']),
-                $core->auth->check('usage,contentadmin',$core->blog->id));
-
-require dirname(__FILE__).'/_widgets.php';
-?>
Index: plugins/simpleMenu/_define.php
===================================================================
--- plugins/simpleMenu/_define.php	(revision 685)
+++ 	(revision )
@@ -1,23 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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; }
-
-$this->registerModule(
-	/* Name */			"simpleMenu",
-	/* Description*/		"Simple menu for Dotclear",
-	/* Author */			"Franck Paul",
-	/* Version */			'1.0',
-	array(
-		'permissions' =>	'admin'
-	)
-);
-?>
Index: plugins/simpleMenu/_install.php
===================================================================
--- plugins/simpleMenu/_install.php	(revision 683)
+++ 	(revision )
@@ -1,29 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of simpleMenu, a plugin for Dotclear 2.
-#
-# Copyright (c) 2003-2011 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_CONTEXT_ADMIN')) { return; }
-
-$version = $core->plugins->moduleInfo('simpleMenu','version');
-if (version_compare($core->getVersion('simpleMenu'),$version,'>=')) {
-	return;
-}
-
-# Menu par défaut
-$blog_url = html::stripHostURL($core->blog->url);
-$menu_default = array(
-	array('label' => 'Home', 'descr' => 'Recent posts', 'url' => $blog_url),
-	array('label' => 'Archives', 'descr' => '', 'url' => $blog_url.$core->url->getBase('archive'))
-);
-$core->blog->settings->system->put('simpleMenu',serialize($menu_default),'string','simpleMenu default menu',false,true);
-
-$core->setVersion('simpleMenu',$version);
-return true;
-?>
Index: plugins/simpleMenu/_public.php
===================================================================
--- plugins/simpleMenu/_public.php	(revision 683)
+++ 	(revision )
@@ -1,116 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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; }
-
-require dirname(__FILE__).'/_widgets.php';
-
-# Simple menu template functions
-$core->tpl->addValue('SimpleMenu',array('tplSimpleMenu','simpleMenu'));
-
-class tplSimpleMenu
-{
-	# Template function
-	public static function simpleMenu($attr)
-	{
-		$class = isset($attr['class']) ? trim($attr['class']) : '';
-		$id = isset($attr['id']) ? trim($attr['id']) : '';
-		$description = isset($attr['description']) ? trim($attr['description']) : '';
-		
-		if (!preg_match('#^(title|span)$#',$description)) {
-			$description = '';
-		}
-		
-		return '<?php echo tplSimpleMenu::displayMenu('.
-				"'".addslashes($class)."',".
-				"'".addslashes($id)."',".
-				"'".addslashes($description)."'".
-			'); ?>';
-	}
-	
-	# Widget function
-	public static function simpleMenuWidget($w)
-	{
-		global $core, $_ctx;
-		
-		if ($w->homeonly && $core->url->type != 'default') {
-			return;
-		}
-
-		$menu = tplSimpleMenu::displayMenu('','','title');
-		if ($menu == '') {
-			return;
-		}
-
-		return '<div class="simple-menu">'.($w->title ? '<h2>'.html::escapeHTML($w->title).'</h2>' : '').$menu.'</div>';
-	}
-	
-	public static function displayMenu($class='',$id='',$description='')
-	{
-		$ret = '';
-
-		$menu = $GLOBALS['core']->blog->settings->system->get('simpleMenu');
-		$menu = @unserialize($menu);
-
-		if (is_array($menu)) 
-		{
-			// Current relative URL
-			$url = $_SERVER['REQUEST_URI'];
-			$abs_url = http::getHost().$url;
-		
-			// Home recognition var
-			$home_url = html::stripHostURL($GLOBALS['core']->blog->url);
-			$home_directory = dirname($home_url);
-			if ($home_directory != '/')
-				$home_directory = $home_directory.'/';
-
-			// Menu items loop
-			foreach ($menu as $i => $m) {
-				# $href = lien de l'item de menu
-				$href = $m['url'];
-				$href = html::escapeHTML($href);
-
-				# Active item test
-				$active = false;
-				if (($url == $href) || 
-					($abs_url == $href) || 
-					($_SERVER['URL_REQUEST_PART'] == $href) || 
-					(($_SERVER['URL_REQUEST_PART'] == '') && (($href == $home_url) || ($href == $home_directory)))) {
-					$active = true;
-				}
-				$title = $span = '';
-				if ($m['descr']) {
-					if ($description == 'title') {
-						$title = ' title="'.__($m['descr']).'"';
-					} else {
-						$span = ' <span>'.__($m['descr']).'</span>';
-					}
-				}
-				$ret .= '<li class="li'.($i+1).
-							($active ? ' active' : '').
-							($i == 0 ? ' li-first' : '').
-							($i == count($menu)-1 ? ' li-last' : '').
-						'">'.
-						'<a href="'.$href.'"'.$title.'>'.__($m['label']).$span.'</a>'.
-						'</li>';
-			}
-			
-			// Final rendering
-			if ($ret) {
-				$ret = '<ul '.($id ? 'id="'.$id.'"' : '').' class="simple-menu'.($class ? ' '.$class : '').'">'."\n".$ret."\n".'</ul>';
-			}
-		}
-
-		return $ret;
-	}
-}
-
-?>
Index: plugins/simpleMenu/_widgets.php
===================================================================
--- plugins/simpleMenu/_widgets.php	(revision 587)
+++ 	(revision )
@@ -1,25 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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; }
-
-$core->addBehavior('initWidgets',array('simpleMenuWidgets','initWidgets'));
-
-class simpleMenuWidgets
-{
-	public static function initWidgets($w)
-	{
-		$w->create('simplemenu',__('Simple menu'),array('tplSimpleMenu','simpleMenuWidget'));
-		$w->simplemenu->setting('title',__('Title:'),__('Menu'));
-		$w->simplemenu->setting('homeonly',__('Home page only'),1,'check');
-	}
-}
-?>
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 683)
+++ 	(revision )
@@ -1,572 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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_CONTEXT_ADMIN')) { return; }
-
-dcPage::check('admin');
-
-$page_title = __('Simple menu');
-
-# Url de base
-$p_url = 'plugin.php?p=simpleMenu';
-
-# Url du blog
-$blog_url = html::stripHostURL($core->blog->url);
-
-# Liste des catégories
-$categories_combo = array();
-$categories_label = array();
-try {
-	$rs = $core->blog->getCategories(array('post_type'=>'post'));
-	while ($rs->fetch()) {
-		$categories_combo[] = new formSelectOption(
-			str_repeat('&nbsp;&nbsp;',$rs->level-1).($rs->level-1 == 0 ? '' : '&bull; ').html::escapeHTML($rs->cat_title),
-			$rs->cat_url
-		);
-		$categories_label[$rs->cat_url] = html::escapeHTML($rs->cat_title);
-	}
-} catch (Exception $e) { }
-
-# Liste des langues utilisées
-$langs_combo = array();
-try {
-	$rs = $core->blog->getLangs(array('order'=>'asc'));
-	if ($rs->count() > 1)
-	{
-		$all_langs = l10n::getISOcodes(0,1);
-		while ($rs->fetch()) {
-			$lang_name = isset($all_langs[$rs->post_lang]) ? $all_langs[$rs->post_lang] : $rs->post_lang;
-			$langs_combo[$lang_name] = $rs->post_lang;
-		}
-		unset($all_langs);
-	}
-	unset($rs);
-} catch (Exception $e) { }
-
-# Liste des mois d'archive
-$months_combo = array();
-try {
-	$rs = $core->blog->getDates(array('type'=>'month'));
-	$months_combo[__('All months')] = '-';
-	$first_year = $last_year = 0;
-	while ($rs->fetch()) {
-		$months_combo[dt::str('%B %Y',$rs->ts())] = $rs->year().$rs->month();
-		if (($first_year == 0) || ($rs->year() < $first_year)) $first_year = $rs->year();
-		if (($last_year == 0) || ($rs->year() > $last_year)) $last_year = $rs->year();
-	}
-	unset($rs);
-} catch (Exception $e) { }
-
-# Liste des pages -- Doit être pris en charge plus tard par le plugin ?
-$pages_combo = array();
-try {
-	$rs = $core->blog->getPosts(array('post_type'=>'page'));
-	while ($rs->fetch()) {
-		$pages_combo[$rs->post_title] = $rs->getURL();
-	}
-	unset($rs);
-} catch (Exception $e) { }
-
-# Liste des tags -- Doit être pris en charge plus tard par le plugin ?
-$tags_combo = array();
-try {
-	$rs = $core->meta->getMetadata(array('meta_type' => 'tag'));
-	$tags_combo[__('All tags')] = '-';
-	while ($rs->fetch()) {
-		$tags_combo[$rs->meta_id] = $rs->meta_id;
-	}
-	unset($rs);
-} catch (Exception $e) { }
-
-# Liste des types d'item de menu
-$items = new ArrayObject();
-$items['home'] = new ArrayObject(array(__('Home'),false));
-
-if (count($langs_combo) > 1) {
-	$items['lang'] = new ArrayObject(array(__('Language'),true));
-}
-if (count($categories_combo)) {
-	$items['category'] = new ArrayObject(array(__('Category'),true));
-}
-if (count($months_combo) > 1) {
-	$items['archive'] = new ArrayObject(array(__('Archive'),true));
-}
-if ($core->plugins->moduleExists('pages')) {
-	if(count($pages_combo))
-		$items['pages'] = new ArrayObject(array(__('Page'),true));
-}
-if ($core->plugins->moduleExists('tags')) {
-	if (count($tags_combo) > 1)
-		$items['tags'] = new ArrayObject(array(__('Tags'),true));
-}
-
-# --BEHAVIOR-- adminSimpleMenuAddType
-# Should add an item to $items[<id>] as an array(<label>,<optional step (true or false)>)
-$core->callBehavior('adminSimpleMenuAddType',$items);
-
-$items['special'] = new ArrayObject(array(__('User defined'),false));
-
-$items_combo = array();
-foreach ($items as $k => $v) {
-	$items_combo[$v[0]] = $k;
-}
-
-# Lecture menu existant
-$menu = $core->blog->settings->system->get('simpleMenu');
-$menu = @unserialize($menu);
-if (!is_array($menu)) {
-	$menu = array();
-}
-
-# Récupération paramètres postés
-$item_type = isset($_POST['item_type']) ? $_POST['item_type'] : '';
-$item_select = isset($_POST['item_select']) ? $_POST['item_select'] : '';
-$item_label = isset($_POST['item_label']) ? $_POST['item_label'] : '';
-$item_descr = isset($_POST['item_descr']) ? $_POST['item_descr'] : '';
-$item_url = isset($_POST['item_url']) ? $_POST['item_url'] : '';
-
-# Traitement
-$step = (!empty($_GET['add']) ? (integer) $_GET['add'] : 0);
-if (($step > 4) || ($step < 0)) $step = 0;
-if ($step) {
-
-	# Récupération libellés des choix
-	$item_type_label = isset($items[$item_type]) ? $items[$item_type][0] : '';
-
-	switch ($step) {
-		case 1:
-			// First step, menu item type to be selected
-			$item_type = $item_select = '';
-			break;
-		case 2:
-			if ($items[$item_type][1]) {
-				// Second step (optional), menu item sub-type to be selected
-				$item_select = '';
-				break;
-			}
-		case 3:
-			// Third step, menu item attributes to be changed or completed if necessary
-			$item_select_label = '';
-			$item_label = __('Label');
-			$item_descr = __('Description');
-			$item_url = $blog_url;
-			switch ($item_type) {
-				case 'home':
-					$item_label = __('Home');
-					$item_descr = __('Recent posts');
-					break;
-				case 'lang':
-					$item_select_label = array_search($item_select,$langs_combo);
-					$item_label = $item_select_label;
-					$item_descr = sprintf(__('Switch to %s language'),$item_select_label);
-					$item_url .= $core->url->getBase('lang').$item_select;
-					break;
-				case 'category':
-					$item_select_label = $categories_label[$item_select];
-					$item_label = $item_select_label;
-					$item_descr = __('Recent Posts from this category');
-					$item_url .= $core->url->getBase('category').'/'.$item_select;
-					break;
-				case 'archive':
-					$item_select_label = array_search($item_select,$months_combo);
-					if ($item_select == '-') {
-						$item_label = __('Archives');
-						$item_descr = $first_year.($first_year != $last_year ? ' - '.$last_year : '');
-						$item_url .= $core->url->getBase('archive');
-					} else {
-						$item_label = $item_select_label;
-						$item_descr = sprintf(__('Posts from %s'),$item_select_label);
-						$item_url .= $core->url->getBase('archive').'/'.substr($item_select,0,4).'/'.substr($item_select,-2);
-					}
-					break;
-				case 'pages':
-					$item_select_label = array_search($item_select,$pages_combo);
-					$item_label = $item_select_label;
-					$item_descr = '';
-					$item_url = html::stripHostURL($item_select);
-					break;
-				case 'tags':
-					$item_select_label = array_search($item_select,$tags_combo);
-					if ($item_select == '-') {
-						$item_label = __('All tags');
-						$item_descr = '';
-						$item_url .= $core->url->getBase('tags');
-					} else {
-						$item_label = $item_select_label;
-						$item_descr = sprintf(__('Recent posts for %s tag'),$item_select_label);
-						$item_url .= $core->url->getBase('tag').'/'.$item_select;
-					}
-					break;
-				case 'special':
-					break;
-				default:
-					# --BEHAVIOR-- adminSimpleMenuBeforeEdit
-					# Should modify if necessary $item_label, $item_descr and $item_url
-					# Should set if necessary $item_select_label (displayed on further admin step only)
-					$core->callBehavior('adminSimpleMenuBeforeEdit',$item_type,$item_select,
-						array(&$item_label,&$item_descr,&$item_url,&$item_select_label));
-					break;
-			}
-			break;
-		case 4:
-			// Fourth step, menu item to be added
-			try {
-				if (($item_label != '') && ($item_url != '')) 
-				{
-					// Add new item menu in menu array
-					$menu[] = array(
-						'label' => $item_label,
-						'descr' => $item_descr,
-						'url' => $item_url
-					);
-					// Save menu in blog settings
-					$core->blog->settings->system->put('simpleMenu',serialize($menu));
-					$core->blog->triggerBlog();
-				
-					// All done successfully, return to menu items list
-					http::redirect($p_url.'&added=1');
-				} else {
-					throw new Exception(__('Label and URL of menu item are mandatory.'));
-				}
-			}
-			catch (Exception $e) {
-				$core->error->add($e->getMessage());
-			}
-			break;
-	}
-} else {
-	
-	# Remove selected menu items
-	if (!empty($_POST['removeaction']))
-	{
-		try {
-	 		if (!empty($_POST['items_selected'])) {
-				foreach ($_POST['items_selected'] as $k => $v) {
-					$menu[$v]['label'] = '';
-				}
-				$newmenu = array();
-				foreach ($menu as $k => $v) {
-					if ($v['label']) {
-						$newmenu[] = array(
-							'label' => $v['label'],
-							'descr' => $v['descr'],
-							'url' => $v['url']);
-					}
-				}
-				$menu = $newmenu;
-				// Save menu in blog settings
-				$core->blog->settings->system->put('simpleMenu',serialize($menu));
-				$core->blog->triggerBlog();
-				
-				// All done successfully, return to menu items list
-				http::redirect($p_url.'&removed=1');
-			} else {
-				throw new Exception(__('No menu items selected.'));
-			}
-		}
-		catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-
-	# Update menu items
-	if (!empty($_POST['updateaction']))
-	{
-		try {
-			foreach ($_POST['items_label'] as $k => $v) {
-				if (!$v) throw new Exception(__('Label is mandatory.'));
-			}
-			foreach ($_POST['items_url'] as $k => $v) {
-				if (!$v) throw new Exception(__('URL is mandatory.'));
-			}
-			$newmenu = array();
-			for ($i = 0; $i < count($_POST['items_label']); $i++)
-			{
-				$newmenu[] = array(
-					'label' => $_POST['items_label'][$i],
-					'descr' => $_POST['items_descr'][$i],
-					'url' => $_POST['items_url'][$i]);
-			}
-			$menu = $newmenu;
-			// Save menu in blog settings
-			$core->blog->settings->system->put('simpleMenu',serialize($menu));
-			$core->blog->triggerBlog();
-
-			// All done successfully, return to menu items list
-			http::redirect($p_url.'&updated=1');
-		}
-		catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-	
-	# Order menu items
-	$order = array();
-	if (empty($_POST['im_order']) && !empty($_POST['order'])) {
-		$order = $_POST['order'];
-		asort($order);
-		$order = array_keys($order);
-	} elseif (!empty($_POST['im_order'])) {
-		$order = $_POST['im_order'];
-		if (substr($order,-1) == ',') {
-			$order = substr($order,0,strlen($order)-1);
-		}
-		$order = explode(',',$order);
-	}
-
-	if (!empty($_POST['updateaction']) && !empty($order))
-	{
-		try {
-			$newmenu = array();
-			foreach ($order as $i => $k) {
-				$newmenu[] = array(
-					'label' => $menu[$k]['label'],
-					'descr' => $menu[$k]['descr'],
-					'url' => $menu[$k]['url']);
-			}
-			$menu = $newmenu;
-			// Save menu in blog settings
-			$core->blog->settings->system->put('simpleMenu',serialize($menu));
-			$core->blog->triggerBlog();
-
-			// All done successfully, return to menu items list
-			http::redirect($p_url.'&neworder=1');
-		} 
-		catch (Exception $e) {
-			$core->error->add($e->getMessage());
-		}
-	}
-	
-}
-
-# Display
-?>
-
-<html>
-<head>
-	<title><?php echo $page_title; ?></title>
-	<?php
-		echo
-			dcPage::jsToolMan().
-			# --BEHAVIOR-- adminPageHeaders
-			$core->callBehavior('adminPageHeaders');
-	?>
-	<?php 
-		$core->auth->user_prefs->addWorkspace('accessibility'); 
-		$user_dm_nodragdrop = $core->auth->user_prefs->accessibility->nodragdrop;
-	?>
-	<?php if (!$user_dm_nodragdrop) : ?>
-	<script type="text/javascript">
-	//<![CDATA[
-
-	var dragsort = ToolMan.dragsort();
-	$(function() {
-		dragsort.makeTableSortable($("#menuitemslist").get(0),
-		dotclear.sortable.setHandle,dotclear.sortable.saveOrder);
-
-		$('.checkboxes-helpers').each(function() {
-			dotclear.checkboxesHelpers(this);
-		});
-	});
-
-	dotclear.sortable = {
-		setHandle: function(item) {
-			var handle = $(item).find('td.handle').get(0);
-			while (handle.firstChild) {
-				handle.removeChild(handle.firstChild);
-			}
-
-			item.toolManDragGroup.setHandle(handle);
-			handle.className = handle.className+' handler';
-		},
-
-		saveOrder: function(item) {
-			var group = item.toolManDragGroup;
-			var order = document.getElementById('im_order');
-			group.register('dragend', function() {
-				order.value = '';
-				items = item.parentNode.getElementsByTagName('tr');
-
-				for (var i=0; i<items.length; i++) {
-					order.value += items[i].id.substr(2)+',';
-				}
-			});
-		}
-	};
-	//]]>
-	</script>
-	<?php endif; ?>
-	<!--
-	<link rel="stylesheet" type="text/css" href="index.php?pf=simpleMenu/style.css" />
-	-->
-</head>
-
-<body>
-
-<?php
-
-if (!empty($_GET['added'])) {
-	echo '<p class="message">'.__('Menu item has been successfully added.').'</p>';
-}
-if (!empty($_GET['removed'])) {
-	echo '<p class="message">'.__('Menu items have been successfully removed.').'</p>';
-}
-if (!empty($_GET['neworder'])) {
-	echo '<p class="message">'.__('Menu items have been successfully updated.').'</p>';
-}
-if (!empty($_GET['updated'])) {
-	echo '<p class="message">'.__('Menu items have been successfully updated.').'</p>';
-}
-
-if ($step) 
-{
-	// Formulaire d'ajout d'un item
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <a href="'.$p_url.'">'.$page_title.'</a> &rsaquo; <span class="page-title">'.__('Add item').'</span></h2>';
-	
-	switch ($step) {
-		case 1:
-			// Selection du type d'item
-			echo '<form id="additem" action="'.$p_url.'&add=2" method="post">';
-			echo '<fieldset><legend>'.__('Select type').'</legend>';
-			echo '<p class="field"><label for"item_type" class="classic">'.__('Type of item menu:').'</label>'.form::combo('item_type',$items_combo,'').'</p>';
-			echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue…').'" />'.'</p>';
-			echo '</fieldset>';
-			echo '</form>';
-			break;
-		case 2:
-			if ($items[$item_type][1]) {
-				// Choix à faire
-				echo '<form id="additem" action="'.$p_url.'&add=3" method="post">';
-				echo '<fieldset><legend>'.$item_type_label.'</legend>';
-				switch ($item_type) {
-					case 'lang':
-						echo '<p class="field"><label for"item_select" class="classic">'.__('Select language:').'</label>'.
-							form::combo('item_select',$langs_combo,'');
-						break;
-					case 'category':
-						echo '<p class="field"><label for"item_select" class="classic">'.__('Select category:').'</label>'.
-							form::combo('item_select',$categories_combo,'');
-						break;
-					case 'archive':
-						echo '<p class="field"><label for"item_select" class="classic">'.__('Select month (if necessary):').'</label>'.
-							form::combo('item_select',$months_combo,'');
-						break;
-					case 'pages':
-						echo '<p class="field"><label for"item_select" class="classic">'.__('Select page:').'</label>'.
-							form::combo('item_select',$pages_combo,'');
-						break;
-					case 'tags':
-						echo '<p class="field"><label for"item_select" class="classic">'.__('Select tag (if necessary):').'</label>'.
-							form::combo('item_select',$tags_combo,'');
-						break;
-					default:
-						echo
-							# --BEHAVIOR-- adminSimpleMenuSelect
-							# Optional step once $item_type known : should provide a field using 'item_select' as id
-							$core->callBehavior('adminSimpleMenuSelect',$item_type,'item_select');
-				}
-				echo form::hidden('item_type',$item_type);
-				echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Continue…').'" /></p>';
-				echo '</fieldset>';
-				echo '</form>';
-				break;
-			}
-		case 3:
-			// Libellé et description
-			echo '<form id="additem" action="'.$p_url.'&add=4" method="post">';
-			echo '<fieldset><legend>'.$item_type_label.($item_select_label != '' ? ' ('.$item_select_label.')' : '').'</legend>';
-			echo '<p class="field"><label for"item_label" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
-				__('Label of item menu:').'</label>'.form::field('item_label',20,255,$item_label).'</p>';
-			echo '<p class="field"><label for"item_descr" class="classic">'.
-				__('Description of item menu:').'</label>'.form::field('item_descr',30,255,$item_descr).'</p>';
-			echo '<p class="field"><label for"item_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.
-				__('URL of item menu:').'</label>'.form::field('item_url',40,255,$item_url).'</p>';
-			echo form::hidden('item_type',$item_type).form::hidden('item_select',$item_select);
-			echo '<p>'.$core->formNonce().'<input type="submit" name="appendaction" value="'.__('Add this item').'" /></p>';
-			echo '</fieldset>';
-			echo '</form>';
-			break;
-	}
-}
-
-// Liste des items
-if (!$step) {
-	echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.$page_title.'</span></h2>';
-}
-
-if (!$step) {
-	echo '<form id="menuitemsappend" action="'.$p_url.'&add=1" method="post">';
-	echo '<p>'.$core->formNonce().'<input class="add" type="submit" name="appendaction" value="'.__('Add an item').'" /></p>';
-	echo '</form>';
-}
-
-if (count($menu)) {
-	if (!$step) {
-		echo '<form id="menuitems" action="'.$p_url.'" method="post">';
-	}
-	// Entête table
-	echo 
-		'<table class="maximal dragable">'.
-		'<caption>'.__('Menu items list').'</caption>'.
-		'<thead>'.
-		'<tr>';
-	if (!$step) {
-		echo '<th scope="col"></th>';
-		echo '<th scope="col"></th>';
-	}
-	echo
-		'<th scope="col">'.__('Label').'</th>'.
-		'<th scope="col">'.__('Description').'</th>'.
-		'<th scope="col">'.__('URL').'</th>'.
-		'</tr>'.
-		'</thead>'.
-		'<tbody id="menuitemslist">';
-	$count = 0;
-	foreach ($menu as $i => $m) {
-		echo '<tr class="line" id="l_'.$i.'">';
-		if (!$step) {
-			$count++;
-			echo '<td class="handle minimal">'.form::field(array('order['.$i.']'),2,3,$count,'position','',false,'title="'.sprintf(__('position of %s'),__($m['label'])).'"').
-				form::hidden(array('dynorder[]','dynorder-'.$i),$i).'</td>';
-			echo '<td class="minimal">'.form::checkbox(array('items_selected[]','ims-'.$i),$i).'</td>';
-			echo '<td class="nowrap" scope="row">'.form::field(array('items_label[]','iml-'.$i),20,255,__($m['label'])).'</td>';
-			echo '<td class="nowrap">'.form::field(array('items_descr[]','imd-'.$i),30,255,__($m['descr'])).'</td>';
-			echo '<td class="nowrap">'.form::field(array('items_url[]','imu-'.$i),40,255,$m['url']).'</td>';
-		} else {
-			echo '<td class="nowrap" scope="row">'.__($m['label']).'</td>';
-			echo '<td class="nowrap">'.__($m['descr']).'</td>';
-			echo '<td class="nowrap">'.$m['url'].'</td>';
-		}
-		echo '</tr>';
-	}
-	echo '</tbody>'.
-		'</table>';
-	if (!$step) {
-		echo '<div class="two-cols">';
-		echo '<p class="col">'.form::hidden('im_order','').$core->formNonce();
-		echo '<input type="submit" name="updateaction" value="'.__('Update menu').'" />'.'</p>';
-		echo '<p class="col right">'.'<input type="submit" class="delete" name="removeaction" '.
-				'value="'.__('Delete selected menu items').'" '.
-				'onclick="return window.confirm(\''.html::escapeJS(__('Are you sure you want to remove selected menu items?')).'\');" />'.
-			'</p>';
-		echo '</div>';
-		echo '</form>';
-	}
-} else {
-	echo
-		'<p>'.__('Currently no menu items').'</p>';
-}
-
-dcPage::helpBlock('simpleMenu');
-?>
-
-</body>
-</html>
Index: plugins/simpleMenu/locales/en/help/help.html
===================================================================
--- plugins/simpleMenu/locales/en/help/help.html	(revision 553)
+++ 	(revision )
@@ -1,31 +1,0 @@
-<html>
-<head>
-  <title>Simple Menu</title>
-</head>
-
-<body>
-
-<h3>Simple Menu</h3>
-<p>Simple Menu allows you to display on your blog a single level menu, if your theme supports it.</p>
-<dl>
-  <dt>Menu items list</dt>
-  <dd>Here are displayed your menu items. 
-  You can reorder this list by dragging its items upwards or downwards. You can also modify label, description and URL of each item.
-  Once done, clic on "Update menu".</dd>
-    
-  <dt>Delete selected menu items</dt>
-  <dd>Allows you to delete menu items by checking the boxes next to each of them.</dd>
-  
-  <dt>Add a new menu item</dt>
-  <dd>First select the type of item. Then clic on "Continue…". Then, if necessary, you may have to define a sub-type (category, page, etc). If so, do it and clic on "Continue…". Then finally you can modify proposals done for label, description (not mandatory) and URL of the menu item. Once done, clic on "Add this item".</dd>
-  <dd>
-    <ul>
-      <li><strong>Label : </strong>Type here the anchor text. For example "Archives". This field is mandatory.</li>
-      <li><strong>Description : </strong>Type here a short description for the menu item (will be displayed under Label depending on theme selected). For example "Archives from 2004 to 2011".</li>
-      <li><strong>URL : </strong>Type here the item's destination. This field is mandatory.</li>
-	</ul>
-  </dd>
-
-</dl>
-</body>
-</html>
Index: plugins/simpleMenu/locales/en/resources.php
===================================================================
--- plugins/simpleMenu/locales/en/resources.php	(revision 553)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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 (!isset($__resources['help']['simpleMenu']))
-{
-	$__resources['help']['simpleMenu'] = dirname(__FILE__).'/help/help.html';
-}
-
-?>
Index: plugins/simpleMenu/locales/fr/help/help.html
===================================================================
--- plugins/simpleMenu/locales/fr/help/help.html	(revision 553)
+++ 	(revision )
@@ -1,31 +1,0 @@
-<html>
-<head>
-  <title>Menu simple</title>
-</head>
-
-<body>
-
-<h3>Menu simple</h3>
-<p>Menu simple vous permet d’afficher un menu limité à un seul niveau sur votre blog, si votre thème le supporte.</p>
-<dl>
-  <dt>Liste des items de menu</dt>
-  <dd>Ici sont affichés les items de votre menu. 
-  Vous pouvez les ordonner en déplaçant les lignes vers le haut ou vers le bas. Vous pouvez également modifier le libellé, la description et l’URL de chacun des items.
-  Une fois terminé, cliquez sur « Mettre à jour le menu ».</dd>
-    
-  <dt>Supprimer les items de menu sélectionnés</dt>
-  <dd>Vous permet de supprimer les items de menu que vous souhaitez en cochant les cases pour chacun d’eux.</dd>
-  
-  <dt>Ajouter un item de menu</dt>
-  <dd>Tout d’abord sélectionnez le type d’item que vous désirez, puis cliquez sur « Continuer… ». Ensuite, si nécessaire, vous pouvez avoir à précisez votre choix (catégorie, page, etc). Dans ce cas, faites-le et cliquez sur « Continuer… ». Enfin vous pouvez modifier les propositions qui vous sont faites pour le libellé, la description (facultative) et l’URL de l’item de menu. Une fois effectué cliquer sur « Ajouter cet item ».</dd>
-  <dd>
-    <ul>
-      <li><strong>Libelllé : </strong>Indiquez ici le libellé. Par exemple "Archives". Ce champs est obligatoire.</li>
-      <li><strong>Description : </strong>Indiquez ici une courte description pour cet item (sera affiché sous le libellé en fonction du thème sélectionné). Par exemple "Archives de 2004 à 2011".</li>
-      <li><strong>URL : </strong>Indiquez ici la destination. Ce champs est obligatoire.</li>
-	</ul>
-  </dd>
-
-</dl>
-</body>
-</html>
Index: plugins/simpleMenu/locales/fr/main.po
===================================================================
--- plugins/simpleMenu/locales/fr/main.po	(revision 552)
+++ 	(revision )
@@ -1,125 +1,0 @@
-msgid "Simple menu"
-msgstr "Menu simple"
-
-msgid "Simple menu for Dotclear"
-msgstr "Menu simple pour Dotclear"
-
-msgid "All months"
-msgstr "Tous les mois"
-
-msgid "Tags"
-msgstr "Mots-clés"
-
-msgid "User defined"
-msgstr "Saisie libre"
-
-msgid "Label"
-msgstr "Libellé"
-
-msgid "Description"
-msgstr "Description"
-
-msgid "URL"
-msgstr "URL"
-
-msgid "Recent posts"
-msgstr "Billets récents"
-
-msgid "Switch to %s language"
-msgstr "Basculer vers le %s"
-
-msgid "Recent Posts from this category"
-msgstr "Billets récents de cette catégorie"
-
-msgid "Archives"
-msgstr "Archives"
-
-msgid "Posts from %s"
-msgstr "Billets de %s"
-
-msgid "All tags"
-msgstr "Tous les mots clés"
-
-msgid "Recent posts for %s tag"
-msgstr "Billets récent pour le mot-clé %s"
-
-msgid "Label and URL of menu item are mandatory."
-msgstr "Les libellés et URL sont obligatoires."
-
-msgid "No menu items selected."
-msgstr "Aucun item de menu sélectionné."
-
-msgid "Label is mandatory."
-msgstr "Le libellé est obligatoire."
-
-msgid "URL is mandatory."
-msgstr "l’URL est obligatoire."
-
-msgid "Menu item has been successfully added."
-msgstr "L'item de menu a été ajouté avec succès."
-
-msgid "Menu items have been successfully removed."
-msgstr "Le ou les items de menu ont été supprimés avec succès."
-
-msgid "Menu items have been successfully updated."
-msgstr "Le ou les items de menu ont été mis à jour avec succès."
-
-msgid "Add item"
-msgstr "Ajouter un item de menu"
-
-msgid "Select type"
-msgstr "Sélection du type"
-
-msgid "Type of item menu:"
-msgstr "Type d'item de menu :"
-
-msgid "Continue…"
-msgstr "Continuer…"
-
-msgid "Select language:"
-msgstr "Sélectionnez la langue :"
-
-msgid "Select category:"
-msgstr "Sélectionnez la catégorie :"
-
-msgid "Select month (if necessary):"
-msgstr "Sélectionnez le mois (si nécessaire) :"
-
-msgid "Select page:"
-msgstr "Sélectionnez la page :"
-
-msgid "Select tag (if necessary):"
-msgstr "Sélectionnez le mot clé (si nécessaire) :"
-
-msgid "Label of item menu:"
-msgstr "Libellé de l'item de menu :"
-
-msgid "Description of item menu:"
-msgstr "Description de l'item de menu :"
-
-msgid "URL of item menu:"
-msgstr "URL de l'item de menu :"
-
-msgid "Add this item"
-msgstr "Ajouter cet item"
-
-msgid "Menu items list"
-msgstr "Liste des items de menu"
-
-msgid "position of %s"
-msgstr "position de %s"
-
-msgid "Currently no menu items"
-msgstr "Aucun item de menu pour l'instant"
-
-msgid "Add an item"
-msgstr "Ajouter un item de menu"
-
-msgid "Update menu"
-msgstr "Mettre à jour le menu"
-
-msgid "Delete selected menu items"
-msgstr "Supprimer les items de menu sélectionnés"
-
-msgid "Are you sure you want to remove selected menu items?"
-msgstr "Êtes-vous sûr de vouloir supprimer les items de menu sélectionnés ?"
Index: plugins/simpleMenu/locales/fr/resources.php
===================================================================
--- plugins/simpleMenu/locales/fr/resources.php	(revision 553)
+++ 	(revision )
@@ -1,18 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2011 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 (!isset($__resources['help']['simpleMenu']))
-{
-	$__resources['help']['simpleMenu'] = dirname(__FILE__).'/help/help.html';
-}
-
-?>
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 720)
+++ plugins/tags/_admin.php	(revision 270)
@@ -31,5 +31,5 @@
 
 $core->addBehavior('adminPreferencesForm',array('tagsBehaviors','adminUserForm'));
-// $core->addBehavior('adminUserForm',array('tagsBehaviors','adminUserForm'));
+$core->addBehavior('adminUserForm',array('tagsBehaviors','adminUserForm'));
 
 $core->addBehavior('adminBeforeUserCreate',array('tagsBehaviors','setTagListFormat'));
@@ -45,5 +45,5 @@
 	public static function dashboardFavs($core,$favs)
 	{
-		$favs['tags'] = new ArrayObject(array('tags','Tags','plugin.php?p=tags&amp;m=tags',
+		$favs['tags'] = new ArrayObject(array('tags',__('Tags'),'plugin.php?p=tags&amp;m=tags',
 			'index.php?pf=tags/icon.png','index.php?pf=tags/icon-big.png',
 			'usage,contentadmin',null,null));
@@ -82,5 +82,5 @@
 		echo
 		'<h3><label for="post_tags">'.__('Tags:').'</label></h3>'.
-		'<div class="p" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal').'</div>';
+		'<div class="p" id="tags-edit">'.form::textarea('post_tags',20,3,$value,'maximal',3).'</div>';
 	}
 	
@@ -227,5 +227,5 @@
 		{
 			echo
-			'<h2 class="page-title">'.__('Add tags to entries').'</h2>'.
+			'<h2>'.__('Add tags to entries').'</h2>'.
 			'<form action="posts_actions.php" method="post">'.
 			'<div><label for="new_tags" class="area">'.__('Tags to add:').'</label> '.
@@ -257,5 +257,5 @@
 			}
 			
-			echo '<h2 class="page-title">'.__('Remove selected tags from entries').'</h2>';
+			echo '<h2>'.__('Remove selected tags from entries').'</h2>';
 			
 			if (empty($tags)) {
Index: plugins/tags/_define.php
===================================================================
--- plugins/tags/_define.php	(revision 464)
+++ plugins/tags/_define.php	(revision 270)
@@ -17,7 +17,5 @@
 	/* Author */			"Olivier Meunier",
 	/* Version */			'1.1',
-	array(
-		'permissions' =>	'usage,contentadmin'
-	)
+	/* Permissions */		'usage,contentadmin'
 );
 ?>
Index: plugins/tags/_public.php
===================================================================
--- plugins/tags/_public.php	(revision 413)
+++ plugins/tags/_public.php	(revision 270)
@@ -44,6 +44,4 @@
 
 $core->addBehavior('templateBeforeBlock',array('behaviorsTags','templateBeforeBlock'));
-$core->addBehavior('tplSysIfConditions',array('behaviorsTags','tplSysIfConditions'));
-$core->addBehavior('publicBeforeDocument',array('behaviorsTags','addTplPath'));
 
 class behaviorsTags
@@ -72,22 +70,4 @@
 		}
 	}
-	
-	public static function tplIfConditions($tag, $attr,$content,$if)
-	{
-		if ($tag == 'Sys' && isset($attr['has_tag'])) {
-			$sign = '';
-			if (substr($attr['has_tag'],0,1) == '!') {
-				$sign = '!';
-				$attr['has_tag'] = substr($attr['has_tag'],1);
-			}
-			$if[] =  $sign."(\$core->tpl->tagExists('".addslashes($attr['has_tag'])."') )";
-		}
-	}
-	
-	public static function addTplPath($core)
-	{
-		$core->tpl->setPath($core->tpl->getPath(), dirname(__FILE__).'/default-templates');
-	}
-
 }
 
Index: plugins/tags/default-templates/tag.html
===================================================================
--- plugins/tags/default-templates/tag.html	(revision 413)
+++ 	(revision )
@@ -1,153 +1,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots}}" />
-  
-  <title>{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf></title>
-  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  
-  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
-  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tag}} - {{tpl:TagID}} - {{tpl:BlogName encode_html="1"}}<tpl:PaginationIf start="0"> - {{tpl:lang page}} {{tpl:PaginationCurrent}}</tpl:PaginationIf>" />
-  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
-  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  <meta name="dc.type" content="text" />
-  <meta name="dc.format" content="text/html" />
-  
-  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
-  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
-  
-  <tpl:Entries no_content="1">
-    <tpl:EntriesHeader>
-      <tpl:Pagination>
-        <tpl:PaginationIf end="0">
-        <link rel="prev" title="{{tpl:lang previous entries}}" href="{{tpl:PaginationURL offset="1"}}" />
-        </tpl:PaginationIf>
-        
-        <tpl:PaginationIf start="0">
-        <link rel="next" title="{{tpl:lang next entries}}" href="{{tpl:PaginationURL offset="-1"}}" />
-        </tpl:PaginationIf>
-      </tpl:Pagination>
-    </tpl:EntriesHeader>
-    
-    <link rel="chapter" href="{{tpl:EntryURL}}" title="{{tpl:EntryTitle encode_html="1"}}" />
-  </tpl:Entries>
-  
-  <link rel="alternate" type="application/atom+xml" title="Atom 1.0" href="{{tpl:TagFeedURL type="atom"}}" />
-  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
-  
-  {{tpl:include src="_head.html"}}
-</head>
-
-<body class="dc-tag">
-<div id="page">
-{{tpl:include src="_top.html"}}
-
-<div id="wrapper">
-
-<div id="main">
-  <div id="content">
-  
-  <div id="content-info">
-    <h2>{{tpl:lang Tag}} - {{tpl:TagID}}</h2>
-    
-    <p><a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}"
-    title="{{tpl:lang This tag's entries Atom feed}}" class="feed">{{tpl:lang Entries feed}}</a>
-    
-    <tpl:SysIf operator="or" comments_active="1" pings_active="1">
-    - <a type="application/atom+xml" href="{{tpl:TagFeedURL type="atom"}}/comments"
-    title="{{tpl:lang This tag's comments Atom feed}}" class="feed">{{tpl:lang Comments feed}}</a>
-    </tpl:SysIf>
-    </p>
-  </div>
-  
-  <tpl:Entries>
-    <div id="p{{tpl:EntryID}}" class="post {{tpl:EntryIfOdd}} {{tpl:EntryIfFirst}}" lang="{{tpl:EntryLang}}" xml:lang="{{tpl:EntryLang}}">
-    <!-- # New day date -->
-    <tpl:DateHeader><p class="day-date">{{tpl:EntryDate}}</p></tpl:DateHeader>
-    
-    <h2 class="post-title"><a
-    href="{{tpl:EntryURL}}">{{tpl:EntryTitle encode_html="1"}}</a></h2>
-    
-    <p class="post-info">{{tpl:lang By}} {{tpl:EntryAuthorLink}}
-    {{tpl:lang on}} {{tpl:EntryDate}}, {{tpl:EntryTime}}
-    <tpl:EntryIf has_category="1">
-    - <a href="{{tpl:EntryCategoryURL}}">{{tpl:EntryCategory encode_html="1"}}</a>
-    </tpl:EntryIf>
-    </p>
-    
-    <tpl:EntryTags>
-    <tpl:TagsHeader><ul class="post-tags"></tpl:TagsHeader>
-    <li><a href="{{tpl:TagURL}}">{{tpl:TagID}}</a></li>
-    <tpl:TagsFooter></ul></tpl:TagsFooter>
-    </tpl:EntryTags>
-    
-    <!-- # --BEHAVIOR-- publicEntryBeforeContent -->
-    {{tpl:SysBehavior behavior="publicEntryBeforeContent"}}
-    
-    <!-- # Entry with an excerpt -->
-    <tpl:EntryIf extended="1">
-      <div class="post-content">{{tpl:EntryExcerpt}}</div>
-      <p class="read-it"><a href="{{tpl:EntryURL}}"
-      title="{{tpl:lang Continue reading}} {{tpl:EntryTitle encode_html="1"}}">{{tpl:lang Continue
-      reading}}</a>...</p>
-    </tpl:EntryIf>
-    
-    <!-- # Entry without excerpt -->
-    <tpl:EntryIf extended="0">
-      <div class="post-content">{{tpl:EntryContent}}</div>
-    </tpl:EntryIf>
-    
-    <!-- # --BEHAVIOR-- publicEntryAfterContent -->
-    {{tpl:SysBehavior behavior="publicEntryAfterContent"}}
-    
-    <!-- # Number of comments, trackbacks and attachments -->
-    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
-      <p class="post-info-co">
-    </tpl:EntryIf>
-    <tpl:EntryIf show_comments="1">
-      <a href="{{tpl:EntryURL}}#comments" class="comment_count">{{tpl:EntryCommentCount}}</a>
-    </tpl:EntryIf>
-    <tpl:EntryIf show_pings="1">
-      <a href="{{tpl:EntryURL}}#pings" class="ping_count">{{tpl:EntryPingCount}}</a></tpl:EntryIf>
-    <tpl:EntryIf has_attachment="1">
-      <a href="{{tpl:EntryURL}}#attachments" class="attach_count">{{tpl:EntryAttachmentCount}}</a></tpl:EntryIf>
-    <tpl:EntryIf operator="or" show_comments="1" show_pings="1" has_attachment="1">
-      </p>
-    </tpl:EntryIf>
-    </div>
-    
-    <tpl:EntriesFooter>
-      <tpl:Pagination>
-        <p class="pagination"><tpl:PaginationIf end="0"><a href="{{tpl:PaginationURL offset="+1"}}" class="prev">&#171;
-        {{tpl:lang previous entries}}</a> - </tpl:PaginationIf>
-        {{tpl:lang page}} {{tpl:PaginationCurrent}} {{tpl:lang of}} {{tpl:PaginationCounter}}
-        <tpl:PaginationIf start="0"> - <a href="{{tpl:PaginationURL offset="-1"}}" class="next">{{tpl:lang next entries}}
-        &#187;</a></tpl:PaginationIf></p>
-      </tpl:Pagination>
-    </tpl:EntriesFooter>
-  </tpl:Entries>
-  </div>
-</div> <!-- End #main -->
-
-<div id="sidebar">
-  <div id="blognav">
-    {{tpl:Widgets type="nav"}}
-  </div> <!-- End #blognav -->
-  
-  <div id="blogextra">
-    {{tpl:Widgets type="extra"}}
-  </div> <!-- End #blogextra -->
-</div>
-
-</div> <!-- End #wrapper -->
-
-{{tpl:include src="_footer.html"}}
-</div> <!-- End #page -->
-</body>
-</html>
Index: plugins/tags/default-templates/tags.html
===================================================================
--- plugins/tags/default-templates/tags.html	(revision 413)
+++ 	(revision )
@@ -1,69 +1,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="{{tpl:BlogLanguage}}" lang="{{tpl:BlogLanguage}}">
-<head>
-  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
-  <meta name="ROBOTS" content="{{tpl:BlogMetaRobots robots="NOINDEX"}}" />
-  
-  <title>{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}</title>
-  <meta name="copyright" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="author" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  
-  <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
-  <meta name="dc.title" lang="{{tpl:BlogLanguage}}" content="{{tpl:lang Tags}} - {{tpl:BlogName encode_html="1"}}" />
-  <meta name="dc.language" content="{{tpl:BlogLanguage}}" />
-  <meta name="dc.publisher" content="{{tpl:BlogEditor encode_html="1"}}" />
-  <meta name="dc.rights" content="{{tpl:BlogCopyrightNotice encode_html="1"}}" />
-  <meta name="dc.date" scheme="W3CDTF" content="{{tpl:BlogUpdateDate iso8601="1"}}" />
-  <meta name="dc.type" content="text" />
-  <meta name="dc.format" content="text/html" />
-  
-  <link rel="top" href="{{tpl:BlogURL}}" title="{{tpl:lang Home}}" />
-  <link rel="contents" href="{{tpl:BlogArchiveURL}}" title="{{tpl:lang Archives}}" />
-  
-  <link rel="meta" type="application/xbel+xml" title="Blogroll" href="{{tpl:BlogrollXbelLink}}" />
-  
-  {{tpl:include src="_head.html"}}
-</head>
-
-<body class="dc-tags">
-<div id="page">
-{{tpl:include src="_top.html"}}
-
-<div id="wrapper">
-
-<div id="main">
-  <div id="content">
-  
-  <div id="content-info">
-    <h2>{{tpl:lang Tags}}</h2>
-  </div>
-  
-  <div class="content-inner">  
-  <ul class="tags">
-    <tpl:Tags>
-      <li><a href="{{tpl:TagURL}}" class="tag{{tpl:TagRoundPercent}}">{{tpl:TagID}}</a></li>
-    </tpl:Tags>
-    </ul>
-  </div>
-  
-  </div>
-</div> <!-- End #main -->
-
-<div id="sidebar">
-  <div id="blognav">
-    {{tpl:Widgets type="nav"}}
-  </div> <!-- End #blognav -->
-  
-  <div id="blogextra">
-    {{tpl:Widgets type="extra"}}
-  </div> <!-- End #blogextra -->
-</div>
-
-</div> <!-- End #wrapper -->
-
-{{tpl:include src="_footer.html"}}
-</div> <!-- End #page -->
-</body>
-</html>
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 711)
+++ plugins/tags/tag_posts.php	(revision 270)
@@ -93,5 +93,5 @@
 <html>
 <head>
-  <title><?php echo __('Tags'); ?></title>
+  <title>Tags</title>
   <link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />
   <script type="text/javascript" src="js/_posts_list.js"></script>
@@ -110,5 +110,5 @@
 
 <h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo;
-<span class="page-title"><?php echo __('Edit tag').' &ldquo;'.html::escapeHTML($tag).'&rdquo;'; ?></span></h2>
+<?php echo __('Edit tag'); ?></h2>
 
 <?php
@@ -125,24 +125,12 @@
 		echo
 		'<form action="'.$this_url.'" method="post">'.
-		'<div class="fieldset"><h3>'.__('Actions for this tag').'</h3>'.
-		'<p><label for="new_tag_id">'.__('Edit tag name:').'</label>'.
+		'<p><label for="new_tag_id" class="classic">'.__('Rename this tag:').' '.
 		form::field('new_tag_id',20,255,html::escapeHTML($tag)).
-		'<input type="submit" value="'.__('Rename').'" />'.
-		$core->formNonce().
+		'</label> <input type="submit" value="'.__('Save').'" />'.
+		$core->formNonce().'</p>'.
 		'</form>';
-		# Remove tag
-		if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) {
-			echo
-			'<form id="tag_delete" action="'.$this_url.'" method="post">'.
-			'<p class="no-margin">'.__('Delete this tag:').'</p>'.
-			'<input type="submit" class="delete" name="delete" value="'.__('Delete').'" />'.
-			$core->formNonce().
-			'</form>';
-		}
-		echo '</p></div>';
 	}
 	
 	# Show posts
-	echo '<h3>'.__('List of entries with this tag').'</h3>';
 	$post_list->display($page,$nb_per_page,
 	'<form action="posts_actions.php" method="post" id="form-entries">'.
@@ -162,4 +150,13 @@
 	'</div>'.
 	'</form>');
+	
+	# Remove tag
+	if (!$posts->isEmpty() && $core->auth->check('contentadmin',$core->blog->id)) {
+		echo
+		'<form id="tag_delete" action="'.$this_url.'" method="post">'.
+		'<p><input type="submit" class="delete" name="delete" value="'.__('Delete this tag').'" />'.
+		$core->formNonce().'</p>'.
+		'</form>';
+	}
 }
 ?>
Index: plugins/tags/tags.php
===================================================================
--- plugins/tags/tags.php	(revision 711)
+++ plugins/tags/tags.php	(revision 270)
@@ -15,5 +15,5 @@
 <html>
 <head>
-  <title><?php echo __('Tags'); ?></title>
+  <title>Tags</title>
   <link rel="stylesheet" type="text/css" href="index.php?pf=tags/style.css" />
 </head>
@@ -21,5 +21,5 @@
 <body>
 <h2><?php echo html::escapeHTML($core->blog->name); ?> &rsaquo;
-<span class="page-title"><?php echo __('Tags'); ?></span></h2>
+<?php echo __('Tags'); ?></h2>
 
 <?php
Index: plugins/themeEditor/_define.php
===================================================================
--- plugins/themeEditor/_define.php	(revision 464)
+++ plugins/themeEditor/_define.php	(revision 270)
@@ -16,5 +16,6 @@
 	/* Description*/		"Theme Editor",
 	/* Author */			"Olivier Meunier",
-	/* Version */			'0.9'
+	/* Version */			'0.9',
+	/* Permissions */		null
 );
 ?>
Index: plugins/themeEditor/index.php
===================================================================
--- plugins/themeEditor/index.php	(revision 500)
+++ plugins/themeEditor/index.php	(revision 270)
@@ -69,5 +69,5 @@
 <body>
 <?php echo '<h2>'.html::escapeHTML($core->blog->name).
-' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; <span class="page-title">'.__('Theme Editor').'</span></h2>'; ?>
+' &rsaquo; <a href="blog_theme.php">'.__('Blog appearance').'</a> &rsaquo; '.__('Theme Editor').'</h2>'; ?>
 
 <p><strong><?php echo sprintf(__('Your current theme on this blog is "%s".'),html::escapeHTML($T['name'])); ?></strong></p>
Index: plugins/userPref/_define.php
===================================================================
--- plugins/userPref/_define.php	(revision 589)
+++ plugins/userPref/_define.php	(revision 3)
@@ -16,5 +16,6 @@
 	/* Description*/		"Manage every user preference directive",
 	/* Author */			"Franck Paul",
-	/* Version */			'0.2'
+	/* Version */			'0.1',
+	/* Permissions */		null
 );
 ?>
Index: plugins/userPref/index.php
===================================================================
--- plugins/userPref/index.php	(revision 589)
+++ plugins/userPref/index.php	(revision 270)
@@ -11,14 +11,4 @@
 # -- END LICENSE BLOCK -----------------------------------------
 if (!defined('DC_CONTEXT_ADMIN')) { return; }
-
-# Local navigation
-if (!empty($_POST['gp_nav'])) {
-	http::redirect($p_url.$_POST['gp_nav']);
-	exit;
-}
-if (!empty($_POST['lp_nav'])) {
-	http::redirect($p_url.$_POST['lp_nav']);
-	exit;
-}
 
 # Local prefs update
@@ -82,5 +72,5 @@
 	return
 	'<tr>'.
-	'<td scope="raw"><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
+	'<td><label for="s_'.$id.'">'.sprintf($slabel,html::escapeHTML($id)).'</label></td>'.
 	'<td>'.$field.'</td>'.
 	'<td>'.$s['type'].'</td>'.
@@ -94,22 +84,6 @@
   <?php echo dcPage::jsPageTabs($part); ?>
   <style type="text/css">
-	table.prefs { border: 1px solid #999; margin-bottom: 2em; }
-	table.prefs th { background: #f5f5f5; color: #444; padding-top: 0.3em; padding-bottom: 0.3em; }
-	p.anchor-nav {float: right; }
+  .ns-name { background: #ccc; color: #000; padding-top: 0.3em; padding-bottom: 0.3em; font-size: 1.1em; }
   </style>
-	<script type="text/javascript">
-	//<![CDATA[
-	$(function() {
-		$("#gp_submit").hide();
-		$("#lp_submit").hide();
-		$("#gp_nav").change(function() {
-			window.location = $("#gp_nav option:selected").val();
-		})
-		$("#lp_nav").change(function() {
-			window.location = $("#lp_nav option:selected").val();
-		})
-	});
-	//]]>
-	</script>
 </head>
 
@@ -124,22 +98,18 @@
 }
 ?>
-<h2><?php echo html::escapeHTML($core->auth->userID()); ?> &rsaquo; <span class="page-title">user:preferences</span></h2>
+<h2><?php echo html::escapeHTML($core->auth->userID()); ?> &rsaquo; user:preferences</h2>
 
 <div id="local" class="multi-part" title="<?php echo __('user preferences'); ?>">
+<form action="plugin.php" method="post">
+<table>
+<tr>
+  <th class="nowrap">Pref ID</th>
+  <th><?php echo __('Value'); ?></th>
+  <th><?php echo __('Type'); ?></th>
+  <th class="maximal"><?php echo __('Description'); ?></th>
+</tr>
+<?php
+$prefs = array();
 
-<?php 
-$table_header = '<table class="prefs" id="%s"><caption>%s</caption>'.
-'<thead>'.
-'<tr>'."\n".
-'  <th class="nowrap">Setting ID</th>'."\n".
-'  <th>'.__('Value').'</th>'."\n".
-'  <th>'.__('Type').'</th>'."\n".
-'  <th class="maximalx">'.__('Description').'</th>'."\n".
-'</tr>'."\n".
-'</thead>'."\n".
-'<tbody>';
-$table_footer = '</tbody></table>';
-
-$prefs = array();
 foreach ($core->auth->user_prefs->dumpWorkspaces() as $ws => $workspace) {
 	foreach ($workspace->dumpPrefs() as $k => $v) {
@@ -147,35 +117,19 @@
 	}
 }
+
 ksort($prefs);
-if (count($prefs) > 0) {
-	$ws_combo = array();
-	foreach ($prefs as $ws => $s) {
-		$ws_combo[$ws] = '#l_'.$ws;
-	}
-	echo 
-		'<form action="plugin.php" method="post">'.
-		'<p class="anchor-nav">'.
-		'<label for="lp_nav" class="classic">'.__('Goto:').'</label> '.form::combo('lp_nav',$ws_combo).
-		' <input type="submit" value="'.__('Ok').'" id="lp_submit" />'.
-		'<input type="hidden" name="p" value="aboutConfig" />'.
-		$core->formNonce().'</p></form>';
-}
-?>
 
-<form action="plugin.php" method="post">
-
-<?php
 foreach ($prefs as $ws => $s)
 {
 	ksort($s);
-	echo sprintf($table_header,'l_'.$ws,$ws);
+	echo '<tr><td colspan="4" class="ws-name">workspace: <strong>'.$ws.'</strong></td></tr>';
+	
 	foreach ($s as $k => $v)
 	{
 		echo prefLine($k,$v,$ws,'s',!$v['global']);
 	}
-	echo $table_footer;
 }
 ?>
-
+</table>
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="userPref" />
@@ -185,5 +139,12 @@
 
 <div id="global" class="multi-part" title="<?php echo __('global preferences'); ?>">
-
+<form action="plugin.php" method="post">
+<table>
+<tr>
+  <th class="nowrap">Pref ID</th>
+  <th><?php echo __('Value'); ?></th>
+  <th><?php echo __('Type'); ?></th>
+  <th class="maximal"><?php echo __('Description'); ?></th>
+</tr>
 <?php
 $prefs = array();
@@ -197,34 +158,16 @@
 ksort($prefs);
 
-if (count($prefs) > 0) {
-	$ws_combo = array();
-	foreach ($prefs as $ws => $s) {
-		$ws_combo[$ws] = '#g_'.$ws;
-	}
-	echo 
-		'<form action="plugin.php" method="post">'.
-		'<p class="anchor-nav">'.
-		'<label for="gp_nav" class="classic">'.__('Goto:').'</label> '.form::combo('gp_nav',$ws_combo).
-		' <input type="submit" value="'.__('Ok').'" id="gp_submit" />'.
-		'<input type="hidden" name="p" value="aboutConfig" />'.
-		$core->formNonce().'</p></form>';
-}
-?>
-
-<form action="plugin.php" method="post">
-
-<?php
 foreach ($prefs as $ws => $s)
 {
 	ksort($s);
-	echo sprintf($table_header,'g_'.$ws,$ws);
+	echo '<tr><td colspan="4" class="ws-name">workspace: <strong>'.$ws.'</strong></td></tr>';
+	
 	foreach ($s as $k => $v)
 	{
 		echo prefLine($k,$v,$ws,'gs',false);
 	}
-	echo $table_footer;
 }
 ?>
-
+</table>
 <p><input type="submit" value="<?php echo __('Save'); ?>" />
 <input type="hidden" name="p" value="userPref" />
Index: plugins/widgets/_admin.php
===================================================================
--- plugins/widgets/_admin.php	(revision 324)
+++ plugins/widgets/_admin.php	(revision 270)
@@ -16,5 +16,5 @@
 function widgets_dashboard_favs($core,$favs)
 {
-	$favs['widgets'] = new ArrayObject(array('widgets','Presentation widgets','plugin.php?p=widgets',
+	$favs['widgets'] = new ArrayObject(array('widgets',__('Presentation widgets'),'plugin.php?p=widgets',
 		'index.php?pf=widgets/icon.png','index.php?pf=widgets/icon-big.png',
 		'admin',null,null));
Index: plugins/widgets/_default_widgets.php
===================================================================
--- plugins/widgets/_default_widgets.php	(revision 665)
+++ plugins/widgets/_default_widgets.php	(revision 270)
@@ -79,5 +79,5 @@
 # Default widgets
 global $__default_widgets;
-$__default_widgets = array('nav'=> new dcWidgets(), 'extra'=> new dcWidgets(), 'custom'=> new dcWidgets());
+$__default_widgets = array('nav'=> new dcWidgets(), 'extra'=> new dcWidgets());
 
 $__default_widgets['nav']->append($__widgets->search);
Index: plugins/widgets/_define.php
===================================================================
--- plugins/widgets/_define.php	(revision 665)
+++ plugins/widgets/_define.php	(revision 270)
@@ -15,10 +15,8 @@
 	/* Name */			"Widgets",
 	/* Description*/		"Widgets for your blog sidebars",
-	/* Author */			"Olivier Meunier & Dotclear Team",
-	/* Version */			'3',
-	array(
-		'permissions' =>	'admin',
-		'priority' =>		1000000000
-	)
+	/* Author */			"Olivier Meunier",
+	/* Version */			'2',
+	/* Permissions */		'admin',
+	/* Priority */			1000000000
 );
 ?>
Index: plugins/widgets/_install.php
===================================================================
--- plugins/widgets/_install.php	(revision 665)
+++ plugins/widgets/_install.php	(revision 270)
@@ -31,9 +31,4 @@
 	$settings->widgets->put('widgets_extra','','string','Extra widgets',false);
 }
-if ($settings->widgets->widgets_custom != null) {
-	$settings->widgets->put('widgets_custom',dcWidgets::load($settings->widgets->widgets_custom)->store());
-} else {
-	$settings->widgets->put('widgets_custom','','string','Custom widgets',false);
-}
 $core->setVersion('widgets',$version);
 return true;
Index: plugins/widgets/_public.php
===================================================================
--- plugins/widgets/_public.php	(revision 671)
+++ plugins/widgets/_public.php	(revision 270)
@@ -36,5 +36,4 @@
 	{
 		$wtype = 'widgets_'.$type;
-		$GLOBALS['core']->blog->settings->addNameSpace('widgets');
 		$widgets = $GLOBALS['core']->blog->settings->widgets->{$wtype};
 		
Index: plugins/widgets/_widgets_functions.php
===================================================================
--- plugins/widgets/_widgets_functions.php	(revision 475)
+++ plugins/widgets/_widgets_functions.php	(revision 270)
@@ -94,5 +94,5 @@
 			$rs->cat_url.'">'.
 			html::escapeHTML($rs->cat_title).'</a>'.
-			($w->postcount ? ' <span>('.$rs->nb_post.')</span>' : '');
+			($w->postcount ? ' ('.$rs->nb_post.')' : '');
 			
 			
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 683)
+++ plugins/widgets/index.php	(revision 270)
@@ -14,5 +14,5 @@
 include dirname(__FILE__).'/_default_widgets.php';
 
-# Loading navigation, extra widgets and custom widgets
+# Loading navigation and extra widgets
 $widgets_nav = null;
 if ($core->blog->settings->widgets->widgets_nav) {
@@ -23,14 +23,9 @@
 	$widgets_extra = dcWidgets::load($core->blog->settings->widgets->widgets_extra);
 }
-$widgets_custom = null;
-if ($core->blog->settings->widgets->widgets_custom) {
-	$widgets_custom = dcWidgets::load($core->blog->settings->widgets->widgets_custom);
-}
 
 $append_combo = array(
 	'-' => 0,
 	__('navigation') => 'nav',
-	__('extra') => 'extra',
-	__('custom') => 'custom'
+	__('extra') => 'extra'
 );
 
@@ -41,5 +36,5 @@
 	$addw = array();
 	foreach ($_POST['addw'] as $k => $v) {
-		if (($v == 'extra' || $v == 'nav' || $v == 'custom') && $__widgets->{$k} !== null ) {
+		if (($v == 'extra' || $v == 'nav') && $__widgets->{$k} !== null ) {
 			$addw[$k] = $v;
 		}
@@ -54,7 +49,4 @@
 		if (!($widgets_extra instanceof dcWidgets)) {
 			$widgets_extra = new dcWidgets();
-		}
-		if (!($widgets_custom instanceof dcWidgets)) {
-			$widgets_custom = new dcWidgets();
 		}
 		
@@ -68,7 +60,5 @@
 					$widgets_extra->append($__widgets->{$k});
 					break;
-				case 'custom':
-					$widgets_custom->append($__widgets->{$k});
-					break;
+				
 			}
 		}
@@ -78,5 +68,4 @@
 			$core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store());
 			$core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store());
-			$core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store());
 			$core->blog->triggerBlog();
 			http::redirect($p_url);
@@ -112,16 +101,11 @@
 			$_POST['w']['extra'] = array();
 		}
-		if (!isset($_POST['w']['custom'])) {
-			$_POST['w']['custom'] = array();
-		}
 		
 		$widgets_nav = dcWidgets::loadArray($_POST['w']['nav'],$__widgets);
 		$widgets_extra = dcWidgets::loadArray($_POST['w']['extra'],$__widgets);
-		$widgets_custom = dcWidgets::loadArray($_POST['w']['custom'],$__widgets);
 		
 		$core->blog->settings->addNamespace('widgets');
 		$core->blog->settings->widgets->put('widgets_nav',$widgets_nav->store());
 		$core->blog->settings->widgets->put('widgets_extra',$widgets_extra->store());
-		$core->blog->settings->widgets->put('widgets_custom',$widgets_custom->store());
 		$core->blog->triggerBlog();
 		
@@ -140,5 +124,4 @@
 		$core->blog->settings->widgets->put('widgets_nav','');
 		$core->blog->settings->widgets->put('widgets_extra','');
-		$core->blog->settings->widgets->put('widgets_custom','');
 		$core->blog->triggerBlog();
 		
@@ -180,5 +163,5 @@
 <body>
 <?php
-echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; <span class="page-title">'.__('Widgets').'</span></h2>';
+echo '<h2>'.html::escapeHTML($core->blog->name).' &rsaquo; '.__('Widgets').'</h2>';
 
 # All widgets
@@ -204,5 +187,5 @@
 '</div>'.
 '</fieldset>'.
-'<p><input type="submit" class="js-remove" name="append" value="'.__('Add widgets to sidebars').'" />'.
+'<p><input type="submit" class="js-remove" name="append" value="'.__('add widgets to sidebars').'" />'.
 $core->formNonce().'</p>'.
 '</form>';
@@ -221,15 +204,9 @@
 '</div>';
 
-# Custom sidebar
-echo
-'<div id="sidebarCustom" class="widgets">'.
-sidebarWidgets('dndcustom',__('Custom sidebar'),$widgets_custom,'custom',$__default_widgets['custom'],$j).
-'</div>';
-
 echo
 '<p id="sidebarsControl">'.
 $core->formNonce().
-'<input type="submit" name="wup" value="'.__('Update sidebars').'" /> '.
-'<input type="submit" class="reset" name="wreset" value="'.__('Reset sidebars').'" /></p>'.
+'<input type="submit" name="wup" value="'.__('update sidebars').'" /> '.
+'<input type="submit" class="reset" name="wreset" value="'.__('reset sidebars').'" /></p>'.
 '</form>';
 
Index: plugins/widgets/style.css
===================================================================
--- plugins/widgets/style.css	(revision 665)
+++ plugins/widgets/style.css	(revision 3)
@@ -18,8 +18,4 @@
 	width: 49%;
 	margin-left: 1%;
-}
-#sidebarCustom {
-	float: left;
-	width: 100%;
 }
 
Index: plugins/widgets/widgets.js
===================================================================
--- plugins/widgets/widgets.js	(revision 665)
+++ plugins/widgets/widgets.js	(revision 0)
@@ -10,9 +10,7 @@
 	var w_nav = document.getElementById('dndnav');
 	var w_ext = document.getElementById('dndextra');
-	var w_custom = document.getElementById('dndcustom');
 	
 	w_nav.className = 'hideControls';
 	w_ext.className = 'hideControls';
-	w_custom.className = 'hideControls';
 	
 	removeElements(document.getElementById('listWidgets'),'input');
@@ -20,12 +18,9 @@
 	removeElements(w_nav,'p');
 	removeElements(w_ext,'p');
-	removeElements(w_custom,'p');
 	hideElements(w_nav,'input');
 	hideElements(w_ext,'input');
-	hideElements(w_custom,'input');
 	
 	configControls(w_nav);
 	configControls(w_ext);
-	configControls(w_custom);
 	
 	dragdrop.makeListContainer(widgets,'div',setHandle);
@@ -35,6 +30,4 @@
 	dragdrop.makeListContainer(w_ext,'div',setHandle);
 	w_ext.onDragEnd = extraDragEnd;
-	dragdrop.makeListContainer(w_custom,'div',setHandle);
-	w_custom.onDragEnd = customDragEnd;
 	
 	// Helper to remove some elements
@@ -68,9 +61,4 @@
 	function extraDragEnd() {
 		formControls(this.parentNode,'extra');
-		configControls(this.parentNode);
-		removeEmptyMsg(this.parentNode);
-	}
-	function customDragEnd() {
-		formControls(this.parentNode,'custom');
 		configControls(this.parentNode);
 		removeEmptyMsg(this.parentNode);
