Index: admin/blog.php
===================================================================
--- admin/blog.php	(revision 1615)
+++ admin/blog.php	(revision 2166)
@@ -72,5 +72,5 @@
 				__('System') => '',
 				__('Blogs') => 'blogs.php',
-				'<span class="page-title">'.__('New blog').'</span>' => ''
+				__('New blog') => ''
 			))
 	);
Index: admin/blog_del.php
===================================================================
--- admin/blog_del.php	(revision 1733)
+++ admin/blog_del.php	(revision 2166)
@@ -54,5 +54,5 @@
 			__('System') => '',
 			__('Blogs') => 'blogs.php',
-			'<span class="page-title">'.__('Delete a blog').'</span>' => ''
+			__('Delete a blog') => ''
 		))
 );
Index: admin/blog_pref.php
===================================================================
--- admin/blog_pref.php	(revision 2028)
+++ admin/blog_pref.php	(revision 2166)
@@ -270,6 +270,7 @@
 		array(
 			html::escapeHTML($blog_name) => '',
-			'<span class="page-title">'.__('Blog settings').'</span>' => ''
-		));
+			__('Blog settings') => ''
+		)
+	);
 } else {
 	$breadcrumb = dcPage::breadcrumb(
@@ -277,5 +278,5 @@
 			__('System') => '',
 			__('Blogs') => 'blogs.php',
-			'<span class="page-title">'.__('Blog settings').' : '.html::escapeHTML($blog_name).'</span>' => ''
+			__('Blog settings').' : '.html::escapeHTML($blog_name) => ''
 		));
 }
Index: admin/blog_theme.php
===================================================================
--- admin/blog_theme.php	(revision 1553)
+++ admin/blog_theme.php	(revision 2166)
@@ -212,5 +212,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Blog appearance').'</span>' => ''
+			__('Blog appearance') => ''
 		));
 } else {
@@ -219,5 +219,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			__('Blog appearance') => 'blog_theme.php',
-			'<span class="page-title">'.__('Theme configuration').'</span>' => ''
+			__('Theme configuration') => ''
 		));
 }
Index: admin/blogs.php
===================================================================
--- admin/blogs.php	(revision 2145)
+++ admin/blogs.php	(revision 2166)
@@ -88,5 +88,5 @@
 		array(
 			__('System') => '',
-			'<span class="page-title">'.__('List of blogs').'</span>' => ''
+			__('List of blogs')
 		))
 );
Index: admin/categories.php
===================================================================
--- admin/categories.php	(revision 2125)
+++ admin/categories.php	(revision 2166)
@@ -107,5 +107,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Categories').'</span>' => ''
+			__('Categories') => ''
 		))
 );
Index: admin/category.php
===================================================================
--- admin/category.php	(revision 2117)
+++ admin/category.php	(revision 2166)
@@ -166,5 +166,5 @@
 	}
 }
-$elements['<span class="page-title">'.$title.'</span>'] = '';
+$elements[$title] = '';
 
 dcPage::open($title,
Index: admin/comment.php
===================================================================
--- admin/comment.php	(revision 1972)
+++ admin/comment.php	(revision 2166)
@@ -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,
-			'<span class="page-title">'.__('Edit comment').'</span>' => ''
+			__('Edit comment') => ''
 		));
 } else {
@@ -171,5 +171,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			html::escapeHTML($post_title) => $core->getPostAdminURL($post_type,$post_id),
-			'<span class="page-title">'.__('Edit comment').'</span>' => ''
+			__('Edit comment') => ''
 		));
 }
Index: admin/comments.php
===================================================================
--- admin/comments.php	(revision 2145)
+++ admin/comments.php	(revision 2166)
@@ -169,5 +169,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Comments and trackbacks').'</span>' => ''
+			__('Comments and trackbacks') => ''
 		))
 );
Index: admin/help.php
===================================================================
--- admin/help.php	(revision 2074)
+++ admin/help.php	(revision 2166)
@@ -77,10 +77,10 @@
 		array(
 			__('Global help') => 'help.php',
-			'<span class="page-title">'.$content_array['title'].'</span>' => ''
+			$content_array['title'] => ''
 		));
 } else {
 	$breadcrumb = dcPage::breadcrumb(
 		array(
-			'<span class="page-title">'.__('Global help').'</span>' => ''
+			__('Global help') => ''
 		));
 }
Index: admin/index.php
===================================================================
--- admin/index.php	(revision 2159)
+++ admin/index.php	(revision 2166)
@@ -205,7 +205,8 @@
 	dcPage::breadcrumb(
 		array(
-		'<span class="page-title">'.__('Dashboard').' : '.html::escapeHTML($core->blog->name).'</span>' => ''
+		__('Dashboard').' : '.html::escapeHTML($core->blog->name) => ''
 		),
-		false)
+		array('home_link' =>false)
+	)
 );
 
Index: admin/js/_plugins.js
===================================================================
--- admin/js/_plugins.js	(revision 2157)
+++ 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>'+dotclear.msg.module_author+' '+author+'</li>'));
-                                }
-                                if (details) {
-                                        var dd = '';
-                                        dd += '<a class="details" href="'+details+'">'+dotclear.msg.module_details+'</a>';
-                                        if (support) {
-                                                dd += ' - ';
-                                                dd += '<a class="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>'+dotclear.msg.module_section+' '+section+'</li>'));
-                                }
-                                if (tags) {
-                                        $(dlb).append($('<li>'+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/langs.php
===================================================================
--- admin/langs.php	(revision 2007)
+++ admin/langs.php	(revision 2166)
@@ -133,5 +133,5 @@
 	array(
 		__('System') => '',
-		'<span class="page-title">'.__('Languages management').'</span>' => ''
+		__('Languages management') => ''
 	))
 );
Index: admin/media.php
===================================================================
--- admin/media.php	(revision 2152)
+++ admin/media.php	(revision 2166)
@@ -212,6 +212,8 @@
 				html::escapeHTML($core->blog->name) => '',
 				__('Media manager') => '',
-				'<span class="page-title">'.__('confirm removal').'</span>' => ''
-			),!$popup)
+				__('confirm removal') => ''
+			),
+			array('home_link' => !$popup)
+		)
 	);
 	
@@ -240,6 +242,8 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Media manager').'</span>' => ''
-		),!$popup);
+			__('Media manager') => ''
+		),
+		array('home_link' => !$popup)
+	);
 } else {
 	$breadcrumb_media = $core->media->breadCrumb(html::escapeURL($page_url).'&amp;d=%s','<span class="page-title">%s</span>');
@@ -248,6 +252,8 @@
 			array(
 				html::escapeHTML($core->blog->name) => '',
-				'<span class="page-title">'.__('Media manager').'</span>' => ''
-			),!$popup);
+				__('Media manager') => ''
+			),
+			array('home_link' => !$popup)
+		);
 	} else {
 		$breadcrumb = dcPage::breadcrumb(
@@ -256,5 +262,10 @@
 				__('Media manager') => html::escapeURL($page_url.'&d='),
 				$breadcrumb_media => ''
-			),!$popup);
+			),
+			array(
+				'home_link' => !$popup,
+				'highlight_latest' => false
+			)
+		);
 	}
 }
Index: admin/media_item.php
===================================================================
--- admin/media_item.php	(revision 2106)
+++ admin/media_item.php	(revision 2166)
@@ -206,5 +206,10 @@
 			__('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>' => ''
-		),!$popup)
+		),
+		array(
+			'home_link' => !$popup,
+			'highlight_latest' => false
+		)
+	)
 );
 
Index: admin/plugin.php
===================================================================
--- admin/plugin.php	(revision 1358)
+++ admin/plugin.php	(revision 2166)
@@ -85,5 +85,5 @@
 			array(
 				__('System') => '',
-				'<span class="page-title">'.__('Plugin not found').'</span>' => ''
+				__('Plugin not found') => ''
 			))
 	);
Index: admin/plugins.php
===================================================================
--- admin/plugins.php	(revision 2165)
+++ admin/plugins.php	(revision 2166)
@@ -13,127 +13,155 @@
 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
-);
-
-
-# -- Check for module configuration --
-$conf_file = false;
-if (!empty($_REQUEST['conf']) && !empty($_REQUEST['module'])) {
-	if (!$core->plugins->moduleExists($_REQUEST['module'])) {
-		$core->error->add(__('Unknow module ID'));
-	}
-	else {
-		$module = $core->plugins->getModules($_REQUEST['module']);
-		$module = adminModulesList::setModuleInfo($_REQUEST['module'], $module);
-
-		if (!file_exists(path::real($module['root'].'/_config.php'))) {
-			$core->error->add(__('This module has no configuration file.'));
-		}
-		else {
-			$conf_file = path::real($module['root'].'/_config.php');
-		}
-	}
-}
-
-# -- Display module configuration page --
-if ($conf_file) {
-	dcPage::open(__('Plugins management'),
-
-		# --BEHAVIOR-- pluginsToolsHeaders
-		$core->callBehavior('pluginsToolsHeaders', $core, $module['id']),
-
-		dcPage::breadcrumb(
-			array(
-				html::escapeHTML($core->blog->name) => '',
-				'<a href="'.$list->getPageURL().'">'.__('Plugins management').'</a>' => '',
-				'<span class="page-title">'.__('Plugin configuration').'</span>' => ''
-			))
-	);
-
-	if (!empty($_GET['done'])){
-		dcPage::success(__('Plugin successfully configured.'));
-	}
-
-	try {
-		if (!$module['standalone_config']) {
-			echo
-			'<form id="module_config" action="'.$list->getPageURL('conf=1').'" method="post" enctype="multipart/form-data">'.
-			'<h3>'.sprintf(__('Configure plugin "%s"'), html::escapeHTML($module['name'])).'</h3>'.
-			'<p><a class="back" href="'.$list->getPageURL().'#plugins">'.__('Back').'</a></p>';
-		}
-		define('DC_CONTEXT_PLUGIN', true);
-
-		include $conf_file;
-
-		if (!$module['standalone_config']) {
-			echo
-			'<p class="clear"><input type="submit" name="save" value="'.__('Save').'" />'.
-			form::hidden('module', $module['id']).
-			$core->formNonce().'</p>'.
-			'</form>';
-		}
-	}
-	catch (Exception $e) {
-		echo '<div class="error"><p>'.$e->getMessage().'</p></div>';
-	}
-
-	dcPage::close();
-
-	# Stop reading code here
-	return;
-}
-
-# -- Execute actions --
-if (empty($_POST['conf']) && $core->auth->isSuperAdmin() && $list->isPathWritable()) {
-
+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
-	if ((!empty($_POST['upload_pkg']) && !empty($_FILES['pkg_file'])) ||
+	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']))) {
+			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'])) {
+			if (!empty($_POST['upload_pkg']))
+			{
 				files::uploadStatus($_FILES['pkg_file']);
 				
-				$dest = $list->getPath().'/'.$_FILES['pkg_file']['name'];
-				if (!move_uploaded_file($_FILES['pkg_file']['tmp_name'], $dest)) {
+				$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 {
+			else
+			{
 				$url = urldecode($_POST['pkg_url']);
-				$dest = $list->getPath().'/'.basename($url);
-				$repository->download($url, $dest);
+				$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);
 			}
 
@@ -141,179 +169,187 @@
 			$core->callBehavior('pluginsBeforeAdd', $plugin_id);
 						
-			$ret_code = $core->plugins->installPackage($dest, $core->plugins);
+			$ret_code = $core->plugins->installPackage($dest,$core->plugins);
 
 			# --BEHAVIOR-- pluginAfterAdd
 			$core->callBehavior('pluginsAfterAdd', $plugin_id);
 			
-			http::redirect('plugins.php?msg='.($ret_code == 2 ? 'update' : 'install').'#plugins');
-		}
-		catch (Exception $e) {
+			http::redirect('plugins.php?added='.$ret_code);
+		}
+		catch (Exception $e)
+		{
 			$core->error->add($e->getMessage());
-		}
-	}
-	elseif (!empty($_POST['module'])) {
-		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 --
+			$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') => '',
-			'<span class="page-title">'.__('Plugins management').'</span>' => ''
+			__('Plugins management') => ''
 		))
 );
 
-# -- Succes messages --
-if (!empty($_GET['msg'])) {
-	$list->displayMessage($_GET['msg'],__('Plugins'));
-}
-
-# -- 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>';
 	
@@ -321,5 +357,5 @@
 	echo
 	'<form method="post" action="plugins.php" id="uploadpkg" enctype="multipart/form-data" class="fieldset">'.
-	'<h4>'.__('Upload a zip file').'</h4>'.
+	'<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>'.
@@ -334,5 +370,5 @@
 	echo
 	'<form method="post" action="plugins.php" id="fetchpkg" class="fieldset">'.
-	'<h4>'.__('Download a zip file').'</h4>'.
+	'<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>'.
@@ -342,17 +378,16 @@
 	$core->formNonce().'</p>'.
 	'</form>';
-
-	echo
-	'</div>';
-}
+}
+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 2142)
+++ admin/post.php	(revision 2166)
@@ -385,5 +385,5 @@
 			html::escapeHTML($core->blog->name) => '',
 			__('Entries') => 'posts.php',
-			'<span class="page-title">'.($post_id ? $page_title_edit : $page_title).'</span>' => ''
+			($post_id ? $page_title_edit : $page_title) => ''
 		))
 );
Index: admin/posts.php
===================================================================
--- admin/posts.php	(revision 2145)
+++ admin/posts.php	(revision 2166)
@@ -229,5 +229,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Entries').'</span>' => ''
+			__('Entries') => ''
 		))
 );
Index: admin/preferences.php
===================================================================
--- admin/preferences.php	(revision 2152)
+++ admin/preferences.php	(revision 2166)
@@ -382,5 +382,5 @@
 	array(
 		html::escapeHTML($core->auth->userID()) => '',
-		'<span class="page-title">'.$page_title.'</span>' => ''
+		$page_title => ''
 	))
 );
Index: admin/search.php
===================================================================
--- admin/search.php	(revision 1912)
+++ admin/search.php	(revision 2166)
@@ -74,5 +74,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Search').'</span>' => ''
+			__('Search') => ''
 		))
 );
Index: admin/services.php
===================================================================
--- admin/services.php	(revision 2156)
+++ 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::setModuleInfo($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 2164)
+++ admin/style/default.css	(revision 2152)
@@ -1947,51 +1947,11 @@
 		}
 /* -------------------------------------------------------------------- plugins.php */
-.modules td.action, .modules td.icon {
+#plugins td.action {
 	vertical-align: middle;
 	}
-.modules td.icon img:last-child {
-	width: 16px;
-	height: 16px;
-	}
-.modules td.icon img.expand {
-	margin-bottom: 3px;
-	}
-.modules td.distrib img {
+.distrib img {
 	display: block;
 	float: right;
-	}
-.modules dt {
-	font-weight: bold;
-	}
-.modules a.details {
-	background: transparent url(search.png) no-repeat 2px 2px;
-	padding: 4px 4px 0 20px;
-	}
-.modules a.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 */
Index: admin/update.php
===================================================================
--- admin/update.php	(revision 1792)
+++ admin/update.php	(revision 2166)
@@ -178,5 +178,5 @@
 		array(
 			__('System') => '',
-			'<span class="page-title">'.__('Dotclear update').'</span>' => ''
+			__('Dotclear update') => ''
 		))
 );
Index: admin/user.php
===================================================================
--- admin/user.php	(revision 1719)
+++ admin/user.php	(revision 2166)
@@ -186,5 +186,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			'<span class="page-title">'.$page_title.'</span>' => ''
+			$page_title => ''
 		))
 );
Index: admin/users.php
===================================================================
--- admin/users.php	(revision 2145)
+++ admin/users.php	(revision 2166)
@@ -109,5 +109,5 @@
 		array(
 			__('System') => '',
-			'<span class="page-title">'.__('Users').'</span>' => ''
+			__('Users') => ''
 		))
 );
Index: admin/users_actions.php
===================================================================
--- admin/users_actions.php	(revision 2108)
+++ admin/users_actions.php	(revision 2166)
@@ -136,5 +136,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			'<span class="page-title">'.__('Permissions').'</span>' => ''
+			__('Permissions') => ''
 		));
 } else {
@@ -143,5 +143,5 @@
 			__('System') => '',
 			__('Users') => 'users.php',
-			'<span class="page-title">'.__('Actions').'</span>' => ''
+			__('Actions') => ''
 		));
 }
Index: inc/admin/actions/class.dcactioncomments.php
===================================================================
--- inc/admin/actions/class.dcactioncomments.php	(revision 2075)
+++ inc/admin/actions/class.dcactioncomments.php	(revision 2166)
@@ -59,5 +59,5 @@
 				html::escapeHTML($this->core->blog->name) => '',
 				__('Comments') => 'comments.php',
-				'<span class="page-title">'.__('Comments actions').'</span>' => ''
+				__('Comments actions') => ''
 			))
 		);
Index: inc/admin/actions/class.dcactionposts.php
===================================================================
--- inc/admin/actions/class.dcactionposts.php	(revision 2072)
+++ inc/admin/actions/class.dcactionposts.php	(revision 2166)
@@ -61,5 +61,5 @@
 				html::escapeHTML($this->core->blog->name) => '',
 				$this->getCallerTitle() => $this->getRedirection(array(),true),
-				'<span class="page-title">'.__('Entries actions').'</span>' => ''
+				__('Entries actions') => ''
 			))
 		);
@@ -229,5 +229,5 @@
 						html::escapeHTML($core->blog->name) => '',
 						$ap->getCallerTitle() => $ap->getRedirection(array(),true),
-						'<span class="page-title">'.__('Change category for this selection').'</span>' => ''
+						__('Change category for this selection') => ''
 			)));
 			# categories list
@@ -299,5 +299,5 @@
 						html::escapeHTML($core->blog->name) => '',
 						$ap->getCallerTitle() => $ap->getRedirection(array(),true),
-						'<span class="page-title">'.__('Change author for this selection').'</span>' => '')),
+						__('Change author for this selection') => '')),
 					dcPage::jsLoad('js/jquery/jquery.autocomplete.js').
 					'<script type="text/javascript">'."\n".
@@ -340,5 +340,5 @@
 						html::escapeHTML($core->blog->name) => '',
 						$ap->getCallerTitle() => $ap->getRedirection(array(),true),
-						'<span class="page-title">'.__('Change language for this selection').'</span>' => ''
+						_('Change language for this selection') => ''
 			)));
 			# lang list
Index: inc/admin/lib.dc.page.php
===================================================================
--- inc/admin/lib.dc.page.php	(revision 2164)
+++ inc/admin/lib.dc.page.php	(revision 2166)
@@ -304,6 +304,9 @@
 	}
 
-	public static function breadcrumb($elements=null,$with_home_link=true,$echo=false)
-	{
+	public static function breadcrumb($elements=null,$options=array())
+	{
+		$with_home_link = isset($options['home_link'])?$options['home_link']:true;
+		$highlight_latest = isset($options['highlight_latest'])?$options['highlight_latest']:true;
+		$highlight_pos = isset($options['highlight_pos'])?$options['highlight_pos']:-1;
 		// First item of array elements should be blog's name, System or Plugins
 		$res = '<h2>'.($with_home_link ?
@@ -311,5 +314,11 @@
 			'<img src="style/dashboard-alt.png" alt="" />');
 		$index = 0;
+		if ($highlight_pos < 0) {
+			$highlight_pos = count($elements)+$highlight_pos;
+		}
 		foreach ($elements as $element => $url) {
+			if ($highlight_latest && $index == $highlight_pos) {
+				$element = sprintf('<span class="page-title">%s</span>',$element);
+			}
 			$res .= ($with_home_link ? ($index == 1 ? ' : ' : ' &rsaquo; ') : ($index == 0 ? ' ' : ' &rsaquo; ')).
 				($url ? '<a href="'.$url.'">' : '').$element.($url ? '</a>' : '');
@@ -317,7 +326,4 @@
 		}
 		$res .= '</h2>';
-		if ($echo) {
-			echo $res;
-		}
 		return $res;
 	}
@@ -605,17 +611,4 @@
 		self::jsVar('dotclear.msg.load_enhanced_uploader',
 			__('Loading enhanced uploader, please wait.')).
-
-		self::jsVar('dotclear.msg.module_author',
-			__('Author:')).
-		self::jsVar('dotclear.msg.module_details',
-			__('Details')).
-		self::jsVar('dotclear.msg.module_support',
-			__('Support')).
-		self::jsVar('dotclear.msg.module_help',
-			__('Help:')).
-		self::jsVar('dotclear.msg.module_section',
-			__('Section:')).
-		self::jsVar('dotclear.msg.module_tags',
-			__('Tags:')).
 			"\n//]]>\n".
 		"</script>\n";
Index: nc/admin/lib.moduleslist.php
===================================================================
--- inc/admin/lib.moduleslist.php	(revision 2163)
+++ 	(revision )
@@ -1,647 +1,0 @@
-<?php
-
-class adminModulesList
-{
-	public $core;
-	public $modules;
-
-	public static  $allow_multi_install;
-
-	protected $list_id = 'unknow';
-
-	protected $path = false;
-	protected $path_writable = false;
-	protected $path_pattern = false;
-
-	protected $page_url = 'plugins.php';
-	protected $page_qs = '?';
-	protected $page_tab = '';
-
-	public static $nav_indexes = 'abcdefghijklmnopqrstuvwxyz0123456789';
-	protected $nav_list = array();
-	protected $nav_special = 'other';
-
-	protected $sort_field = 'sname';
-	protected $sort_asc = true;
-
-	public function __construct($core, $root, $allow_multi_install=false)
-	{
-		$this->core = $core;
-		self::$allow_multi_install = (boolean) $allow_multi_install;
-		$this->setPathInfo($root);
-		$this->setNavSpecial(__('other'));
-
-		$this->init();
-	}
-
-	protected function init()
-	{
-		return null;
-	}
-
-	public function newList($list_id)
-	{
-		$this->modules = array();
-		$this->page_tab = '';
-		$this->list_id = $list_id;
-
-		return $this;
-	}
-
-	protected function setPathInfo($root)
-	{
-		$paths = explode(PATH_SEPARATOR, $root);
-		$path = array_pop($paths);
-		unset($paths);
-
-		$this->path = $path;
-		if (is_dir($path) && is_writeable($path)) {
-			$this->path_writable = true;
-			$this->path_pattern = preg_quote($path,'!');
-		}
-
-		return $this;
-	}
-
-	public function getPath()
-	{
-		return $this->path;
-	}
-
-	public function isPathWritable()
-	{
-		return $this->path_writable;
-	}
-
-	public function isPathDeletable($root)
-	{
-		return $this->path_writable 
-			&& preg_match('!^'.$this->path_pattern.'!', $root) 
-			&& $this->core->auth->isSuperAdmin();
-	}
-
-	public function setPageURL($url)
-	{
-		$this->page_qs = strpos('?', $url) ? '&' : '?';
-		$this->page_url = $url;
-
-		return $this;
-	}
-
-	public function getPageURL($queries='', $with_tab=true)
-	{
-		return $this->page_url.
-			(!empty($queries) ? $this->page_qs : '').
-			(is_array($queries) ? http_build_query($queries) : $queries).
-			($with_tab && !empty($this->page_tab) ? '#'.$this->page_tab : '');
-	}
-
-	public function setPageTab($tab)
-	{
-		$this->page_tab = $tab;
-
-		return $this;
-	}
-
-	public function getPageTab()
-	{
-		return $this->page_tab;
-	}
-
-	public function getSearchQuery()
-	{
-		$query = !empty($_REQUEST['m_search']) ? trim($_REQUEST['m_search']) : null;
-		return strlen($query) > 1 ? $query : null;
-	}
-
-	public function displaySearchForm()
-	{
-		$query = $this->getSearchQuery();
-
-		if (empty($this->modules) && $query === null) {
-			return $this;
-		}
-
-		echo 
-		'<form action="'.$this->getPageURL().'" method="get" class="fieldset">'.
-		'<p><label for="m_search" class="classic">'.__('Search in repository:').'&nbsp;</label><br />'.
-		form::field(array('m_search','m_search'), 30, 255, html::escapeHTML($query)).
-		'<input type="submit" value="'.__('Search').'" /> ';
-		if ($query) { echo ' <a href="'.$this->getPageURL().'" class="button">'.__('Reset search').'</a>'; }
-		echo '</p>'.
-		'</form>';
-
-		if ($query) {
-			echo 
-			'<p class="message">'.sprintf(
-				__('Found %d result for search "%s":', 'Found %d results for search "%s":', count($this->modules)), 
-				count($this->modules), html::escapeHTML($query)
-				).
-			'</p>';
-		}
-		return $this;
-	}
-
-	public function setNavSpecial($str)
-	{
-		$this->nav_special = (string) $str;
-		$this->nav_list = array_merge(str_split(self::$nav_indexes), array($this->nav_special));
-
-		return $this;
-	}
-
-	public function getNavQuery()
-	{
-		return isset($_REQUEST['m_nav']) && in_array($_REQUEST['m_nav'], $this->nav_list) ? $_REQUEST['m_nav'] : $this->nav_list[0];
-	}
-
-	public function displayNavMenu()
-	{
-		if (empty($this->modules) || $this->getSearchQuery() !== null) {
-			return $this;
-		}
-
-		# Fetch modules required field
-		$indexes = array();
-		foreach ($this->modules as $id => $module) {
-			if (!isset($module[$this->sort_field])) {
-				continue;
-			}
-			$char = substr($module[$this->sort_field], 0, 1);
-			if (!in_array($char, $this->nav_list)) {
-				$char = $this->nav_special;
-			}
-			if (!isset($indexes[$char])) {
-				$indexes[$char] = 0;
-			}
-			$indexes[$char]++;
-		}
-
-		$buttons = array();
-		foreach($this->nav_list as $char) {
-			# Selected letter
-			if ($this->getNavQuery() == $char) {
-				$buttons[] = '<li class="active" title="'.__('current selection').'"><strong> '.$char.' </strong></li>';
-			}
-			# Letter having modules
-			elseif (!empty($indexes[$char])) {
-				$title = sprintf(__('%d module', '%d modules', $indexes[$char]), $indexes[$char]);
-				$buttons[] = '<li class="btn" title="'.$title.'"><a href="'.$this->getPageURL('m_nav='.$char).'" title="'.$title.'"> '.$char.' </a></li>';
-			}
-			# Letter without modules
-			else {
-				$buttons[] = '<li class="btn no-link" title="'.__('no module').'"> '.$char.' </li>';
-			}
-		}
-		# Parse navigation menu
-		echo '<div class="pager">'.__('Browse index:').' <ul>'.implode('',$buttons).'</ul></div>';
-
-		return $this;
-	}
-
-	public function setSortField($field, $asc=true)
-	{
-		$this->sort_field = $field;
-		$this->sort_asc = (boolean) $asc;
-
-		return $this;
-	}
-
-	public function getSortQuery()
-	{
-		return !empty($_REQUEST['m_sort']) ? $_REQUEST['m_sort'] : $this->sort_field;
-	}
-
-	public function displaySortForm()
-	{
-		//not yet implemented
-	}
-
-	public function displayMessage($action)
-	{
-		switch($action) {
-			case 'activate': 
-				$str = __('Module successfully activated.'); break;
-			case 'deactivate': 
-				$str = __('Module successfully deactivated.'); break;
-			case 'delete': 
-				$str = __('Module successfully deleted.'); break;
-			case 'install': 
-				$str = __('Module successfully installed.'); break;
-			case 'update': 
-				$str = __('Module successfully updated.'); break;
-			default:
-				$str = ''; break;
-		}
-		if (!empty($str)) {
-			dcPage::success($str);
-		}
-	}
-
-	public function setModules($modules)
-	{
-		$this->modules = array();
-		foreach($modules as $id => $module) {
-			$this->modules[$id] = self::setModuleInfo($id, $module);
-		}
-
-		return $this;
-	}
-
-	public function getModules()
-	{
-		return $this->modules;
-	}
-
-	public static function setModuleInfo($id, $module)
-	{
-		$label = empty($module['label']) ? $id : $module['label'];
-		$name = __(empty($module['name']) ? $label : $module['name']);
-		
-		return array_merge(
-			# Default values
-			array(
-				'desc' 				=> '',
-				'author' 			=> '',
-				'version' 			=> 0,
-				'current_version' 	=> 0,
-				'root' 				=> '',
-				'root_writable' 	=> false,
-				'permissions' 		=> null,
-				'parent' 			=> null,
-				'priority' 			=> 1000,
-				'standalone_config' => false,
-				'support' 			=> '',
-				'section' 			=> '',
-				'tags' 				=> '',
-				'details' 			=> ''
-			),
-			# Module's values
-			$module,
-			# Clean up values
-			array(
-				'id' 				=> $id,
-				'sid' 				=> self::sanitizeString($id),
-				'label' 			=> $label,
-				'name' 				=> $name,
-				'sname' 			=> self::sanitizeString($name)
-			)
-		);
-	}
-
-	public static function isDistributedModule($module)
-	{
-		return in_array($module, array(
-			'aboutConfig',
-			'akismet',
-			'antispam',
-			'attachments',
-			'blogroll',
-			'blowupConfig',
-			'daInstaller',
-			'fairTrackbacks',
-			'importExport',
-			'maintenance',
-			'pages',
-			'pings',
-			'simpleMenu',
-			'tags',
-			'themeEditor',
-			'userPref',
-			'widgets'
-		));
-	}
-
-	public static function sortModules($modules, $field, $asc=true)
-	{
-		$sorter = array();
-		foreach($modules as $id => $module) {
-			$sorter[$id] = isset($module[$field]) ? $module[$field] : $field;
-		}
-		array_multisort($sorter, $asc ? SORT_ASC : SORT_DESC, $modules);
-
-		return $modules;
-	}
-
-	public function displayModulesList($cols=array('name', 'config', 'version', 'desc'), $actions=array(), $nav_limit=false)
-	{
-		echo 
-		'<div class="table-outer">'.
-		'<table id="'.html::escapeHTML($this->list_id).'" class="modules'.(in_array('expander', $cols) ? ' expandable' : '').'">'.
-		'<caption class="hidden">'.html::escapeHTML(__('Modules list')).'</caption><tr>';
-
-		if (in_array('name', $cols)) {
-			echo 
-			'<th class="first nowrap"'.(in_array('icon', $cols) ? ' colspan="2"' : '').'>'.__('Name').'</th>';
-		}
-
-		if (in_array('version', $cols)) {
-			echo 
-			'<th class="nowrap count" scope="col">'.__('Version').'</th>';
-		}
-
-		if (in_array('current_version', $cols)) {
-			echo 
-			'<th class="nowrap count" scope="col">'.__('Current version').'</th>';
-		}
-
-		if (in_array('desc', $cols)) {
-			echo 
-			'<th class="nowrap" scope="col">'.__('Details').'</th>';
-		}
-
-		if (in_array('distrib', $cols)) {
-			echo '<th'.(in_array('desc', $cols) ? '' : ' class="maximal"').'></th>';
-		}
-
-		if (!empty($actions) && $this->core->auth->isSuperAdmin()) {
-			echo 
-			'<th class="minimal nowrap">'.__('Action').'</th>';
-		}
-
-		echo 
-		'</tr>';
-
-		$sort_field = $this->getSortQuery();
-
-		# Sort modules by id
-		$modules = $this->getSearchQuery() === null ?
-			self::sortModules($this->modules, $sort_field, $this->sort_asc) :
-			$this->modules;
-
-		$count = 0;
-		foreach ($modules as $id => $module)
-		{
-			# Show only requested modules
-			if ($nav_limit && $this->getSearchQuery() === null) {
-				$char = substr($module[$sort_field], 0, 1);
-				if (!in_array($char, $this->nav_list)) {
-					$char = $this->nav_special;
-				}
-				if ($this->getNavQuery() != $char) {
-					continue;
-				}
-			}
-
-			echo 
-			'<tr class="line" id="'.html::escapeHTML($this->list_id).'_m_'.html::escapeHTML($id).'" title="'.
-			sprintf(__('Configure module "%"'), html::escapeHTML($module['name'])).'">';
-
-			if (in_array('icon', $cols)) {
-				echo 
-				'<td class="nowrap icon">'.sprintf(
-					'<img alt="%1$s" title="%1$s" src="%2$s" />', 
-					html::escapeHTML($id), file_exists($module['root'].'/icon.png') ? 'index.php?pf='.$id.'/icon.png' : 'images/module.png'
-				).'</td>';
-			}
-
-			# Link to config file
-			$config = in_array('config', $cols) && !empty($module['root']) && file_exists(path::real($module['root'].'/_config.php'));
-
-			echo 
-			'<td class="nowrap" scope="row">'.($config ? 
-				'<a href="'.$this->getPageURL('module='.$id.'&conf=1').'">'.html::escapeHTML($module['name']).'</a>' : 
-				html::escapeHTML($module['name'])
-			).'</td>';
-
-			if (in_array('version', $cols)) {
-				echo 
-				'<td class="nowrap count">'.html::escapeHTML($module['version']).'</td>';
-			}
-
-			if (in_array('current_version', $cols)) {
-				echo 
-				'<td class="nowrap count">'.html::escapeHTML($module['current_version']).'</td>';
-			}
-
-			if (in_array('desc', $cols)) {
-				echo 
-				'<td class="maximal">'.html::escapeHTML($module['desc']).'</td>';
-			}
-
-			if (in_array('distrib', $cols)) {
-				echo 
-				'<td class="distrib">'.(self::isDistributedModule($id) ? 
-					'<img src="images/dotclear_pw.png" alt="'.
-					__('Module from official distribution').'" title="'.
-					__('module from official distribution').'" />' 
-				: '').'</td>';
-			}
-
-			if (!empty($actions) && $this->core->auth->isSuperAdmin()) {
-				echo 
-				'<td class="nowrap">';
-
-				$this->displayLineActions($id, $module, $actions);
-
-				echo
-				'</td>';
-			}
-
-			echo 
-			'</tr>';
-
-			$count++;
-		}
-		echo 
-		'</table></div>';
-
-		if(!$count) {
-			echo 
-			'<p class="message">'.__('No module matches your search.').'</p>';
-		}
-	}
-
-	protected function displayLineActions($id, $module, $actions)
-	{
-		$submits = array();
-
-		# Activate
-		if (in_array('deactivate', $actions) && $module['root_writable']) {
-			$submits[] = '<input type="submit" name="deactivate" value="'.__('Deactivate').'" />';
-		}
-
-		# Deactivate
-		if (in_array('activate', $actions) && $module['root_writable']) {
-			$submits[] = '<input type="submit" name="activate" value="'.__('Activate').'" />';
-		}
-
-		# Delete
-		if (in_array('delete', $actions) && $this->isPathDeletable($module['root'])) {
-			$submits[] = '<input type="submit" class="delete" name="delete" value="'.__('Delete').'" />';
-		}
-
-		# Install (form repository)
-		if (in_array('install', $actions) && $this->path_writable) {
-			$submits[] = '<input type="submit" name="install" value="'.__('Install').'" />';
-		}
-
-		# Update (from repository)
-		if (in_array('update', $actions) && $this->path_writable) {
-			$submits[] = '<input type="submit" name="update" value="'.__('Update').'" />';
-		}
-
-		# Parse form
-		if (!empty($submits)) {
-			echo 
-			'<form action="'.$this->getPageURL().'" method="post">'.
-			'<div>'.
-			$this->core->formNonce().
-			form::hidden(array('module'), html::escapeHTML($id)).
-			form::hidden(array('tab'), $this->page_tab).
-			implode(' ', $submits).
-			'</div>'.
-			'</form>';
-		}
-	}
-
-	public function executeAction($prefix, dcModules $modules, dcRepository $repository)
-	{
-		if (empty($_POST['module'])	|| !$this->core->auth->isSuperAdmin() || !$this->isPathWritable()) {
-			return null;
-		}
-
-		$id = $_POST['module'];
-
-		if (!empty($_POST['activate'])) {
-
-			$enabled = $modules->getDisabledModules();
-			if (!isset($enabled[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			# --BEHAVIOR-- moduleBeforeActivate
-			$this->core->callBehavior($type.'BeforeActivate', $id);
-
-			$modules->activateModule($id);
-
-			# --BEHAVIOR-- moduleAfterActivate
-			$this->core->callBehavior($type.'AfterActivate', $id);
-
-			http::redirect($this->getPageURL('msg=activate'));
-		}
-
-		if (!empty($_POST['deactivate'])) {
-
-			if (!$modules->moduleExists($id)) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $modules->getModules($id);
-			$module['id'] = $id;
-
-			if (!$module['root_writable']) {
-				throw new Exception(__('You don\'t have permissions to deactivate this module.'));
-			}
-
-			# --BEHAVIOR-- moduleBeforeDeactivate
-			$this->core->callBehavior($prefix.'BeforeDeactivate', $module);
-
-			$modules->deactivateModule($id);
-
-			# --BEHAVIOR-- moduleAfterDeactivate
-			$this->core->callBehavior($prefix.'AfterDeactivate', $module);
-
-			http::redirect($this->getPageURL('msg=deactivate'));
-		}
-
-		if (!empty($_POST['delete'])) {
-
-			$disabled = $modules->getDisabledModules();
-			if (!isset($disabled[$id])) {
-
-				if (!$modules->moduleExists($id)) {
-					throw new Exception(__('No such module.'));
-				}
-
-				$module = $modules->getModules($id);
-				$module['id'] = $id;
-
-				if (!$this->isPathDeletable($module['root'])) {
-					throw new Exception(__("You don't have permissions to delete this module."));
-				}
-
-				# --BEHAVIOR-- moduleBeforeDelete
-				$this->core->callBehavior($prefix.'BeforeDelete', $module);
-
-				$modules->deleteModule($id);
-
-				# --BEHAVIOR-- moduleAfterDelete
-				$this->core->callBehavior($prefix.'AfterDelete', $module);
-			}
-			else {
-				$modules->deleteModule($id, true);
-			}
-
-			http::redirect($this->getPageURL('msg=delete'));
-		}
-
-		if (!empty($_POST['update'])) {
-
-			$updated = $repository->get();
-			if (!isset($updated[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			if (!$modules->moduleExists($id)) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $updated[$id];
-			$module['id'] = $id;
-		
-			if (!self::$allow_multi_install) {
-				$dest = $module['root'].'/../'.basename($module['file']);
-			}
-			else {
-				$dest = $this->getPath().'/'.basename($module['file']);
-				if ($module['root'] != $dest) {
-					@file_put_contents($module['root'].'/_disabled', '');
-				}
-			}
-
-			# --BEHAVIOR-- moduleBeforeUpdate
-			$this->core->callBehavior($type.'BeforeUpdate', $module);
-
-			$repository->process($module['file'], $dest);
-
-			# --BEHAVIOR-- moduleAfterUpdate
-			$this->core->callBehavior($type.'AfterUpdate', $module);
-
-			http::redirect($this->getPageURL('msg=upadte'));
-		}
-
-		if (!empty($_POST['install'])) {
-
-			$updated = $repository->get();
-			if (!isset($updated[$id])) {
-				throw new Exception(__('No such module.'));
-			}
-
-			$module = $updated[$id];
-			$module['id'] = $id;
-
-			$dest = $this->getPath().'/'.basename($module['file']);
-
-			# --BEHAVIOR-- moduleBeforeAdd
-			$this->core->callBehavior($type.'BeforeAdd', $module);
-
-			$ret_code = $repository->process($module['file'], $dest);
-
-			# --BEHAVIOR-- moduleAfterAdd
-			$this->core->callBehavior($type.'AfterAdd', $module);
-
-			http::redirect($this->getPageURL('msg='.($ret_code == 2 ? 'update' : 'install')));
-		}
-	}
-
-	public static function sanitizeString($str)
-	{
-		return preg_replace('/[^A-Za-z0-9\@\#+_-]/', '', strtolower($str));
-	}
-}
-
-class adminThemesList extends adminModulesList
-{
-
-}
Index: nc/core/class.dc.repository.parser.php
===================================================================
--- inc/core/class.dc.repository.parser.php	(revision 2146)
+++ 	(revision )
@@ -1,91 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_RC_PATH')) { return; }
-
-/**
-@ingroup DC_CORE
-@brief Rpeository modules feed parser
-
-Provides an object to parse feed of modules from repository.
-*/
-class dcRepositoryParser
-{
-	protected $xml;
-	protected $items;
-	protected static $bloc = 'http://dotaddict.org/da/';
-
-	public function __construct($data)
-	{
-		if (!is_string($data)) {
-			throw new Exception(__('Failed to read data feed'));
-		}
-
-		$this->xml = simplexml_load_string($data);
-		$this->items = array();
-
-		if ($this->xml === false) {
-			throw new Exception(__('Wrong data feed'));
-		}
-
-		$this->_parse();
-
-		unset($data);
-		unset($this->xml);
-	}
-
-	protected function _parse()
-	{
-		if (empty($this->xml->module)) {
-			return;
-		}
-
-		foreach ($this->xml->module as $i)
-		{
-			$attrs = $i->attributes();
-
-			$item = array();
-
-			# DC/DA shared markers
-			$item['id']		= (string) $attrs['id'];
-			$item['file']		= (string) $i->file;
-			$item['label']		= (string) $i->name; // deprecated
-			$item['name']		= (string) $i->name;
-			$item['version']	= (string) $i->version;
-			$item['author']	= (string) $i->author;
-			$item['desc']		= (string) $i->desc;
-
-			# DA specific markers
-			$item['dc_min'] 	= (string) $i->children(self::$bloc)->dcmin;
-			$item['details'] 	= (string) $i->children(self::$bloc)->details;
-			$item['section'] 	= (string) $i->children(self::$bloc)->section;
-			$item['support'] 	= (string) $i->children(self::$bloc)->support;
-			$item['sshot']		= (string) $i->children(self::$bloc)->sshot;
-			
-			$tags = array();
-			foreach($i->children(self::$bloc)->tags as $t)
-			{
-				$tags[] = (string) $t->tag;
-			}
-			$item['tags']		= implode(', ',$tags);
-			
-			# First filter right now
-			if (defined('DC_DEV') && DC_DEV === true || version_compare(DC_VERSION,$item['dc_min'],'>=')) {
-				$this->items[$item['id']] = $item;
-			}
-		}
-	}
-
-	public function getModules()
-	{
-		return $this->items;
-	}
-}
Index: nc/core/class.dc.repository.php
===================================================================
--- inc/core/class.dc.repository.php	(revision 2156)
+++ 	(revision )
@@ -1,156 +1,0 @@
-<?php
-
-class dcRepository
-{
-	public $core;
-	public $modules;
-
-	protected $xml_url;
-	protected $data;
-
-	public function __construct(dcModules $modules, $xml_url)
-	{
-		$this->core = $modules->core;
-		$this->modules = $modules;
-		$this->xml_url = $xml_url;
-	}
-
-	public function check($force=false)
-	{
-		if (!$this->xml_url) {
-			return false;
-		}
-		if (($parser = dcRepositoryReader::quickParse($this->xml_url, DC_TPL_CACHE, $force)) === false) {
-			return false;
-		}
-
-		$raw_datas = $parser->getModules();
-
-		uasort($raw_datas, array('self','sort'));
-
-		$skipped = array_keys($this->modules->getDisabledModules());
-		foreach ($skipped as $p_id) {
-			if (isset($raw_datas[$p_id])) {
-				unset($raw_datas[$p_id]);
-			}
-		}
-
-		$updates = array();
-		$current = $this->modules->getModules();
-		foreach ($current as $p_id => $p_infos) {
-			if (isset($raw_datas[$p_id])) {
-				if (self::compare($raw_datas[$p_id]['version'],$p_infos['version'],'>')) {
-					$updates[$p_id] = $raw_datas[$p_id];
-					$updates[$p_id]['root'] = $p_infos['root'];
-					$updates[$p_id]['root_writable'] = $p_infos['root_writable'];
-					$updates[$p_id]['current_version'] = $p_infos['version'];
-				}
-				unset($raw_datas[$p_id]);
-			}
-		}
-
-		$this->data = array(
-			'new'	=> $raw_datas,
-			'update'	=> $updates
-		);
-
-		return true;
-	}
-
-	public function get($update=false)
-	{
-		return $this->data[$update ? 'update' : 'new'];
-	}
-
-	public function search($pattern)
-	{
-		$result = array();
-
-		# Split query into small clean words
-		$patterns = explode(' ', $pattern);
-		array_walk($patterns, array('dcRepository','sanitize'));
-
-		# For each modules
-		foreach ($this->data['new'] as $id => $module) {
-
-			# Split modules infos into small clean word
-			$subjects = explode(' ', $id.' '.$module['name'].' '.$module['desc']);
-			array_walk($subjects, array('dcRepository','sanitize'));
-
-			# Check contents
-			if (!($nb = preg_match_all('/('.implode('|', $patterns).')/', implode(' ', $subjects), $_))) {
-				continue;
-			}
-
-			# Add module to result
-			if (!isset($sorter[$id])) {
-				$sorter[$id] = 0;
-				$result[$id] = $module;
-			}
-
-			# Increment matches count
-			$sorter[$id] += $nb;
-			$result[$id]['accuracy'] = $sorter[$id];
-		}
-		# Sort response by matches count
-		if (!empty($result)) {
-			array_multisort($sorter, SORT_DESC, $result);
-		}
-		return $result;
-	}
-
-	public function process($url, $dest)
-	{
-		$this->download($url, $dest);
-		return $this->install($dest);
-	}
-
-	public function download($url, $dest)
-	{
-		try {
-			$client = netHttp::initClient($url, $path);
-			$client->setUserAgent(self::agent());
-			$client->useGzip(false);
-			$client->setPersistReferers(false);
-			$client->setOutput($dest);
-			$client->get($path);
-			unset($client);
-		}
-		catch (Exception $e) {
-			unset($client);
-			throw new Exception(__('An error occurred while downloading the file.'));
-		}
-	}
-
-	public function install($path)
-	{
-		return dcModules::installPackage($path, $this->modules);
-	}
-
-	public static function agent()
-	{
-		return sprintf('Dotclear/%s)', DC_VERSION);
-	}
-
-	public static function sanitize(&$str, $_)
-	{
-		$str = strtolower(preg_replace('/[^A-Za-z0-9]/', '', $str));
-	}
-
-	private static function compare($v1,$v2,$op)
-	{
-		$v1 = preg_replace('!-r(\d+)$!','-p$1',$v1);
-		$v2 = preg_replace('!-r(\d+)$!','-p$1',$v2);
-		return version_compare($v1,$v2,$op);
-	}
-
-	private static function sort($a,$b)
-	{
-		$c = strtolower($a['id']); 
-		$d = strtolower($b['id']); 
-		if ($c == $d) { 
-			return 0; 
-		} 
-		return ($c < $d) ? -1 : 1; 
-	}
-}
Index: nc/core/class.dc.repository.reader.php
===================================================================
--- inc/core/class.dc.repository.reader.php	(revision 2146)
+++ 	(revision )
@@ -1,209 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_RC_PATH')) { return; }
-
-/**
-@ingroup DC_CORE
-@brief Repository modules feed reader
-
-Provides an object to parse feed of modules from repository.
-*/
-class dcRepositoryReader extends netHttp
-{
-	protected $user_agent 		= 'DotClear.org RepoBrowser/0.1';
-	protected $timeout 			= 5;
-	protected $validators 		= null;				///< <b>array</b>	HTTP Cache validators
-	protected $cache_dir 		= null;				///< <b>string</b>	Cache temporary directory
-	protected $cache_file_prefix 	= 'dcrepo';			///< <b>string</b>	Cache file prefix
-	protected $cache_ttl 		= '-30 minutes';		///< <b>string</b>	Cache TTL
-	protected $cache_touch_on_fail = true;
-	protected $force			= false;
-
-	public function __construct()
-	{
-		parent::__construct('');
-		$this->setUserAgent(sprintf('Dotclear/%s)', DC_VERSION));
-	}
-
-	public function parse($url)
-	{
-		$this->validators = array();
-		if ($this->cache_dir)
-		{
-			return $this->withCache($url);
-		}
-		else
-		{
-			if (!$this->getModulesXML($url)) {
-				return false;
-			}
-
-			if ($this->getStatus() != '200') {
-				return false;
-			}
-
-			return new dcRepositoryParser($this->getContent());
-		}
-	}
-
-	public static function quickParse($url, $cache_dir=null, $force=false)
-	{
-		$parser = new self();
-		if ($cache_dir) {
-			$parser->setCacheDir($cache_dir);
-		}
-		if ($force) {
-			$parser->setForce($force);
-		}
-
-		return $parser->parse($url);
-	}
-
-	public function setCacheDir($dir)
-	{
-		$this->cache_dir = null;
-
-		if (!empty($dir) && is_dir($dir) && is_writeable($dir))
-		{
-			$this->cache_dir = $dir;
-			return true;
-		}
-
-		return false;
-	}
-
-	public function setCacheTTL($str)
-	{
-		$str = trim($str);
-		if (!empty($str))
-		{
-			if (substr($str, 0, 1) != '-') {
-				$str = '-'.$str;
-			}
-			$this->cache_ttl = $str;
-		}
-	}
-
-	public function setForce($force)
-	{
-		$this->force = $force;
-	}
-
-	protected function getModulesXML($url)
-	{
-		if (!self::readURL($url, $ssl, $host, $port, $path, $user, $pass)) {
-			return false;
-		}
-		$this->setHost($host, $port);
-		$this->useSSL($ssl);
-		$this->setAuthorization($user, $pass);
-
-		return $this->get($path);
-	}
-
-	protected function withCache($url)
-	{
-		$url_md5 = md5($url);
-		$cached_file = sprintf('%s/%s/%s/%s/%s.ser',
-			$this->cache_dir,
-			$this->cache_file_prefix,
-			substr($url_md5,0,2),
-			substr($url_md5,2,2),
-			$url_md5
-		);
-
-		$may_use_cached = false;
-
-		if (@file_exists($cached_file) && !$this->force)
-		{
-			$may_use_cached = true;
-			$ts = @filemtime($cached_file);
-			if ($ts > strtotime($this->cache_ttl))
-			{
-				# Direct cache
-				return unserialize(file_get_contents($cached_file));
-			}
-			$this->setValidator('IfModifiedSince', $ts);
-		}
-
-		if (!$this->getModulesXML($url))
-		{
-			if ($may_use_cached)
-			{
-				if ($this->cache_touch_on_fail) {
-					@files::touch($cached_file);
-				}
-				# connection failed - fetched from cache
-				return unserialize(file_get_contents($cached_file));
-			}
-			return false;
-		}
-
-		switch ($this->getStatus())
-		{
-			case '304':
-				@files::touch($cached_file);
-				return unserialize(file_get_contents($cached_file));
-			case '200':
-				if ($modules = new dcRepositoryParser($this->getContent()))
-				{
-					try {
-						files::makeDir(dirname($cached_file), true);
-					} catch (Exception $e) {
-						return $modules;
-					}
-
-					if (($fp = @fopen($cached_file, 'wb')))
-					{
-						fwrite($fp, serialize($modules));
-						fclose($fp);
-						files::inheritChmod($cached_file);
-					}
-					return $modules;
-				}
-		}
-
-		return false;
-	}
-
-	protected function buildRequest()
-	{
-		$headers = parent::buildRequest();
-
-		# Cache validators
-		if (!empty($this->validators))
-		{
-			if (isset($this->validators['IfModifiedSince'])) {
-				$headers[] = 'If-Modified-Since: '.$this->validators['IfModifiedSince'];
-			}
-			if (isset($this->validators['IfNoneMatch'])) {
-				if (is_array($this->validators['IfNoneMatch'])) {
-					$etags = implode(',', $this->validators['IfNoneMatch']);
-				} else {
-					$etags = $this->validators['IfNoneMatch'];
-				}
-				$headers[] = '';
-			}
-		}
-
-		return $headers;
-	}
-
-	private function setValidator($key, $value)
-	{
-		if ($key == 'IfModifiedSince') {
-			$value = gmdate('D, d M Y H:i:s', $value).' GMT';
-		}
-
-		$this->validators[$key] = $value;
-	}
-}
Index: inc/prepend.php
===================================================================
--- inc/prepend.php	(revision 2147)
+++ inc/prepend.php	(revision 1999)
@@ -46,7 +46,4 @@
 $__autoload['dcWorkspace']			= dirname(__FILE__).'/core/class.dc.workspace.php';
 $__autoload['dcPrefs']				= dirname(__FILE__).'/core/class.dc.prefs.php';
-$__autoload['dcRepository']			= dirname(__FILE__).'/core/class.dc.repository.php';
-$__autoload['dcRepositoryReader']		= dirname(__FILE__).'/core/class.dc.repository.reader.php';
-$__autoload['dcRepositoryParser']		= dirname(__FILE__).'/core/class.dc.repository.parser.php';
 
 $__autoload['rsExtPost']				= dirname(__FILE__).'/core/class.dc.rs.extensions.php';
@@ -64,6 +61,4 @@
 $__autoload['dcPager']		= dirname(__FILE__).'/admin/lib.pager.php';
 $__autoload['dcAdminCombos']			= dirname(__FILE__).'/admin/lib.admincombos.php';
-$__autoload['adminModulesList']			= dirname(__FILE__).'/admin/lib.moduleslist.php';
-$__autoload['adminThemesList']			= dirname(__FILE__).'/admin/lib.moduleslist.php';
 
 $__autoload['dcTemplate']			= dirname(__FILE__).'/public/class.dc.template.php';
Index: plugins/aboutConfig/index.php
===================================================================
--- plugins/aboutConfig/index.php	(revision 2003)
+++ plugins/aboutConfig/index.php	(revision 2166)
@@ -119,5 +119,5 @@
 		__('System') => '',
 		html::escapeHTML($core->blog->name) => '',
-		'<span class="page-title">'.__('about:config').'</span>' => ''
+		__('about:config') => ''
 	));
 if (!empty($_GET['upd'])) {
Index: plugins/antispam/index.php
===================================================================
--- plugins/antispam/index.php	(revision 2122)
+++ plugins/antispam/index.php	(revision 2166)
@@ -127,5 +127,5 @@
 			__('Plugins') => '',
 			$page_name => $p_url,
-			'<span class="page-title">'.sprintf(__('%s filter configuration'),$filter->name).'</span>' => ''
+			sprintf(__('%s filter configuration'),$filter->name) => ''
 		));
 
@@ -139,5 +139,5 @@
 		array(
 			__('Plugins') => '',
-			'<span class="page-title">'.$page_name.'</span>' => ''
+			$page_name => ''
 		));
 
Index: plugins/blogroll/edit.php
===================================================================
--- plugins/blogroll/edit.php	(revision 2002)
+++ plugins/blogroll/edit.php	(revision 2166)
@@ -99,5 +99,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Blogroll').'</span>' => $p_url
+			__('Blogroll') => $p_url
 		));
 ?>
Index: plugins/blogroll/index.php
===================================================================
--- plugins/blogroll/index.php	(revision 2115)
+++ plugins/blogroll/index.php	(revision 2166)
@@ -181,5 +181,5 @@
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.__('Blogroll').'</span>' => ''
+			__('Blogroll') => ''
 		));
 ?>
Index: plugins/blowupConfig/index.php
===================================================================
--- plugins/blowupConfig/index.php	(revision 1588)
+++ plugins/blowupConfig/index.php	(revision 2166)
@@ -231,5 +231,5 @@
 		html::escapeHTML($core->blog->name) => '',
 		__('Blog appearance') => 'blog_theme.php',
-		'<span class="page-title">'.__('Blowup configuration').'</span>' => ''
+		__('Blowup configuration') => ''
 	));
 
Index: plugins/daInstaller/index.php
===================================================================
--- plugins/daInstaller/index.php	(revision 1912)
+++ plugins/daInstaller/index.php	(revision 2166)
@@ -259,5 +259,5 @@
 	array(
 		__('System') => '',
-		'<span class="page-title">'.__('DotAddict.org Installer').'</span>' => ''
+		__('DotAddict.org Installer') => ''
 	)).
 
Index: plugins/importExport/index.php
===================================================================
--- plugins/importExport/index.php	(revision 2095)
+++ plugins/importExport/index.php	(revision 2166)
@@ -78,5 +78,5 @@
 			__('Plugins') => '',
 			$title => $p_url,
-			'<span class="page-title">'.html::escapeHTML($module->name).'</span>' => ''
+			html::escapeHTML($module->name) => ''
 		));
 
@@ -92,5 +92,5 @@
 		array(
 			__('Plugins') => '',
-			'<span class="page-title">'.$title.'</span>' => ''
+			$title => ''
 		));
 
Index: plugins/maintenance/_admin.php
===================================================================
--- plugins/maintenance/_admin.php	(revision 2163)
+++ plugins/maintenance/_admin.php	(revision 2116)
@@ -29,5 +29,4 @@
 $core->addBehavior('adminAfterDashboardOptionsUpdate',	array('dcMaintenanceAdmin',	'adminAfterDashboardOptionsUpdate'));
 $core->addBehavior('adminPageHelpBlock',	array('dcMaintenanceAdmin',	'adminPageHelpBlock'));
-$core->addBehavior('pluginsToolsHeaders',	array('dcMaintenanceAdmin',	'pluginsToolsHeaders'));
 
 /**
@@ -223,4 +222,5 @@
 		$core->auth->user_prefs->maintenance->put('dashboard_item', !empty($_POST['maintenance_dashboard_item']), 'boolean');
 	}
+
 
 	/**
@@ -293,17 +293,3 @@
 		}
 	}
-
-	/**
-	 * Add javascript for plugin configuration.
-	 *
-	 * @param	$core	<b>dcCore</b>	dcCore instance
-	 * @param	$module	<b>mixed</b>	Module ID or false if none
-	 * @return	<b>string</b>	Header code for js inclusion
-	 */
-	public static function pluginsToolsHeaders($core, $module)
-	{
-		if ($module == 'maintenance') {
-			return dcPage::jsLoad('index.php?pf=maintenance/js/settings.js');
-		}
-	}
 }
Index: lugins/maintenance/_config.php
===================================================================
--- plugins/maintenance/_config.php	(revision 2165)
+++ 	(revision )
@@ -1,99 +1,0 @@
-<?php
-# -- BEGIN LICENSE BLOCK ---------------------------------------
-#
-# This file is part of Dotclear 2.
-#
-# Copyright (c) 2003-2013 Olivier Meunier & Association Dotclear
-# Licensed under the GPL version 2.0 license.
-# See LICENSE file or
-# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
-#
-# -- END LICENSE BLOCK -----------------------------------------
-if (!defined('DC_CONTEXT_PLUGIN')) { return; }
-
-$core->blog->settings->addNamespace('maintenance');
-$maintenance = new dcMaintenance($core);
-$tasks = $maintenance->getTasks();
-
-$combo_ts = array(
-	__('Never') 			=> 0,
-	__('Every week') 		=> 604800,
-	__('Every two weeks') 	=> 1209600,
-	__('Every month') 		=> 2592000,
-	__('Every two months') 	=> 5184000
-);
-
-if (!empty($_POST['save'])) {
-
-	try {
-		$core->blog->settings->maintenance->put(
-			'plugin_message', 
-			!empty($_POST['settings_plugin_message']), 
-			'boolean', 
-			'Display alert message of late tasks on plugin page', 
-			true, 
-			true
-		);
-
-		foreach($tasks as $t) {
-			if (!empty($_POST['settings_recall_type']) && $_POST['settings_recall_type'] == 'all') {
-				$ts = $_POST['settings_recall_time'];
-			}
-			else {
-				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
-			}
-			$core->blog->settings->maintenance->put(
-				'ts_'.$t->id(), 
-				abs((integer) $ts), 
-				'integer', 
-				sprintf('Recall time for task %s', $t->id()), 
-				true, 
-				$t->blog()
-			);
-		}
-		
-		http::redirect($list->getPageURL('module=maintenance&conf=1&done=1'));
-	}
-	catch(Exception $e) {
-		$core->error->add($e->getMessage());
-	}
-}
-
-	echo 
-	'<p>'.__('Manage alert for maintenance task.').'</p>'.
-
-	'<h4 class="pretty-title">'.__('Activation').'</h4>'.
-	'<p><label for="settings_plugin_message" class="classic">'.
-	form::checkbox('settings_plugin_message', 1, $core->blog->settings->maintenance->plugin_message).
-	__('Display alert messages on late tasks').'</label></p>'.
-
-	'<p class="info">'.sprintf(
-		__('You can place list of late tasks on your %s.'),
-		'<a href="preferences.php#user-favorites">'.__('Dashboard').'</a>'
-	).'</p>'.
-
-	'<h4 class="pretty-title vertical-separator">'.__('Frequency').'</h4>'.
-
-	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '.
-	'<label class="classic" for="settings_recall_all">'.
-	'<strong>'.__('Use one recall time for all tasks').'</strong></label>'.
-
-	'<p class="field wide vertical-separator"><label for="settings_recall_time">'.__('Recall time for all tasks:').'</label>'.
-	form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all').
-	'</p>'.
-
-	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '.
-	'<label class="classic" for="settings_recall_separate">'.
-	'<strong>'.__('Use one recall time per task').'</strong></label>';
-
-	foreach($tasks as $t)
-	{
-		echo
-		'<div class="two-boxes">'.
-
-		'<p class="field wide"><label for="settings_ts_'.$t->id().'">'.$t->task().'</label>'.
-		form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task').
-		'</p>'.
-
-		'</div>';
-	}
Index: plugins/maintenance/index.php
===================================================================
--- plugins/maintenance/index.php	(revision 2163)
+++ plugins/maintenance/index.php	(revision 2166)
@@ -28,4 +28,42 @@
 $tab = empty($_REQUEST['tab']) ? '' : $_REQUEST['tab'];
 
+// Save settings
+
+if (!empty($_POST['settings'])) {
+
+	try {
+		$core->blog->settings->maintenance->put(
+			'plugin_message', 
+			!empty($_POST['settings_plugin_message']), 
+			'boolean', 
+			'Display alert message of late tasks on plugin page', 
+			true, 
+			true
+		);
+
+		foreach($tasks as $t) {
+			if (!empty($_POST['settings_recall_type']) && $_POST['settings_recall_type'] == 'all') {
+				$ts = $_POST['settings_recall_time'];
+			}
+			else {
+				$ts = empty($_POST['settings_ts_'.$t->id()]) ? 0 : $_POST['settings_ts_'.$t->id()];
+			}
+			$core->blog->settings->maintenance->put(
+				'ts_'.$t->id(), 
+				abs((integer) $ts), 
+				'integer', 
+				sprintf('Recall time for task %s', $t->id()), 
+				true, 
+				$t->blog()
+			);
+		}
+		
+		http::redirect($p_url.'&done=1&tab='.$tab.'#'.$tab);
+	}
+	catch(Exception $e) {
+		$core->error->add($e->getMessage());
+	}
+}
+
 // Get task object
 
@@ -95,5 +133,5 @@
 		array(
 			__('Plugins') => '',
-			'<span class="page-title">'.__('Maintenance').'</span>' => ''
+			__('Maintenance') => ''
 		)
 	).
@@ -121,5 +159,5 @@
 			__('Plugins') => '',
 			'<a href="'.$p_url.'">'.__('Maintenance').'</a>' => '',
-			'<span class="page-title">'.html::escapeHTML($task->name()).'</span>' => ''
+			html::escapeHTML($task->name())=> ''
 		)
 	);
@@ -155,5 +193,5 @@
 		array(
 			__('Plugins') => '',
-			'<span class="page-title">'.__('Maintenance').'</span>' => ''
+			__('Maintenance') => ''
 		)
 	);
@@ -249,4 +287,55 @@
 		'</div>';
 	}
+
+	// Settings
+
+	echo 
+	'<div id="settings" class="multi-part" title="'.__('Alert settings').'">'.
+	'<h3>'.__('Alert settings').'</h3>'.
+	'<form action="'.$p_url.'" method="post">'.
+
+	'<h4 class="pretty-title">'.__('Activation').'</h4>'.
+	'<p><label for="settings_plugin_message" class="classic">'.
+	form::checkbox('settings_plugin_message', 1, $core->blog->settings->maintenance->plugin_message).
+	__('Display alert messages on late tasks').'</label></p>'.
+
+	'<p class="info">'.sprintf(
+		__('You can place list of late tasks on your %s.'),
+		'<a href="preferences.php#user-favorites">'.__('Dashboard').'</a>'
+	).'</p>'.
+
+	'<h4 class="pretty-title vertical-separator">'.__('Frequency').'</h4>'.
+
+	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_all'), 'all').' '.
+	'<label class="classic" for="settings_recall_all">'.
+	'<strong>'.__('Use one recall time for all tasks').'</strong></label>'.
+
+	'<p class="field wide vertical-separator"><label for="settings_recall_time">'.__('Recall time for all tasks:').'</label>'.
+	form::combo('settings_recall_time', $combo_ts, 'seperate', 'recall-for-all').
+	'</p>'.
+
+	'<p class="vertical-separator">'.form::radio(array('settings_recall_type', 'settings_recall_separate'), 'separate', 1).' '.
+	'<label class="classic" for="settings_recall_separate">'.
+	'<strong>'.__('Use one recall time per task').'</strong></label>';
+
+	foreach($tasks as $t)
+	{
+		echo
+		'<div class="two-boxes">'.
+
+		'<p class="field wide"><label for="settings_ts_'.$t->id().'">'.$t->task().'</label>'.
+		form::combo('settings_ts_'.$t->id(), $combo_ts, $t->ts(), 'recall-per-task').
+		'</p>'.
+
+		'</div>';
+	}
+
+	echo 
+	'<p class="field wide"><input type="submit" value="'.__('Save this settings').'" /> '.
+	form::hidden(array('tab'), 'settings').
+	form::hidden(array('settings'), 1).
+	$core->formNonce().'</p>'.
+	'</form>'.
+	'</div>';
 }
 
Index: plugins/pages/class.actionpage.php
===================================================================
--- plugins/pages/class.actionpage.php	(revision 2061)
+++ plugins/pages/class.actionpage.php	(revision 2166)
@@ -26,5 +26,5 @@
 				html::escapeHTML($this->core->blog->name) => '',
 				__('Pages') => $this->getRedirection(array(),true),
-				'<span class="page-title">'.__('Pages actions').'</span>' => ''
+				__('Pages actions') => ''
 			))
 		);
Index: plugins/pages/list.php
===================================================================
--- plugins/pages/list.php	(revision 2056)
+++ plugins/pages/list.php	(revision 2166)
@@ -75,5 +75,5 @@
 	array(
 		html::escapeHTML($core->blog->name) => '',
-		'<span class="page-title">'.__('Pages').'</span>' => ''
+		__('Pages') => ''
 	));
 
Index: plugins/pages/page.php
===================================================================
--- plugins/pages/page.php	(revision 1981)
+++ plugins/pages/page.php	(revision 2166)
@@ -329,5 +329,5 @@
 		html::escapeHTML($core->blog->name) => '',
 		__('Pages') => $p_url,
-		'<span class="page-title">'.$edit_entry_title.'</span>' => ''
+		$edit_entry_title => ''
 	));
 
Index: plugins/pings/index.php
===================================================================
--- plugins/pings/index.php	(revision 1930)
+++ plugins/pings/index.php	(revision 2166)
@@ -55,5 +55,5 @@
 	array(
 		__('Plugins') => '',
-		'<span class="page-title">'.__('Pings configuration').'</span>' => ''
+		__('Pings configuration') => ''
 	));
 
Index: plugins/simpleMenu/index.php
===================================================================
--- plugins/simpleMenu/index.php	(revision 2154)
+++ plugins/simpleMenu/index.php	(revision 2166)
@@ -374,12 +374,15 @@
 			html::escapeHTML($core->blog->name) => '',
 			$page_title => $p_url,
-			'<span class="page-title">'.__('Add item').'</span>' => '',
+			__('Add item') => '',
 			$step_label => ''
-		));
+		),
+		array(
+			'highlight_pos' => -2)
+	);
 } else {
 	echo dcPage::breadcrumb(
 		array(
 			html::escapeHTML($core->blog->name) => '',
-			'<span class="page-title">'.$page_title.'</span>' => ''
+			$page_title => ''
 		));
 }
Index: plugins/tags/_admin.php
===================================================================
--- plugins/tags/_admin.php	(revision 2065)
+++ plugins/tags/_admin.php	(revision 2166)
@@ -151,5 +151,5 @@
 						html::escapeHTML($core->blog->name) => '',
 						__('Entries') => $ap->getRedirection(array(),true),
-						'<span class="page-title">'.__('Add tags to this selection').'</span>' => ''
+						__('Add tags to this selection') => ''
 				)),
 				dcPage::jsLoad('js/jquery/jquery.autocomplete.js').
@@ -228,5 +228,5 @@
 							html::escapeHTML($core->blog->name) => '',
 							__('Entries') => 'posts.php',
-							'<span class="page-title">'.__('Remove selected tags from this selection').'</span>' => ''
+							__('Remove selected tags from this selection') => ''
 			)));
 			$posts_count = count($_POST['entries']);
Index: plugins/tags/tag_posts.php
===================================================================
--- plugins/tags/tag_posts.php	(revision 2079)
+++ plugins/tags/tag_posts.php	(revision 2166)
@@ -91,5 +91,5 @@
 		html::escapeHTML($core->blog->name) => '',
 		__('Tags') => $p_url.'&amp;m=tags',
-		'<span class="page-title">'.__('Tag').' &ldquo;'.html::escapeHTML($tag).'&rdquo;'.'</span>' => ''
+		__('Tag').' &ldquo;'.html::escapeHTML($tag).'&rdquo;' => ''
 	));
 ?>
Index: plugins/tags/tags.php
===================================================================
--- plugins/tags/tags.php	(revision 2003)
+++ plugins/tags/tags.php	(revision 2166)
@@ -24,5 +24,5 @@
 	array(
 		html::escapeHTML($core->blog->name) => '',
-		'<span class="page-title">'.__('Tags').'</span>' => ''
+		__('Tags') => ''
 	));
 ?>
Index: plugins/themeEditor/index.php
===================================================================
--- plugins/themeEditor/index.php	(revision 1382)
+++ plugins/themeEditor/index.php	(revision 2166)
@@ -91,5 +91,5 @@
 		html::escapeHTML($core->blog->name) => '',
 		__('Blog appearance') => 'blog_theme.php',
-		'<span class="page-title">'.__('Edit theme files').'</span>' => ''
+		__('Edit theme files') => ''
 	));
 ?>
Index: plugins/userPref/index.php
===================================================================
--- plugins/userPref/index.php	(revision 2003)
+++ plugins/userPref/index.php	(revision 2166)
@@ -115,5 +115,5 @@
 		__('System') => '',
 		html::escapeHTML($core->auth->userID()) => '',
-		'<span class="page-title">'.__('user:preferences').'</span>' => ''
+		__('user:preferences') => ''
 	));
 
Index: plugins/widgets/index.php
===================================================================
--- plugins/widgets/index.php	(revision 1993)
+++ plugins/widgets/index.php	(revision 2166)
@@ -190,5 +190,5 @@
 	array(
 		html::escapeHTML($core->blog->name) => '',
-		'<span class="page-title">'.__('Widgets').'</span>' => ''
+		__('Widgets') => ''
 	));
 
