Index: admin/_charte.php
===================================================================
--- admin/_charte.php	(revision 2160)
+++ admin/_charte.php	(revision 2111)
@@ -23,5 +23,5 @@
 	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 	<title>Bibliothèque de styles - Dotclear - 2.6</title>
-	<link rel="icon" type="image/png" href="images/favicon96-login.png" />
+	<link rel="icon" type="image/png" href="images/favicon.png" />
 	<!--[if lt IE 9]>
 	<script type="text/javascript" src="js/ie7/IE9.js"></script>
@@ -158,5 +158,5 @@
 						</div><!--
 						--><div class="two-boxes even">
-							<p><span class="step">2</span> On peut assortir une boîte des class <code>"odd"</code> (nothing left) et <code>"even"</code> pour que les marges se placent correctement.</p>
+							<p><span class="step">2</span> S'il n'y a que deux boîtes, une autre class n'est pas nécessaire. S'il y en a plusieurs, il est conseillé de leur attribuer alternativement les class <code>"odd"</code> et <code>"even"</code> pour que les marges se placent correctement.</p>
 						</div><!--
 						--><div class="two-boxes odd">
Index: admin/auth.php
===================================================================
--- admin/auth.php	(revision 2160)
+++ admin/auth.php	(revision 2143)
@@ -268,7 +268,5 @@
   <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   <title><?php echo html::escapeHTML(DC_VENDOR_NAME); ?></title>
-  <link rel="icon" type="image/png" href="images/favicon96-logout.png" />
-  <link rel="shortcut icon" href="favicon.ico" type="image/x-icon" />
-
+  <link rel="icon" type="image/png" href="images/favicon-off.png" />
   
 <?php
Index: admin/blog.php
===================================================================
--- admin/blog.php	(revision 2166)
+++ admin/blog.php	(revision 1615)
@@ -72,5 +72,5 @@
 				__('System') => '',
 				__('Blogs') => 'blogs.php',
-				__('New blog') => ''
+				'<span class="page-title">'.__('New blog').'</span>' => ''
 			))
 	);
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 2166)
+++ admin/blog_del.php	(revision 1733)
@@ -54,5 +54,5 @@
 			__('System') => '',
 			__('Blogs') => 'blogs.php',
-			__('Delete a blog') => ''
+			'<span class="page-title">'.__('Delete a blog').'</span>' => ''
 		))
 );
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 2166)
+++ admin/blog_pref.php	(revision 2028)
@@ -270,7 +270,6 @@
 		array(
 			html::escapeHTML($blog_name) => '',
-			__('Blog settings') => ''
-		)
-	);
+			'<span class="page-title">'.__('Blog settings').'</span>' => ''
+		));
 } else {
 	$breadcrumb = dcPage::breadcrumb(
@@ -278,5 +277,5 @@
 			__('System') => '',
 			__('Blogs') => 'blogs.php',
-			__('Blog settings').' : '.html::escapeHTML($blog_name) => ''
+			'<span class="page-title">'.__('Blog settings').' : '.html::escapeHTML($blog_name).'</span>' => ''
 		));
 }
Index: admin/blog_theme.php
===================================================================
--- admin/blog_theme.php	(revision 2182)
+++ admin/blog_theme.php	(revision 1553)
@@ -15,32 +15,9 @@
 dcPage::check('admin');
 
-# --------------------------------------------------
-# @todo Add settings to Dotclear update features
-if ($core->blog->settings->system->repository_theme_url === null) {
-	$core->blog->settings->system->put(
-		'repository_theme_url', 'http://update.dotaddict.org/dc2/themes.xml', 'string', 'Themes XML feed location', true, true
-	);
-}
-# --------------------------------------------------
-
-# -- Loading themes --
+# Loading themes
 $core->themes = new dcThemes($core);
-$core->themes->loadModules($core->blog->themes_path, null);
-
-# -- Repository helper --
-$repository = new dcRepository(
-	$core->themes, 
-	$core->blog->settings->system->repository_theme_url
-);
-$repository->check();
-
-# -- Page helper --
-$list = new adminThemesList(
-	$core, 
-	$core->blog->themes_path,
-	false
-);
-
-# -- Theme screenshot --
+$core->themes->loadModules($core->blog->themes_path,null);
+
+# Theme screenshot
 if (!empty($_GET['shot']) && $core->themes->moduleExists($_GET['shot']))
 {
@@ -66,167 +43,321 @@
 }
 
-# -- Display module configuration page --
-if ($list->setConfigurationFile($core->themes, $core->blog->settings->system->theme)) {
-
-	# Get content before page headers
-	include $list->getConfigurationFile();
-
-	# Gather content
-	$list->setConfigurationContent();
-
-	# Display page
-	dcPage::open(__('Blog appearance'),
-		dcPage::jsPageTabs().
-		dcPage::jsColorPicker().
-
-		# --BEHAVIOR-- themesToolsHeaders
-		$core->callBehavior('themesToolsHeaders', $core, true),
-
-		dcPage::breadcrumb(
-			array(
-				html::escapeHTML($core->blog->name) => '',
-				__('Blog appearance') => 'blog_theme.php',
-				'<span class="page-title">'.__('Theme configuration').'</span>' => ''
-			))
-	);
-
-	if (!empty($_GET['done'])){
-		dcPage::success(__('Theme successfully configured.'));
-	}
-
-	# Display previously gathered content
-	$list->getConfigurationContent();
-
-	dcPage::close();
-
-	# Stop reading code here
-	return;
-}
-
-# -- Execute actions --
-if (!empty($_POST) && empty($_REQUEST['conf']) && $core->auth->isSuperAdmin() && $list->isPathWritable()) {
-	try {
-		$list->executeAction('themes', $core->themes, $repository);
-	}
-	catch (Exception $e) {
+$can_install = $core->auth->isSuperAdmin();
+$is_writable = is_dir($core->blog->themes_path) && is_writable($core->blog->themes_path);
+$default_tab = 'themes-list';
+
+# Selecting theme
+if (!empty($_POST['theme']) && !empty($_POST['select']) && empty($_REQUEST['conf']))
+{
+	$core->blog->settings->addNamespace('system');
+	$core->blog->settings->system->put('theme',$_POST['theme']);
+	$core->blog->triggerBlog();
+	http::redirect('blog_theme.php?upd=1');
+}
+
+if ($can_install && !empty($_POST['theme']) && !empty($_POST['remove']) && empty($_REQUEST['conf']))
+{
+	try
+	{
+		if ($_POST['theme'] == 'default') {
+			throw new Exception(__('You can\'t remove default theme.'));
+		}
+		
+		if (!$core->themes->moduleExists($_POST['theme'])) {
+			throw new Exception(__('Theme does not exist.'));
+		}
+		
+		$theme = $core->themes->getModules($_POST['theme']);
+		
+		# --BEHAVIOR-- themeBeforeDelete
+		$core->callBehavior('themeBeforeDelete',$theme);
+		
+		$core->themes->deleteModule($_POST['theme']);
+		
+		# --BEHAVIOR-- themeAfterDelete
+		$core->callBehavior('themeAfterDelete',$theme);
+		
+		http::redirect('blog_theme.php?del=1');
+	}
+	catch (Exception $e)
+	{
 		$core->error->add($e->getMessage());
 	}
 }
 
-# -- Page header --
-dcPage::open(__('Themes management'),
-//	(!$conf_file ? dcPage::jsLoad('js/_blog_theme.js') : '').
-	dcPage::jsPageTabs().
-	dcPage::jsColorPicker(),
-
-	# --BEHAVIOR-- themesToolsHeaders
-	$core->callBehavior('themesToolsHeaders', $core, false),
-
-	dcPage::breadcrumb(
+# Theme upload
+if ($can_install && $is_writable && ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
+	(!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url']))))
+{
+	try
+	{
+		if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) {
+			throw new Exception(__('Password verification failed'));
+		}
+		
+		if (!empty($_POST['upload_pkg']))
+		{
+			files::uploadStatus($_FILES['pkg_file']);
+			
+			$dest = $core->blog->themes_path.'/'.$_FILES['pkg_file']['name'];
+			if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) {
+				throw new Exception(__('Unable to move uploaded file.'));
+			}
+		}
+		else
+		{
+			$url = urldecode($_POST['pkg_url']);
+			$dest = $core->blog->themes_path.'/'.basename($url);
+			
+			try
+			{
+				$client = netHttp::initClient($url,$path);
+				$client->setUserAgent('Dotclear - http://www.dotclear.org/');
+				$client->useGzip(false);
+				$client->setPersistReferers(false);
+				$client->setOutput($dest);
+				$client->get($path);
+			}
+			catch( Exception $e)
+			{
+				throw new Exception(__('An error occurred while downloading the file.'));
+			}
+			
+			unset($client);
+		}
+		
+		$ret_code = dcModules::installPackage($dest,$core->themes);
+		http::redirect('blog_theme.php?added='.$ret_code);
+	}
+	catch (Exception $e)
+	{
+		$core->error->add($e->getMessage());
+		$default_tab = 'add-theme';
+	}
+}
+
+$theme_conf_mode = false;
+if (!empty($_REQUEST['conf']))
+{
+	$theme_conf_file = path::real($core->blog->themes_path.'/'.$core->blog->settings->system->theme).'/_config.php';
+	if (file_exists($theme_conf_file)) {
+		$theme_conf_mode = true;
+	}
+}
+
+function display_theme_details($id,$details,$current)
+{
+	global $core;
+	
+	$screenshot = 'images/noscreenshot.png';
+	if (file_exists($core->blog->themes_path.'/'.$id.'/screenshot.jpg')) {
+		$screenshot = 'blog_theme.php?shot='.rawurlencode($id);
+	}
+	
+	$radio_id = 'theme_'.html::escapeHTML($id);
+	if (preg_match('#^http(s)?://#',$core->blog->settings->system->themes_url)) {
+		$theme_url = http::concatURL($core->blog->settings->system->themes_url,'/'.$id);
+	} else {
+		$theme_url = http::concatURL($core->blog->url,$core->blog->settings->system->themes_url.'/'.$id);
+	}
+	$has_conf = file_exists(path::real($core->blog->themes_path.'/'.$id).'/_config.php');
+	$has_css = file_exists(path::real($core->blog->themes_path.'/'.$id).'/style.css');
+	$parent = $core->themes->moduleInfo($id,'parent');
+	$has_parent = (boolean)$parent;
+	if ($has_parent) {
+		$is_parent_present = $core->themes->moduleExists($parent);
+	}
+	
+	$res =
+	'<div class="theme-details'.($current ? ' current-theme' : '').'">'.
+	'<div class="theme-shot"><img src="'.$screenshot.'" alt="" /></div>'.
+	'<div class="theme-info">'.
+		'<h4>'.form::radio(array('theme',$radio_id),html::escapeHTML($id),$current,'','',($has_parent && !$is_parent_present)).' '.
+		'<label class="classic" for="'.$radio_id.'">'.
+		html::escapeHTML($details['name']).'</label></h4>'.
+		'<p><span class="theme-desc">'.html::escapeHTML($details['desc']).'</span> '.
+		'<span class="theme-author">'.sprintf(__('by %s'),html::escapeHTML($details['author'])).'</span> '.
+		'<span class="theme-version">'.sprintf(__('version %s'),html::escapeHTML($details['version'])).'</span> ';
+		if ($has_parent) {
+			if ($is_parent_present) {
+				$res .= '<span class="theme-parent-ok">'.sprintf(__('(built on "%s")'),html::escapeHTML($parent)).'</span> ';
+			} else {
+				$res .= '<span class="theme-parent-missing">'.sprintf(__('(requires "%s")'),html::escapeHTML($parent)).'</span> ';
+			}
+		}
+		if ($has_css) {
+			$res .= '<span class="theme-css"><a href="'.$theme_url.'/style.css">'.__('Stylesheet').'</a></span>';
+		}
+		$res .= '</p>';
+	$res .=
+	'</div>'.
+	'<div class="theme-actions">';
+		if ($current && $has_conf) {
+			$res .= '<p><a href="blog_theme.php?conf=1" class="button">'.__('Configure theme').'</a></p>';
+		}
+		if ($current) {
+			# --BEHAVIOR-- adminCurrentThemeDetails
+			$res .= $core->callBehavior('adminCurrentThemeDetails',$core,$id,$details);
+		}
+	$res .=
+	'</div>'.
+	'</div>';
+	
+	return $res;
+}
+
+if (!$theme_conf_mode)
+{
+	$breadcrumb = dcPage::breadcrumb(
 		array(
 			html::escapeHTML($core->blog->name) => '',
 			'<span class="page-title">'.__('Blog appearance').'</span>' => ''
-		))
+		));
+} else {
+	$breadcrumb = dcPage::breadcrumb(
+		array(
+			html::escapeHTML($core->blog->name) => '',
+			__('Blog appearance') => 'blog_theme.php',
+			'<span class="page-title">'.__('Theme configuration').'</span>' => ''
+		));
+}
+
+dcPage::open(__('Blog appearance'),
+	(!$theme_conf_mode ? dcPage::jsLoad('js/_blog_theme.js') : '').
+	dcPage::jsPageTabs($default_tab).
+	dcPage::jsColorPicker(),
+	$breadcrumb
 );
 
-# -- Succes messages --
-if (!empty($_GET['msg'])) {
-	$list->displayMessage($_GET['msg']);
-}
-
-# -- Display modules lists --
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# Updated modules from repo
-	$modules = $repository->get(true);
-	if (!empty($modules)) {
-		echo 
-		'<div class="multi-part" id="update" title="'.html::escapeHTML(__('Update themes')).'">'.
-		'<h3>'.html::escapeHTML(__('Update themes')).'</h3>'.
-		'<p>'.sprintf(
-			__('There is one theme to update available from %2$s.', 'There are %s themes to update available from %s.', count($modules)),
-			count($modules),
-			'<a href="http://dotaddict.org/dc2/themes">Dotaddict</a>'
-		).'</p>';
-
-		$list
-			->newList('theme-update')
-			->setModules($modules)
-			->setPageTab('update')
-			->displayModulesList(
-				/*cols */		array('sshot', 'name', 'desc', 'author', 'version', 'current_version', 'parent'),
-				/* actions */	array('update')
-			);
-
+if (!$theme_conf_mode)
+{
+	if (!empty($_GET['upd'])) {
+		dcPage::success(__('Theme has been successfully changed.'));
+	}
+	
+	if (!empty($_GET['added'])) {
+		dcPage::success(($_GET['added'] == 2 ? __('Theme has been successfully upgraded') : __('Theme has been successfully installed.')));
+	}
+	
+	if (!empty($_GET['del'])) {
+		dcPage::success(__('Theme has been successfully deleted.'));
+	}
+	
+	# Themes list
+	echo '<div class="multi-part" id="themes-list" title="'.__('Themes').'">'.
+	'<h3>'.__('Available themes in your installation').'</h3>';
+	
+	$themes = $core->themes->getModules();
+	if (isset($themes[$core->blog->settings->system->theme])) {
+		echo '<p>'.sprintf(__('You are currently using <strong>%s</strong>'),$themes[$core->blog->settings->system->theme]['name']).'.</p>';
+	}
+	
+	echo
+	'<form action="blog_theme.php" method="post" id="themes-form">'.
+	'<div id="themes">';
+	
+	if (isset($themes[$core->blog->settings->system->theme])) {
+		echo display_theme_details($core->blog->settings->system->theme,$themes[$core->blog->settings->system->theme],true);
+	}
+	
+	foreach ($themes as $k => $v)
+	{
+		if ($core->blog->settings->system->theme == $k) { // Current theme
+			continue;
+		}
+		echo display_theme_details($k,$v,false);
+	}
+	
+	echo '</div>';
+	
+	echo
+	'<div id="themes-actions">'.
+	
+	'<p>'.$core->formNonce().'<input type="submit" name="select" value="'.__('Use selected theme').'" /> ';	
+	if ($can_install) {
+		echo ' <input type="submit" class="delete" name="remove" value="'.__('Delete selected theme').'" />';
+	}
+	echo '</p>'.
+	
+	'</div>'.
+	'</form>'.
+	'</div>';
+	
+	# Add a new theme
+	if ($can_install)
+	{
 		echo
-		'</div>';
-	}
-}
-
-# List all active plugins
-echo
-'<div class="multi-part" id="themes" title="'.__('Installed themes').'">';
-
-$modules = $core->themes->getModules();
-if (!empty($modules)) {
+		'<div class="multi-part clear" id="add-theme" title="'.__('Install or upgrade a theme').'">'.
+		'<h3>'.__('Add themes to your installation').'</h3>'.
+		'<p class="form-note info">'.sprintf(__('You can find additional themes for your blog on %s.'),
+		'<a href="http://themes.dotaddict.org/galerie-dc2/">Dotaddict</a>').'</p>';
+		
+		if ($is_writable)
+		{
+			echo '<p>'.__('You can also install themes by uploading or downloading zip files.').'</p>';
+			
+			# 'Upload theme' form
+			echo
+			'<form method="post" action="blog_theme.php" id="uploadpkg" enctype="multipart/form-data" class="fieldset">'.
+			'<h4>'.__('Upload a zip file').'</h4>'.
+			'<p class="field"><label for="pkg_file" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Theme zip file:').'</label> '.
+			'<input type="file" name="pkg_file" id="pkg_file" /></p>'.
+			'<p class="field"><label for="your_pwd1" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '.
+			form::password(array('your_pwd','your_pwd1'),20,255).'</p>'.
+			'<p><input type="submit" name="upload_pkg" value="'.__('Upload theme').'" />'.
+			$core->formNonce().'</p>'.
+			'</form>';
+			
+			# 'Fetch theme' form
+			echo
+			'<form method="post" action="blog_theme.php" id="fetchpkg" class="fieldset">'.
+			'<h4>'.__('Download a zip file').'</h4>'.
+			'<p class="field"><label for="pkg_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Theme zip file URL:').'</label> '.
+			form::field(array('pkg_url','pkg_url'),40,255).'</p>'.
+			'<p class="field"><label for="your_pwd2" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '.
+			form::password(array('your_pwd','your_pwd2'),20,255).'</p>'.
+			'<p><input type="submit" name="fetch_pkg" value="'.__('Download theme').'" />'.
+			$core->formNonce().'</p>'.
+			'</form>';
+		}
+		else
+		{
+			echo
+			'<p class="static-msg">'.
+			__('To enable this function, please give write access to your themes directory.').
+			'</p>';
+		}
+		echo '</div>';
+	}
+}
+else
+{
+	$theme_name = $core->themes->moduleInfo($core->blog->settings->system->theme,'name');
+	$core->themes->loadModuleL10Nresources($core->blog->settings->system->theme,$_lang);
 
 	echo
-	'<h3>'.__('Activated themes').'</h3>'.
-	'<p>'.__('Manage installed themes from this list.').'</p>';
-
-	$list
-		->newList('theme-activate')
-		->setModules($modules)
-		->setPageTab('themes')
-		->displayModulesList(
-			/* cols */		array('sshot', 'name', 'config', 'desc', 'author', 'version', 'parent'),
-			/* actions */	array('deactivate', 'delete')
-		);
-}
-
-echo 
-'</div>';
-
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# New modules from repo
-	$search = $list->getSearchQuery();
-	$modules = $search ? $repository->search($search) : $repository->get();
-
-	echo
-	'<div class="multi-part" id="new" title="'.__('Add themes from Dotaddict').'">'.
-	'<h3>'.__('Add themes from Dotaddict repository').'</h3>';
-
-	$list
-		->newList('theme-new')
-		->setModules($modules)
-		->setPageTab('new')
-		->displaySearchForm()
-		->displayNavMenu()
-		->displayModulesList(
-			/* cols */		array('expander', 'sshot', 'name', 'config', 'desc', 'author', 'version', 'parent'),
-			/* actions */	array('install'),
-			/* nav limit */	true
-		);
-
-	echo
-	'<p class="info vertical-separator">'.sprintf(
-		__("Visit %s repository, the resources center for Dotclear."),
-		'<a href="http://dotaddict.org/dc2/themes">Dotaddict</a>'
-		).
-	'</p>'.
-
-	'</div>';
-
-	# Add a new plugin
-	echo
-	'<div class="multi-part" id="addtheme" title="'.__('Install or upgrade manually').'">';
-
-	echo '<p>'.__('You can install themes by uploading or downloading zip files.').'</p>';
-	
-	$list->displayManualForm();
-
-	echo
-	'</div>';
+	'<p><a class="back" href="blog_theme.php">'.__('Back to Blog appearance').'</a></p>';
+	
+	try
+	{
+		# Let theme configuration set their own form(s) if required
+		$standalone_config = (boolean) $core->themes->moduleInfo($core->blog->settings->system->theme,'standalone_config');
+
+		if (!$standalone_config)
+			echo '<form id="theme_config" action="blog_theme.php?conf=1" method="post" enctype="multipart/form-data">';
+
+		include $theme_conf_file;
+
+		if (!$standalone_config)
+			echo
+			'<p class="clear"><input type="submit" value="'.__('Save').'" />'.
+			$core->formNonce().'</p>'.
+			'</form>';
+
+	}
+	catch (Exception $e)
+	{
+		echo '<div class="error"><p>'.$e->getMessage().'</p></div>';
+	}
 }
 
Index: admin/blogs.php
===================================================================
--- admin/blogs.php	(revision 2166)
+++ admin/blogs.php	(revision 2137)
@@ -73,5 +73,5 @@
 -------------------------------------------------------- */
 
-$form_filter_title = __('Show filters and display options');
+$form_filter_title = __('Filter blogs list and display options');
 $starting_script  = dcPage::jsLoad('js/filter-controls.js');
 $starting_script .=
@@ -80,5 +80,5 @@
 	dcPage::jsVar('dotclear.msg.show_filters', $show_filters ? 'true':'false')."\n".
 	dcPage::jsVar('dotclear.msg.filter_posts_list',$form_filter_title)."\n".
-	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel filters and display options'))."\n".
+	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel the filter'))."\n".
 	"//]]>".
 	"</script>";
@@ -88,5 +88,5 @@
 		array(
 			__('System') => '',
-			__('List of blogs')
+			'<span class="page-title">'.__('List of blogs').'</span>' => ''
 		))
 );
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 2166)
+++ admin/categories.php	(revision 2125)
@@ -107,5 +107,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			__('Categories') => ''
+			'<span class="page-title">'.__('Categories').'</span>' => ''
 		))
 );
Index: admin/category.php
===================================================================
--- admin/category.php	(revision 2166)
+++ admin/category.php	(revision 2117)
@@ -166,5 +166,5 @@
 	}
 }
-$elements[$title] = '';
+$elements['<span class="page-title">'.$title.'</span>'] = '';
 
 dcPage::open($title,
Index: admin/comment.php
===================================================================
--- admin/comment.php	(revision 2166)
+++ admin/comment.php	(revision 1972)
@@ -164,5 +164,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			html::escapeHTML($post_title) => $core->getPostAdminURL($post_type,$post_id).'&amp;co=1#c'.$comment_id,
-			__('Edit comment') => ''
+			'<span class="page-title">'.__('Edit comment').'</span>' => ''
 		));
 } else {
@@ -171,5 +171,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			html::escapeHTML($post_title) => $core->getPostAdminURL($post_type,$post_id),
-			__('Edit comment') => ''
+			'<span class="page-title">'.__('Edit comment').'</span>' => ''
 		));
 }
Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 2166)
+++ admin/comments.php	(revision 2136)
@@ -153,5 +153,5 @@
 -------------------------------------------------------- */
 
-$form_filter_title = __('Show filters and display options');
+$form_filter_title = __('Filter comments, trackbacks list and display options');
 $starting_script  = dcPage::jsLoad('js/_comments.js');
 $starting_script .= dcPage::jsLoad('js/filter-controls.js');
@@ -161,5 +161,5 @@
 	dcPage::jsVar('dotclear.msg.show_filters', $show_filters ? 'true':'false')."\n".
 	dcPage::jsVar('dotclear.msg.filter_posts_list',$form_filter_title)."\n".
-	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel filters and display options'))."\n".
+	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel the filter'))."\n".
 	"//]]>".
 	"</script>";
@@ -169,5 +169,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			__('Comments and trackbacks') => ''
+			'<span class="page-title">'.__('Comments and trackbacks').'</span>' => ''
 		))
 );
Index: admin/help.php
===================================================================
--- admin/help.php	(revision 2166)
+++ admin/help.php	(revision 2074)
@@ -77,10 +77,10 @@
 		array(
 			__('Global help') => 'help.php',
-			$content_array['title'] => ''
+			'<span class="page-title">'.$content_array['title'].'</span>' => ''
 		));
 } else {
 	$breadcrumb = dcPage::breadcrumb(
 		array(
-			__('Global help') => ''
+			'<span class="page-title">'.__('Global help').'</span>' => ''
 		));
 }
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 2175)
+++ admin/index.php	(revision 2116)
@@ -123,25 +123,4 @@
 	}
 	$__dashboard_icons['prefs'] = new ArrayObject(array(__('My preferences'),'preferences.php','images/menu/user-pref-b.png'));
-}
-
-# Check plugins and themes update from repository
-function dc_check_repository_update($mod, $url, $img, $icon)
-{
-	$repo = new dcRepository($mod, $url);
-	$repo->check();
-	$upd = $repo->get(true);
-	if (!empty($upd)) {
-		$icon[0] .= '<br />'.sprintf(__('An update is available', '%s updates are available.', count($upd)),count($upd));
-		$icon[1] .= '#update';
-		$icon[2] = 'images/menu/'.$img.'-b-update.png';
-	}
-}
-if (isset($__dashboard_icons['plugins'])) {
-	dc_check_repository_update($core->plugins, $core->blog->settings->system->repository_plugin_url, 'plugins', $__dashboard_icons['plugins']);
-}
-if (isset($__dashboard_icons['blog_theme'])) {
-	$themes = new dcThemes($core);
-	$themes->loadModules($core->blog->themes_path, null);
-	dc_check_repository_update($themes, $core->blog->settings->system->repository_theme_url, 'blog-theme', $__dashboard_icons['blog_theme']);
 }
 
@@ -226,8 +205,7 @@
 	dcPage::breadcrumb(
 		array(
-		__('Dashboard').' : '.html::escapeHTML($core->blog->name) => ''
+		'<span class="page-title">'.__('Dashboard').' : '.html::escapeHTML($core->blog->name).'</span>' => ''
 		),
-		array('home_link' =>false)
-	)
+		false)
 );
 
@@ -250,5 +228,5 @@
 }
 
-if ($core->auth->getInfo('user_default_blog') != $core->blog->id && $core->auth->getBlogCount() > 1) {
+if ($core->auth->getInfo('user_default_blog') != $core->blog->id && $core->auth->blog_count > 1) {
 	echo
 	'<p><a href="index.php?default_blog=1" class="button">'.__('Make this blog my default blog').'</a></p>';
Index: admin/install/index.php
===================================================================
--- admin/install/index.php	(revision 1949)
+++ admin/install/index.php	(revision 2183)
@@ -146,5 +146,9 @@
 		$blog_settings->system->put('public_url',$root_url.'/public');
 		$blog_settings->system->put('themes_url',$root_url.'/themes');
-		$blog_settings->system->put('date_format',__('%A, %B %e %Y'));
+		$formatDate = __('%A, %B %e %Y');
+		if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
+		    $formatDate = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $formatDate);
+		}
+		$blog_settings->system->put('date_format', $formatDate);
 		
 		# Add Dotclear version
Index: admin/js/_plugins.js
===================================================================
--- admin/js/_plugins.js	(revision 2171)
+++ admin/js/_plugins.js	(revision 0)
@@ -1,158 +1,6 @@
-dotclear.moduleExpander = function(line) {
-        var td = line.firstChild;
-        
-        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 = line;
-        img.onclick = function() { dotclear.viewModuleContent(this,this.line); };
-        
-        td.insertBefore(img,td.firstChild);
-};
-
-dotclear.modulesExpander = function(line,lines) {
-        var td = line.firstChild;
-
-        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.lines = lines;
-        img.onclick = function() { dotclear.viewModulesContent(this,this.lines); };
-
-        td.insertBefore(img,td.firstChild);
-};
-
-dotclear.viewModulesContent = function(img,lines) {
-        
-        action = 'toggle';
-
-        if (img.alt == dotclear.img_plus_alt) {
-                img.src = dotclear.img_minus_src;
-                img.alt = dotclear.img_minus_alt;
-                action = 'open';
-        } else {
-                img.src = dotclear.img_plus_src;
-                img.alt = dotclear.img_plus_alt;
-                action = 'close';
-        }
-        
-        lines.each(function() {
-                var td = this.firstChild;
-                dotclear.viewModuleContent(td.firstChild,td.firstChild.line,action);
-        });
-};
-
-dotclear.viewModuleContent = function(img,line,action) {
-
-        var action = action || 'toggle';
-		var cols = $('td',$(line)).length
-        var sp = line.id.split('_m_');
-		var listId=sp[0];
-		var moduleId= sp[1];
-
-        var tr = document.getElementById('pe'+moduleId);
-        
-		if ( !tr && ( action == 'toggle' || action == 'open' ) ) {
-                tr = document.createElement('tr');
-                tr.id = 'pe'+moduleId;
-
-                var td = document.createElement('td');
-                td.colSpan = cols;
-                td.className = 'expand';
-                tr.appendChild(td);
-                
-                img.src = dotclear.img_minus_src;
-                img.alt = dotclear.img_minus_alt;
-                
-                // Get post content
-                $.get('services.php',{f:'getModuleById', id: moduleId, list: listId},function(data) {
-                        var rsp = $(data).children('rsp')[0];
-                        
-                        if (rsp.attributes[0].value == 'ok') {
-                                var author = $(rsp).find('author').text();
-                                var details = $(rsp).find('details').text();
-                                var support = $(rsp).find('support').text();
-								var box = document.createElement('div');
-                                var dl = document.createElement('ul');
-                                dl.className = "mod-more";
-                                
-                                if (author) {
-                                        $(dl).append($('<li class="module-author">'+dotclear.msg.module_author+' '+author+'</li>'));
-                                }
-                                if (details) {
-                                        var dd = '';
-                                        dd += '<a class="module-details" href="'+details+'">'+dotclear.msg.module_details+'</a>';
-                                        if (support) {
-                                                dd += ' - ';
-                                                dd += '<a class="module-support" href="'+support+'">'+dotclear.msg.module_support+'</a>';
-                                        }
-                                        $(dl).append($('<li>'+dotclear.msg.module_help+' '+dd+'</li>'));
-                                }
-
-                                $(td).append($(box).addClass('two-boxes').append(dl));
-                                
-                                var section = $(rsp).find('section').text();
-                                var tags = $(rsp).find('tags').text();
-                                
-								var boxb = document.createElement('div');
-                                var dlb = document.createElement('ul');
-                                dlb.className = "mod-more";
-                                
-                                if (section) {
-                                        $(dlb).append($('<li class="module-section">'+dotclear.msg.module_section+' '+section+'</li>'));
-                                }
-                                if (tags) {
-                                        $(dlb).append($('<li class="module-tags">'+dotclear.msg.module_tags+' '+tags+'</li>'));
-                                }
-                                $(td).append($(boxb).addClass('two-boxes').append(dlb));
-                        } else {
-                                alert($(rsp).find('message').text());
-                        }
-                });
-                
-                $(line).addClass('expand');
-                line.parentNode.insertBefore(tr,line.nextSibling);
-        }
-        else if (tr && tr.style.display == 'none' && ( action == 'toggle' || action == 'open' ) )
-        {
-                $(tr).css('display', 'table-row');
-                $(line).addClass('expand');
-                img.src = dotclear.img_minus_src;
-                img.alt = dotclear.img_minus_alt;
-        }
-        else if (tr && tr.style.display != 'none' && ( action == 'toggle' || action == 'close' ) )
-        {
-                $(tr).css('display', 'none');
-                $(line).removeClass('expand');
-                img.src = dotclear.img_plus_src;
-                img.alt = dotclear.img_plus_alt;
-        }
-        
-        parentTable = $(line).parents('table');
-        if( parentTable.find('tr.expand').length == parentTable.find('tr.line').length ) {
-                img = parentTable.find('tr:not(.line) th:first img');
-                img.attr('src',dotclear.img_minus_src);
-                img.attr('alt',dotclear.img_minus_alt);
-        }
-        
-        if( parentTable.find('tr.expand').length == 0 ) {
-                img = parentTable.find('tr:not(.line) th:first img');
-                img.attr('src',dotclear.img_plus_src);
-                img.attr('alt',dotclear.img_plus_alt);
-        }
-        
-};
-
-
 $(function() {
-        $('table.modules.expandable tr:not(.line)').each(function() {
-                dotclear.modulesExpander(this,$('table.modules tr.line'));
-        });
-        $('table.modules.expandable tr.line').each(function() {
-                dotclear.moduleExpander(this);
-        });
+	$('table.plugins form input[type=submit][name=delete]').click(function() {
+		var p_name = $('input[name=plugin_id]',$(this).parent()).val();
+		return window.confirm(dotclear.msg.confirm_delete_plugin.replace('%s',p_name));
+	});
 });
Index: admin/js/jquery/jquery.pageTabs.js
===================================================================
--- admin/js/jquery/jquery.pageTabs.js	(revision 2162)
+++ admin/js/jquery/jquery.pageTabs.js	(revision 2113)
@@ -72,8 +72,4 @@
 	
 	$.pageTabs.clickTab = function(tab) {
-		if (tab=='') {
-			tab = getHash($('ul li a', '.'+$.pageTabs.options.containerClass+':eq(0)').attr('href'));
-		}
-
 		$('ul li a', '.'+$.pageTabs.options.containerClass).filter(function() {
 			return getHash($(this).attr('href'))==tab;
Index: admin/js/jsToolBar/jsToolBar.wysiwyg.js
===================================================================
--- admin/js/jsToolBar/jsToolBar.wysiwyg.js	(revision 2155)
+++ admin/js/jsToolBar/jsToolBar.wysiwyg.js	(revision 2101)
@@ -89,5 +89,5 @@
 			var idoc = This.iwin.document;
 			var para = idoc.createElement('p');
-			para.appendChild(idoc.createElement('br'));
+			para.appendChild(idoc.createTextNode(''));
 			while (idoc.body.hasChildNodes()) {
 				idoc.body.removeChild(idoc.body.lastChild);
Index: admin/langs.php
===================================================================
--- admin/langs.php	(revision 2166)
+++ admin/langs.php	(revision 2007)
@@ -133,5 +133,5 @@
 	array(
 		__('System') => '',
-		__('Languages management') => ''
+		'<span class="page-title">'.__('Languages management').'</span>' => ''
 	))
 );
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 2167)
+++ admin/media.php	(revision 2099)
@@ -212,8 +212,6 @@
 				html::escapeHTML($core->blog->name) => '',
 				__('Media manager') => '',
-				__('confirm removal') => ''
-			),
-			array('home_link' => !$popup)
-		)
+				'<span class="page-title">'.__('confirm removal').'</span>' => ''
+			),!$popup)
 	);
 	
@@ -242,8 +240,6 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			__('Media manager') => ''
-		),
-		array('home_link' => !$popup)
-	);
+			'<span class="page-title">'.__('Media manager').'</span>' => ''
+		),!$popup);
 } else {
 	$breadcrumb_media = $core->media->breadCrumb(html::escapeURL($page_url).'&amp;d=%s','<span class="page-title">%s</span>');
@@ -252,8 +248,6 @@
 			array(
 				html::escapeHTML($core->blog->name) => '',
-				__('Media manager') => ''
-			),
-			array('home_link' => !$popup)
-		);
+				'<span class="page-title">'.__('Media manager').'</span>' => ''
+			),!$popup);
 	} else {
 		$breadcrumb = dcPage::breadcrumb(
@@ -262,10 +256,5 @@
 				__('Media manager') => html::escapeURL($page_url.'&d='),
 				$breadcrumb_media => ''
-			),
-			array(
-				'home_link' => !$popup,
-				'hl' => false
-			)
-		);
+			),!$popup);
 	}
 }
@@ -420,5 +409,5 @@
 {
 	echo
-	'<div class="two-boxes fieldset even">';	
+	'<div class="two-boxes fieldset">';	
 	if ($user_ui_enhanceduploader) {
 		echo
Index: admin/media_item.php
===================================================================
--- admin/media_item.php	(revision 2167)
+++ admin/media_item.php	(revision 2106)
@@ -206,10 +206,5 @@
 			__('Media manager') => html::escapeURL($media_page_url),
 			$core->media->breadCrumb(html::escapeURL($media_page_url).'&amp;d=%s').'<span class="page-title">'.$file->basename.'</span>' => ''
-		),
-		array(
-			'home_link' => !$popup,
-			'hl' => false
-		)
-	)
+		),!$popup)
 );
 
Index: admin/plugin.php
===================================================================
--- admin/plugin.php	(revision 2166)
+++ admin/plugin.php	(revision 1358)
@@ -85,5 +85,5 @@
 			array(
 				__('System') => '',
-				__('Plugin not found') => ''
+				'<span class="page-title">'.__('Plugin not found').'</span>' => ''
 			))
 	);
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 2182)
+++ admin/plugins.php	(revision 2007)
@@ -13,271 +13,381 @@
 require dirname(__FILE__).'/../inc/admin/prepend.php';
 
-dcPage::check('admin');
-
-# --------------------------------------------------
-# @todo Add settings to Dotclear update features
-if ($core->blog->settings->system->plugins_allow_multi_install === null) {
-	$core->blog->settings->system->put(
-		'plugins_allow_multi_install', false, 'boolean', 'Allow multi-installation for plugins', true, true
-	);
-}
-if ($core->blog->settings->system->repository_plugin_url === null) {
-	$core->blog->settings->system->put(
-		'repository_plugin_url', 'http://update.dotaddict.org/dc2/plugins.xml', 'string', 'Plugins XML feed location', true, true
-	);
-}
-# --------------------------------------------------
-
-# -- Repository helper --
-$repository = new dcRepository(
-	$core->plugins, 
-	$core->blog->settings->system->repository_plugin_url
-);
-$repository->check();
-
-# -- Page helper --
-$list = new adminModulesList(
-	$core, 
-	DC_PLUGINS_ROOT,
-	$core->blog->settings->system->plugins_allow_multi_install
-);
-
-$list::setDistributedModules(array(
-	'aboutConfig',
-	'akismet',
-	'antispam',
-	'attachments',
-	'blogroll',
-	'blowupConfig',
-	'daInstaller',
-	'fairTrackbacks',
-	'importExport',
-	'maintenance',
-	'pages',
-	'pings',
-	'simpleMenu',
-	'tags',
-	'themeEditor',
-	'userPref',
-	'widgets'
-));
-
-# -- Display module configuration page --
-if ($list->setConfigurationFile($core->plugins)) {
-
-	# Get content before page headers
-	include $list->getConfigurationFile();
-
-	# Gather content
-	$list->setConfigurationContent();
-
-	# Display page
-	dcPage::open(__('Plugins management'),
-
-		# --BEHAVIOR-- pluginsToolsHeaders
-		$core->callBehavior('pluginsToolsHeaders', $core, true),
-
-		dcPage::breadcrumb(
-			array(
-				html::escapeHTML($core->blog->name) => '',
-				'<a href="'.$list->getPageURL().'">'.__('Plugins management').'</a>' => '',
-				'<span class="page-title">'.__('Plugin configuration').'</span>' => ''
-			))
-	);
-
-	# Message
-	if (!empty($_GET['done'])){
-		dcPage::success(__('Plugin successfully configured.'));
-	}
-
-	# Display previously gathered content
-	$list->getConfigurationContent();
-
-	dcPage::close();
-
-	# Stop reading code here
-	return;
-}
-
-# -- Execute actions --
-if (!empty($_POST) && empty($_REQUEST['conf']) && $core->auth->isSuperAdmin() && $list->isPathWritable()) {
-	try {
-		$list->executeAction('plugins', $core->plugins, $repository);
-	}
-	catch (Exception $e) {
-		$core->error->add($e->getMessage());
-	}
-}
-
-# -- Plugin install --
-$plugins_install = null;
-if (!$core->error->flag()) {
-	$plugins_install = $core->plugins->installModules();
-}
-
-# -- Page header --
+dcPage::checkSuper();
+
+$default_tab = !empty($_REQUEST['tab']) ? html::escapeHTML($_REQUEST['tab']) : 'plugins';
+
+$p_paths = explode(PATH_SEPARATOR, DC_PLUGINS_ROOT);
+$p_path = array_pop($p_paths);
+unset($p_paths);
+
+$is_writable = false;
+if (is_dir($p_path) && is_writeable($p_path)) {
+	$is_writable = true;
+	$p_path_pat = preg_quote($p_path,'!');
+}
+
+$plugin_id = !empty($_POST['plugin_id']) ? $_POST['plugin_id'] : null;
+
+if ($is_writable)
+{
+	# Delete plugin
+	if ($plugin_id && !empty($_POST['delete']))
+	{
+		try
+		{
+			if (empty($_POST['deactivated']))
+			{
+				if (!$core->plugins->moduleExists($plugin_id)) {
+					throw new Exception(__('No such plugin.'));
+				}
+				
+				$plugin = $core->plugins->getModules($plugin_id);
+				$plugin['id'] = $plugin_id;
+				
+				if (!preg_match('!^'.$p_path_pat.'!', $plugin['root'])) {
+					throw new Exception(__('You don\'t have permissions to delete this plugin.'));
+				}
+				
+				# --BEHAVIOR-- pluginBeforeDelete
+				$core->callBehavior('pluginsBeforeDelete', $plugin);
+				
+				$core->plugins->deleteModule($plugin_id);
+				
+				# --BEHAVIOR-- pluginAfterDelete
+				$core->callBehavior('pluginsAfterDelete', $plugin);
+			}
+			else
+			{
+				$core->plugins->deleteModule($plugin_id,true);
+			}
+			
+			http::redirect('plugins.php?removed=1');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
+	# Deactivate plugin
+	elseif ($plugin_id && !empty($_POST['deactivate']))
+	{
+		try
+		{
+			if (!$core->plugins->moduleExists($plugin_id)) {
+				throw new Exception(__('No such plugin.'));
+			}
+			
+			$plugin = $core->plugins->getModules($plugin_id);
+			$plugin['id'] = $plugin_id;
+			
+			if (!$plugin['root_writable']) {
+				throw new Exception(__('You don\'t have permissions to deactivate this plugin.'));
+			}
+			
+			# --BEHAVIOR-- pluginBeforeDeactivate
+			$core->callBehavior('pluginsBeforeDeactivate', $plugin);
+				
+			$core->plugins->deactivateModule($plugin_id);
+
+			# --BEHAVIOR-- pluginAfterDeactivate
+			$core->callBehavior('pluginsAfterDeactivate', $plugin);
+				
+			http::redirect('plugins.php');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
+	# Activate plugin
+	elseif ($plugin_id && !empty($_POST['activate']))
+	{
+		try
+		{
+			$p = $core->plugins->getDisabledModules();
+			if (!isset($p[$plugin_id])) {
+				throw new Exception(__('No such plugin.'));
+			}
+
+			# --BEHAVIOR-- pluginBeforeActivate
+			$core->callBehavior('pluginsBeforeActivate', $plugin_id);
+			
+			$core->plugins->activateModule($plugin_id);
+
+			# --BEHAVIOR-- pluginAfterActivate
+			$core->callBehavior('pluginsAfterActivate', $plugin_id);
+			
+			http::redirect('plugins.php');
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+		}
+	}
+	# Plugin upload
+	elseif ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
+		(!empty($_POST['fetch_pkg']) && !empty($_POST['pkg_url'])))
+	{
+		try
+		{
+			if (empty($_POST['your_pwd']) || !$core->auth->checkPassword(crypt::hmac(DC_MASTER_KEY,$_POST['your_pwd']))) {
+				throw new Exception(__('Password verification failed'));
+			}
+			
+			if (!empty($_POST['upload_pkg']))
+			{
+				files::uploadStatus($_FILES['pkg_file']);
+				
+				$dest = $p_path.'/'.$_FILES['pkg_file']['name'];
+				if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'],$dest)) {
+					throw new Exception(__('Unable to move uploaded file.'));
+				}
+			}
+			else
+			{
+				$url = urldecode($_POST['pkg_url']);
+				$dest = $p_path.'/'.basename($url);
+				
+				try
+				{
+					$client = netHttp::initClient($url,$path);
+					$client->setUserAgent('Dotclear - http://www.dotclear.org/');
+					$client->useGzip(false);
+					$client->setPersistReferers(false);
+					$client->setOutput($dest);
+					$client->get($path);
+				}
+				catch( Exception $e)
+				{
+					throw new Exception(__('An error occurred while downloading the file.'));
+				}
+				
+				unset($client);
+			}
+
+			# --BEHAVIOR-- pluginBeforeAdd
+			$core->callBehavior('pluginsBeforeAdd', $plugin_id);
+						
+			$ret_code = $core->plugins->installPackage($dest,$core->plugins);
+
+			# --BEHAVIOR-- pluginAfterAdd
+			$core->callBehavior('pluginsAfterAdd', $plugin_id);
+			
+			http::redirect('plugins.php?added='.$ret_code);
+		}
+		catch (Exception $e)
+		{
+			$core->error->add($e->getMessage());
+			$default_tab = 'addplugin';
+		}
+	}
+}
+
+# Plugin install
+$plugins_install = $core->plugins->installModules();
+
+/* DISPLAY Main page
+-------------------------------------------------------- */
 dcPage::open(__('Plugins management'),
 	dcPage::jsLoad('js/_plugins.js').
-	dcPage::jsPageTabs().
-
-	# --BEHAVIOR-- pluginsToolsHeaders
-	$core->callBehavior('pluginsToolsHeaders', $core, false),
-
+	dcPage::jsPageTabs($default_tab),
 	dcPage::breadcrumb(
 		array(
 			__('System') => '',
-			__('Plugins management') => ''
+			'<span class="page-title">'.__('Plugins management').'</span>' => ''
 		))
 );
 
-# -- Succes messages --
-if (!empty($_GET['msg'])) {
-	$list->displayMessage($_GET['msg']);
-}
-
-# -- Plugins install messages --
-if (!empty($plugins_install['success'])) {
-	echo 
-	'<div class="static-msg">'.__('Following plugins have been installed:').'<ul>';
+if (!empty($_GET['removed'])) {
+	dcPage::success(__('Plugin has been successfully deleted.'));
+}
+if (!empty($_GET['added'])) {
+	dcPage::success(($_GET['added'] == 2 ? __('Plugin has been successfully upgraded') : __('Plugin has been successfully installed.')));
+}
+
+# Plugins install messages
+if (!empty($plugins_install['success']))
+{
+	echo '<div class="static-msg">'.__('Following plugins have been installed:').'<ul>';
 	foreach ($plugins_install['success'] as $k => $v) {
-		echo 
-		'<li>'.$k.'</li>';
-	}
-	echo 
-	'</ul></div>';
-}
-if (!empty($plugins_install['failure'])) {
-	echo 
-	'<div class="error">'.__('Following plugins have not been installed:').'<ul>';
+		echo '<li>'.$k.'</li>';
+	}
+	echo '</ul></div>';
+}
+if (!empty($plugins_install['failure']))
+{
+	echo '<div class="error">'.__('Following plugins have not been installed:').'<ul>';
 	foreach ($plugins_install['failure'] as $k => $v) {
-		echo 
-		'<li>'.$k.' ('.$v.')</li>';
-	}
-	echo 
-	'</ul></div>';
-}
-
-# -- Display modules lists --
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# Updated modules from repo
-	$modules = $repository->get(true);
-	if (!empty($modules)) {
-		echo 
-		'<div class="multi-part" id="update" title="'.html::escapeHTML(__('Update plugins')).'">'.
-		'<h3>'.html::escapeHTML(__('Update plugins')).'</h3>'.
-		'<p>'.sprintf(
-			__('There is one plugin to update available from %2$s.', 'There are %s plugins to update available from %s.', count($modules)),
-			count($modules),
-			'<a href="http://dotaddict.org/dc2/plugins">Dotaddict</a>'
-		).'</p>';
-
-		$list
-			->newList('plugin-update')
-			->setModules($modules)
-			->setPageTab('update')
-			->displayModulesList(
-				/*cols */		array('icon', 'name', 'version', 'current_version', 'desc'),
-				/* actions */	array('update')
-			);
-
+		echo '<li>'.$k.' ('.$v.')</li>';
+	}
+	echo '</ul></div>';
+}
+
+# List all active plugins
+echo '<p>'.__('Plugins add new functionalities to Dotclear. '.
+'Here you can activate or deactivate installed plugins.').'</p>';
+
+echo (!$core->plugins->moduleExists('daInstaller') ?
+	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s.').'</strong></p>',
+		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>') :
+	sprintf('<p><strong>'.__('You can find additional plugins for your blog on %s or using the %s.').'</strong></p>',
+		'<a href="http://plugins.dotaddict.org/dc2/">Dotaddict</a>',
+		'<a href="plugin.php?p=daInstaller">'.__('DotAddict.org Installer').'</a>'));
+
+if ($is_writable) {
+	echo '<p>'.__('To install or upgrade a plugin you generally just need to upload it '.
+	'in "Install or upgrade a plugin" section.');
+} else {
+	echo '<p>'.__('To install or upgrade a plugin you just need to extract it in your plugins directory.');
+}
+echo '</p>';
+
+echo
+'<div class="multi-part" id="plugins" title="'.__('Plugins').'">';
+
+$p_available = $core->plugins->getModules();
+uasort($p_available,create_function('$a,$b','return strcasecmp($a["name"],$b["name"]);'));
+if (!empty($p_available)) 
+{
+	echo
+	'<h3>'.__('Activated plugins').'</h3>'.
+	'<div class="table-outer clear">'.
+	'<table class="plugins"><tr>'.
+	'<th>'.__('Plugin').'</th>'.
+	'<th class="nowrap">'.__('Version').'</th>'.
+	'<th class="nowrap">'.__('Details').'</th>'.
+	'<th class="nowrap">'.__('Action').'</th>'.
+	'</tr>';
+	
+	$distrib_plugins = array('aboutConfig','akismet','antispam','attachments','blogroll','blowupConfig','daInstaller',
+		'fairTrackbacks','importExport','maintenance','pages','pings','simpleMenu','tags','themeEditor','userPref','widgets');
+	$distrib_img = '<img src="images/dotclear_pw.png"'.
+		' alt="'.__('Plugin from official distribution').'" title="'.__('Plugin from official distribution').'" />';
+
+	foreach ($p_available as $k => $v)
+	{
+		$is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']);
+		$is_deactivable = $v['root_writable'];
+		$is_distrib = in_array($k, $distrib_plugins);
+		
 		echo
-		'</div>';
-	}
-}
-
-# List all active plugins
+		'<tr class="line wide">'.
+		'<td class="minimal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'.
+		'<td class="minimal">'.html::escapeHTML($v['version']).'</td>'.
+		'<td class="maximal'.($is_distrib ? ' distrib' : '').'"><strong>'.html::escapeHTML(__($v['name'])).'</strong> '.
+		'<br />'.html::escapeHTML(__($v['desc'])).($is_distrib ? ' '.$distrib_img : '').'</td>'.
+		'<td class="nowrap action">';
+		
+		if ($is_deletable || $is_deactivable)
+		{
+			echo
+			'<form action="plugins.php" method="post">'.
+			'<div>'.
+			$core->formNonce().
+			form::hidden(array('plugin_id'),html::escapeHTML($k)).
+			($is_deactivable ? '<input type="submit" name="deactivate" value="'.__('Deactivate').'" /> ' : '').
+			($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
+			'</div>'.
+			'</form>';
+		}
+		
+		echo
+		'</td>'.
+		'</tr>';
+	}
+	echo
+	'</table></div>';
+}
+
+$p_disabled = $core->plugins->getDisabledModules();
+uksort($p_disabled,create_function('$a,$b','return strcasecmp($a,$b);'));
+if (!empty($p_disabled))
+{
+	echo
+	'<h3>'.__('Deactivated plugins').'</h3>'.
+	'<div class="clear table-outer">'.
+	'<table class="plugins"><tr>'.
+	'<th>'.__('Plugin').'</th>'.
+	'<th class="nowrap">'.__('Action').'</th>'.
+	'</tr>';
+	
+	foreach ($p_disabled as $k => $v)
+	{
+		$is_deletable = $is_writable && preg_match('!^'.$p_path_pat.'!',$v['root']);
+		$is_activable = $v['root_writable'];
+		
+		echo
+		'<tr class="line wide">'.
+		'<td class="maximal nowrap"><strong>'.html::escapeHTML($k).'</strong></td>'.
+		'<td class="nowrap action">';
+		
+		if ($is_deletable || $is_activable)
+		{
+			echo
+			'<form action="plugins.php" method="post">'.
+			'<div>'.
+			$core->formNonce().
+			form::hidden(array('plugin_id'),html::escapeHTML($k)).
+			form::hidden(array('deactivated'),1).
+			($is_activable ? '<input type="submit" name="activate" value="'.__('Activate').'" /> ' : '').
+			($is_deletable ? '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" /> ' : '').
+			'</div>'.
+			'</form>';
+		}
+		
+		echo
+		'</td>'.
+		'</tr>';
+	}
+	echo
+	'</table></div>';
+}
+
+echo '</div>';
+
+# Add a new plugin
 echo
-'<div class="multi-part" id="plugins" title="'.__('Installed plugins').'">';
-
-$modules = $core->plugins->getModules();
-if (!empty($modules)) {
-
-	echo
-	'<h3>'.__('Activated plugins').'</h3>'.
-	'<p>'.__('Manage installed plugins from this list.').'</p>';
-
-	$list
-		->newList('plugin-activate')
-		->setModules($modules)
-		->setPageTab('plugins')
-		->displayModulesList(
-			/* cols */		array('expander', 'icon', 'name', 'config', 'version', 'desc', 'distrib'),
-			/* actions */	array('deactivate', 'delete')
-		);
-}
-
-# Deactivated modules
-$modules = $core->plugins->getDisabledModules();
-if (!empty($modules)) {
-
-	echo
-	'<h3>'.__('Deactivated plugins').'</h3>'.
-	'<p>'.__('Deactivated plugins are installed but not usable. You can activate them from here.').'</p>';
-
-	$list
-		->newList('plugin-deactivate')
-		->setModules($modules)
-		->setPageTab('plugins')
-		->displayModulesList(
-			/* cols */		array('icon', 'name', 'distrib'),
-			/* actions */	array('activate', 'delete')
-		);
-}
-
-echo 
-'</div>';
-
-if ($core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
-	# New modules from repo
-	$search = $list->getSearchQuery();
-	$modules = $search ? $repository->search($search) : $repository->get();
-
-	echo
-	'<div class="multi-part" id="new" title="'.__('Add plugins from Dotaddict').'">'.
-	'<h3>'.__('Add plugins from Dotaddict repository').'</h3>';
-
-	$list
-		->newList('plugin-new')
-		->setModules($modules)
-		->setPageTab('new')
-		->displaySearchForm()
-		->displayNavMenu()
-		->displayModulesList(
-			/* cols */		array('expander', 'name', 'version', 'desc'),
-			/* actions */	array('install'),
-			/* nav limit */	true
-		);
-
-	echo
-	'<p class="info vertical-separator">'.sprintf(
-		__("Visit %s repository, the resources center for Dotclear."),
-		'<a href="http://dotaddict.org/dc2/plugins">Dotaddict</a>'
-		).
-	'</p>'.
-
-	'</div>';
-
-	# Add a new plugin
-	echo
-	'<div class="multi-part" id="addplugin" title="'.__('Install or upgrade manually').'">';
-
+'<div class="multi-part" id="addplugin" title="'.__('Install or upgrade a plugin').'">';
+
+if ($is_writable)
+{
 	echo '<p>'.__('You can install plugins by uploading or downloading zip files.').'</p>';
 	
-	$list->displayManualForm();
-
-	echo
-	'</div>';
-}
+	# 'Upload plugin' form
+	echo
+	'<form method="post" action="plugins.php" id="uploadpkg" enctype="multipart/form-data" class="fieldset">'.
+	'<h3>'.__('Upload a zip file').'</h3>'.
+	'<p class="field"><label for="pkg_file" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file:').'</label> '.
+	'<input type="file" id="pkg_file" name="pkg_file" /></p>'.
+	'<p class="field"><label for="your_pwd1" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '.
+	form::password(array('your_pwd','your_pwd1'),20,255).'</p>'.
+	'<p><input type="submit" name="upload_pkg" value="'.__('Upload plugin').'" />'.
+	$core->formNonce().
+	'</p>'.
+	'</form>';
+	
+	# 'Fetch plugin' form
+	echo
+	'<form method="post" action="plugins.php" id="fetchpkg" class="fieldset">'.
+	'<h3>'.__('Download a zip file').'</h3>'.
+	'<p class="field"><label for="pkg_url" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Plugin zip file URL:').'</label> '.
+	form::field(array('pkg_url','pkg_url'),40,255).'</p>'.
+	'<p class="field"><label for="your_pwd2" class="classic required"><abbr title="'.__('Required field').'">*</abbr> '.__('Your password:').'</label> '.
+	form::password(array('your_pwd','your_pwd2'),20,255).'</p>'.
+	'<p><input type="submit" name="fetch_pkg" value="'.__('Download plugin').'" />'.
+	$core->formNonce().'</p>'.
+	'</form>';
+}
+else
+{
+	echo
+	'<p class="static-msg">'.
+	__('To enable this function, please give write access to your plugins directory.').
+	'</p>';
+}
+echo '</div>';
 
 # --BEHAVIOR-- pluginsToolsTabs
-$core->callBehavior('pluginsToolsTabs', $core);
-
-# -- Notice for super admin --
-if ($core->auth->isSuperAdmin() && !$list->isPathWritable()) {
-	echo 
-	'<p class="warning">'.__('Some functions are disabled, please give write access to your plugins directory to enable them.').'</p>';
-}
+$core->callBehavior('pluginsToolsTabs',$core);
 
 dcPage::close();
Index: admin/post.php
===================================================================
--- admin/post.php	(revision 2166)
+++ admin/post.php	(revision 2142)
@@ -385,5 +385,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			__('Entries') => 'posts.php',
-			($post_id ? $page_title_edit : $page_title) => ''
+			'<span class="page-title">'.($post_id ? $page_title_edit : $page_title).'</span>' => ''
 		))
 );
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 2166)
+++ admin/posts.php	(revision 2136)
@@ -213,5 +213,5 @@
 -------------------------------------------------------- */
 
-$form_filter_title = __('Show filters and display options');
+$form_filter_title = __('Filter users list and display options');
 $starting_script  = dcPage::jsLoad('js/_posts_list.js');
 $starting_script .= dcPage::jsLoad('js/filter-controls.js');
@@ -221,5 +221,5 @@
 	dcPage::jsVar('dotclear.msg.show_filters', $show_filters ? 'true':'false')."\n".
 	dcPage::jsVar('dotclear.msg.filter_posts_list',$form_filter_title)."\n".
-	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel filters and display options'))."\n".
+	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel the filter'))."\n".
 	"//]]>".
 	"</script>";
@@ -229,5 +229,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			__('Entries') => ''
+			'<span class="page-title">'.__('Entries').'</span>' => ''
 		))
 );
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 2166)
+++ admin/preferences.php	(revision 2021)
@@ -382,5 +382,5 @@
 	array(
 		html::escapeHTML($core->auth->userID()) => '',
-		$page_title => ''
+		'<span class="page-title">'.$page_title.'</span>' => ''
 	))
 );
@@ -543,5 +543,5 @@
 echo '<h3>'.__('My dashboard').'</h3>';
 
-echo '<form action="preferences.php" method="post" id="favs-form" class="two-boxes odd">';
+echo '<form action="preferences.php" method="post" id="favs-form" class="two-boxes">';
 
 echo '<div id="my-favs" class="fieldset"><h4>'.__('My favorites').'</h4>';
Index: admin/search.php
===================================================================
--- admin/search.php	(revision 2166)
+++ admin/search.php	(revision 1912)
@@ -74,5 +74,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			__('Search') => ''
+			'<span class="page-title">'.__('Search').'</span>' => ''
 		))
 );
Index: admin/services.php
===================================================================
--- admin/services.php	(revision 2174)
+++ admin/services.php	(revision 1699)
@@ -27,5 +27,4 @@
 $core->rest->addFunction('searchMeta',array('dcRestMethods','searchMeta'));
 $core->rest->addFunction('setSectionFold',array('dcRestMethods','setSectionFold'));
-$core->rest->addFunction('getModuleById',array('dcRestMethods','getModuleById'));
 
 $core->rest->serve();
@@ -443,57 +442,6 @@
 		return true;
 	}
-	
-	public static function getModuleById($core, $get, $post)
-	{
-		if (empty($get['id'])) {
-				throw new Exception('No module ID');
-		}
-		if (empty($get['list'])) {
-				throw new Exception('No list ID');
-		}
-
-		$id = $get['id'];
-		$list = $get['list'];
-		$module = array();
-
-		if ($list == 'plugin-activate') {
-			$modules = $core->plugins->getModules();
-			if (empty($modules) || !isset($modules[$id])) {
-				throw new Exception('Unknow module ID');
-			}
-			$module = $modules[$id];
-		}
-		elseif ($list == 'plugin-new') {
-			$repository = new dcRepository(
-				$core->plugins, 
-				$core->blog->settings->system->repository_plugin_url
-			);
-			$repository->check();
-
-			$modules = $repository->get();
-			if (empty($modules) || !isset($modules[$id])) {
-				throw new Exception('Unknow module ID');
-			}
-			$module = $modules[$id];
-		}
-		else {
-			// behavior not implemented yet
-		}
-
-		if (empty($module)) {
-				throw new Exception('Unknow module ID');
-		}
-
-		$module = adminModulesList::parseModuleInfo($id, $module);
-
-		$rsp = new xmlTag('module');
-		$rsp->id = $id;
-		
-		foreach($module as $k => $v) {
-			$rsp->{$k}((string) $v);
-		}
-
-		return $rsp;
-	}
+		
+	
 }
 ?>
Index: admin/style/default.css
===================================================================
--- admin/style/default.css	(revision 2179)
+++ admin/style/default.css	(revision 2142)
@@ -149,30 +149,51 @@
 		}
 /* ------------------------------------------------- layout: optionnal one/two-boxes */
+.one-box, .two-boxes, .three-boxes, .box {
+	margin-bottom: 1em;
+	}
 .one-box {
 	text-align: justify;
 	}
-.two-boxes, .three-boxes, .box {
+.two-boxes {
+	width: 47%;
 	display: inline-block;
 	vertical-align: top;
-	margin: 0 1.5% 1em;
+	margin-right: 2%;
 	-moz-box-sizing: border-box; 
 	-webkit-box-sizing: border-box; 
 	box-sizing: border-box;
-	text-align: left;
-	}
-.two-boxes {
-	width: 47%;
-	}
+	}
+	.two-boxes:first-child, .two-boxes.odd, .two-boxes.odd:last-child {
+		margin-right: 3%;
+		margin-left: 0;
+		}
+	.two-boxes.even:last-child, .two-boxes.even {
+		margin-left: 3%;
+		margin-right: 0;
+		}
 .three-boxes {
 	width: 30%;
-	}
+	display: inline-block;
+	vertical-align: top;
+	margin-left: 1.5%;
+	margin-right: 1.5%; 
+	-moz-box-sizing: border-box; 
+	-webkit-box-sizing: border-box; 
+	box-sizing: border-box;
+	}
+	.three-boxes:first-child, .three-boxes.first-child {
+		margin-left: 0;
+		}
+	.three-boxes:last-child, .three-boxes.last-child {
+		margin-right: 0;
+		}
+/* boîtes intérieures distribuées horizontalement */
 .box {
-	margin-left: 0;
-	margin-right: 0;
-	}
-.odd {
-	margin-left: 0;
-	}
-.even {
+	display: inline-block;
+	vertical-align: top;
+	margin-right: 3%; 
+	text-align: left;
+	}
+.box:last-child {
 	margin-right: 0;
 	}
@@ -427,7 +448,4 @@
 h1 a:link, h1 a:visited {
 	border:	none;
-	}
-.discrete a {
-	color: #333;
 	}
 /* ----------------------------------------------------------------------------
@@ -1456,8 +1474,8 @@
 		}
 		.box.small {
-			width: 320px;
+			width: 300px;
 			}
 		.box.medium {
-			width: 660px;
+			width: 640px;
 			}
 		.box.large {
@@ -1533,17 +1551,115 @@
 				}
 /* ------------------------------------------------------------------- blog_theme.php */
-.box.theme {
-	margin: 1em;
-	padding: 1em;
+#themes {
+	margin: 0;
+	width: 100%;
+	padding: 0;
+	}
+	.theme-details {
+		border-top: 1px solid #ccc;
+		padding: 12px;
+		display: inline-block;
+		vertical-align: top;
+		width: 284px;
+		}
+		.theme-details.current-theme {
+			background: #eef;
+			}
+		.theme-details:hover {
+			background: #f3f3f3;
+			}
+		.theme-shot img {
+			display: block;
+			border: 1px solid #ccc;
+			margin-bottom: 1.5em;
+			}
+		span.theme-desc {
+			display: block;
+			}
+		span.theme-version {
+			color: #676e78;
+			}
+		.theme-css {
+			display: block;
+			}
+	#themes-actions {
+		border-bottom: 1px solid #999;
+		margin-bottom: 3em;
+		}
+/* Themes list, JS version */
+#themes-wrapper {
+	display: table;
+	}
+	#themes-wrapper #themes {
+		display: table-cell;
+		vertical-align: top;
+		padding-left: 1em;
+		}
+	#theme-box {
+		display: table-cell;
+		vertical-align: top;
+		padding: 0;
+		width: 312px;
+		border: 1px solid #ccc;
+		border-radius: 3px;
+		}
+		#theme-box .theme-shot,
+		#theme-box .theme-info,
+		#theme-box .theme-actions {
+			background: #eef;
+			padding: 1em 16px;
+			margin: 0;
+			}
+		#theme-box .theme-shot img {
+			display: block;
+			width: 280px;
+			height: 245px;
+			border: 1px solid #ccc;
+			}
+		#theme-box h4 {
+			color: #000;
+			background: #eef;
+			}
+		#theme-box span.theme-version {
+			color: #676e78;
+			}
+		#theme-box span.theme-parent-ok {
+			color: #676e78;
+			}
+		#theme-box span.theme-parent-missing {
+			color: #c00;
+			font-weight:bold;
+			}
+		#theme-box .theme-actions {
+			border-bottom: 1px solid #ccc;
+			}
+#themes .theme-details-js {
+	float: left;
+	width: 120px;
+	height: 150px;
+	margin: 0 12px 24px;
+	padding: 12px 12px 0;
+	text-align: center;
+	background: #f3f3f3;
 	border: 1px solid #ddd;
-	}
-#theme-new .box.theme {
-	width: 280px;
-	}
-.module-sshot img {
-	border: 1px solid #ddd;
-	padding: .5em;
-	background: #fff;
-	}
+	cursor: pointer;
+	border-radius: 4px;
+	}
+	#themes .theme-details-js label {
+		cursor: pointer;
+		}
+	#themes .theme-details-js.theme-selected {
+		background: #e7e7e7;
+		border: 1px solid #999;
+		}
+	#themes .theme-details-js .theme-shot img {
+		width: 120px;
+		height: 105px;
+		border: 1px solid #fff;
+		}
+	#themes a:focus div, #themes a:hover div,
+	#themes a:focus div.current-theme, #themes a:hover div.current-theme {
+		background: #bee74b;
+		}
 /* ------------------------------------------------------------------ categories.php */
 #categories {
@@ -1850,51 +1966,11 @@
 		}
 /* -------------------------------------------------------------------- plugins.php */
-.modules td.module-actions, .modules td.module-icon {
+#plugins td.action {
 	vertical-align: middle;
 	}
-.modules td.module-icon img:last-child {
-	width: 16px;
-	height: 16px;
-	}
-.modules td.module-icon img.expand {
-	margin-bottom: 3px;
-	}
-.modules td.module-distrib img {
+.distrib img {
 	display: block;
 	float: right;
-	}
-.modules dt {
-	font-weight: bold;
-	}
-.modules a.module-details {
-	background: transparent url(search.png) no-repeat 2px 2px;
-	padding: 4px 4px 0 20px;
-	}
-.modules a.module-support {
-	background: transparent url(../images/page_help.png) no-repeat 2px 2px;
-	padding: 4px 4px 0 20px;
-	}
-#m_search {	
-	background: transparent url(search.png) no-repeat 4px center;
-	padding-left: 20px;
-	}
-.modules tr.expand, .modules td.expand {
-	background: #f7f7f7;
-	border-color: #bee74b;
-	}
-.modules tr.expand td:first-child {
-	font-weight: bold;
-	background: #DFE5E7;
-	}
-.modules td.expand {
-	padding: 0;
-	}
-.mod-more, .mod-more li {
-	margin: .25em 0 0 1em;
-	padding: 0;
-	list-style-type: none;
-	}
-.mod-more {
-	padding-top: .5em;
+	margin-top: -1em;
 	}
 /* ---------------------------------------------------------- post.php, page.php */
@@ -2318,44 +2394,4 @@
 	display: block;
 	}
-/* ---------------------------------------------- Couleurs ajoutées via javascript	
-/* color-picker.js */
-.color-color-picker {
-	border: 1px solid #000;
-	width: 195px;
-	background: #fff;
-	}
-/* _blog_theme.js */
-.select-button {
-	font-weight: bold;
-	}
-/* _media_item.js */
-.color-div {
-	border: 1px solid #ccc;
-	}
-/* fadings ('color' est utilisé comme variable, pas comme text color) */
-.colorBeginPassword, .colorBeginValidatorErr, .colorBeginUserMail {
-	color: #fff;
-	}
-.colorEndPassword, .colorEndError, .colorEndValidatorErr, .colorEndUserMail {
-	color: #ffbaba;
-	}
-.colorBeginMessage {
-	color: #ccc;
-	}
-.colorEndMessage, .colorBeginValidatorMsg {
-	color: #676e78;
-	}
-.colorBeginError {
-	color: #ffdec8;
-	}
-.colorBeginSuccess {
-	color: #9BCA1C;
-	}
-.colorEndSuccess {
-	color: #bee74b;
-	}
- .colorEndValidatorMsg {
-	color: #ffcc00;
-	}
 /* ------------------------------------------------------------------------------------
 															UN POIL DE MEDIA QUERIES
@@ -2397,11 +2433,8 @@
 	#top-info-user a.active {
 		padding: 2px 8px;
-		background: #999;
-		color: #FFF;
-		border-width: 0;
-		-webkit-border-radius: 6px;
-		        border-radius: 6px;
 		} 
 	.three-boxes, .three-boxes .box,
+	.three-boxes:first-child, .three-boxes.first-child,
+	.three-boxes:last-child, .three-boxes.last-child,
 	.two-cols .col70, .two-cols .col30 {
 		width: 100%;
@@ -2424,5 +2457,8 @@
 		top: 77px;
 		}
-	.one-box, .two-boxes, .two-boxes.odd, .two-boxes.even, .box,
+	.one-box, .two-boxes,
+	.one-box .box, .two-boxes .box, .two-boxes.odd, .two-boxes.even,
+	.two-boxes:first-child, .two-boxes.odd, .two-boxes.odd:last-child,
+	.two-boxes.even:last-child, .two-boxes.even,
 	.two-cols .col {
 		width: 100%;
@@ -2457,5 +2493,5 @@
 		display: inline;
 		}
-	#content, .hide-mm #content {
+	#content {
 		margin: 0;
 		padding: 0 .5em !important;
@@ -2466,14 +2502,14 @@
 	#main #content > h2 {
 		margin: 0;
-		padding: 6px 30px 6px 0;
+		padding: 6px 0;
 		}
 	#dashboard-boxes .box.medium,
 	#dashboard-boxes .box.small,
 	#dashboard-boxes .box.large {
-		width: 100%;
+		width: 90%;
 		margin: 10px auto;
 		}
 	}
-@media screen and (max-width: 420px) {
+@media screen and (max-width: 500px) {
 	h1, h1 a {
 		padding: 0;
@@ -2483,10 +2519,10 @@
 		display: none;
 		}
-	#top-info-blog {
-		margin-bottom: .5em;
-		max-width: 75%;
-		}
 	#top-info-blog select {
 		margin-bottom: .5em;
+		margin-right: 0 !important;
+		}
+	#top-info-blog p {
+		display: block;
 		}
 	#icons p {
@@ -2497,2 +2533,42 @@
 		}
 	}
+/* ---------------------------------------------- Couleurs ajoutées via javascript	
+/* color-picker.js */
+.color-color-picker {
+	border: 1px solid #000;
+	width: 195px;
+	background: #fff;
+	}
+/* _blog_theme.js */
+.select-button {
+	font-weight: bold;
+	}
+/* _media_item.js */
+.color-div {
+	border: 1px solid #ccc;
+	}
+/* fadings ('color' est utilisé comme variable, pas comme text color) */
+.colorBeginPassword, .colorBeginValidatorErr, .colorBeginUserMail {
+	color: #fff;
+	}
+.colorEndPassword, .colorEndError, .colorEndValidatorErr, .colorEndUserMail {
+	color: #ffbaba;
+	}
+.colorBeginMessage {
+	color: #ccc;
+	}
+.colorEndMessage, .colorBeginValidatorMsg {
+	color: #676e78;
+	}
+.colorBeginError {
+	color: #ffdec8;
+	}
+.colorBeginSuccess {
+	color: #9BCA1C;
+	}
+.colorEndSuccess {
+	color: #bee74b;
+	}
+ .colorEndValidatorMsg {
+	color: #ffcc00;
+	}
Index: admin/update.php
===================================================================
--- admin/update.php	(revision 2166)
+++ admin/update.php	(revision 1792)
@@ -178,5 +178,5 @@
 		array(
 			__('System') => '',
-			__('Dotclear update') => ''
+			'<span class="page-title">'.__('Dotclear update').'</span>' => ''
 		))
 );
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 2166)
+++ admin/user.php	(revision 1719)
@@ -186,5 +186,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			$page_title => ''
+			'<span class="page-title">'.$page_title.'</span>' => ''
 		))
 );
Index: admin/users.php
===================================================================
--- admin/users.php	(revision 2166)
+++ admin/users.php	(revision 2137)
@@ -93,5 +93,5 @@
 -------------------------------------------------------- */
 
-$form_filter_title = __('Show filters and display options');
+$form_filter_title = __('Filter users list and display options');
 $starting_script  = dcPage::jsLoad('js/_users.js');
 $starting_script .= dcPage::jsLoad('js/filter-controls.js');
@@ -101,5 +101,5 @@
 	dcPage::jsVar('dotclear.msg.show_filters', $show_filters ? 'true':'false')."\n".
 	dcPage::jsVar('dotclear.msg.filter_posts_list',$form_filter_title)."\n".
-	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel filters and display options'))."\n".
+	dcPage::jsVar('dotclear.msg.cancel_the_filter',__('Cancel the filter'))."\n".
 	"//]]>".
 	"</script>";
@@ -109,5 +109,5 @@
 		array(
 			__('System') => '',
-			__('Users') => ''
+			'<span class="page-title">'.__('Users').'</span>' => ''
 		))
 );
Index: admin/users_actions.php
===================================================================
--- admin/users_actions.php	(revision 2166)
+++ admin/users_actions.php	(revision 2108)
@@ -136,5 +136,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			__('Permissions') => ''
+			'<span class="page-title">'.__('Permissions').'</span>' => ''
 		));
 } else {
@@ -143,5 +143,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			__('Actions') => ''
+			'<span class="page-title">'.__('Actions').'</span>' => ''
 		));
 }
