Index: inc/admin/lib.moduleslist.php
===================================================================
--- inc/admin/lib.moduleslist.php	(revision 2149)
+++ 	(revision )
@@ -1,644 +1,0 @@
-<?php
-
-class adminModulesList
-{
-	public $core;
-	public $modules;
-
-	public static  $allow_multi_install;
-
-	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;
-	}
-
-	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()
-	{
-		if (empty($this->modules)) {
-			return $this;
-		}
-
-		$query = $this->getSearchQuery();
-
-		echo 
-		'<div class="box">'.
-		'<form action="'.$this->getPageURL().'" method="get">'.
-		'<p><label for="m_search" class="classic">'.__('Search:').'&nbsp;</label><br />'.
-		form::field(array('m_search'), 30, 255, html::escapeHTML($query)).
-		'<input type="submit" value="'.__('Search').'" /> '.
-		'</p>';
-
-		if ($query) {
-			echo 
-			'<p class="info">'.sprintf(
-				__('Found %d result for search "%s".', 'Found %d results for search "%s".', count($this->modules)), 
-				count($this->modules), html::escapeHTML($query)
-			).' <a href="'.$this->getPageURL().'">'.__('Reset search').'</a>'.
-			'</p>';
-		}
-
-		echo 
-		'</form>'.
-		'</div>';
-
-		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">'.__('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] = $this->setModuleInfo($id, $module);
-		}
-
-		return $this;
-	}
-
-	public function getModules()
-	{
-		return $this->modules;
-	}
-
-	protected 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
-			),
-			# 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 class="modules"><caption class="hidden">'.html::escapeHTML(__('Modules list')).'</caption><tr>';
-/*
-		if ($this->getSearchQuery() !== null) {
-			echo 
-			'<th class="nowrap">'.__('Accuracy').'</th>';
-		}
-//*/
-		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="'.$this->getPageTab().'_p_'.html::escapeHTML($id).'">';
-
-			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/favicon.png'
-				).'</td>';
-			}
-/*
-			if ($this->getSearchQuery() !== null) {
-				echo 
-				'<td class="nowrap count">'.$module['accuracy'].'</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->displayInlineActions($id, $module, $actions);
-
-				echo
-				'</td>';
-			}
-
-			echo 
-			'</tr>';
-
-			$count++;
-		}
-		echo 
-		'</table></div>';
-
-		if(!$count) {
-			echo 
-			'<p>'.__('There is no module.').'</p>';
-		}
-	}
-
-	protected function displayInlineActions($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: inc/admin/lib.pager.php
===================================================================
--- inc/admin/lib.pager.php	(revision 2071)
+++ inc/admin/lib.pager.php	(revision 2152)
@@ -151,9 +151,13 @@
 class adminPostList extends adminGenericList
 {
-	public function display($page,$nb_per_page,$enclose_block='')
+	public function display($page,$nb_per_page,$enclose_block='',$filter=false)
 	{
 		if ($this->rs->isEmpty())
 		{
-			echo '<p><strong>'.__('No entry').'</strong></p>';
+			if( $filter ) {
+				echo '<p><strong>'.__('No entry matches the filter').'</strong></p>';
+			} else {
+				echo '<p><strong>'.__('No entry').'</strong></p>';
+			}
 		}
 		else
@@ -168,11 +172,19 @@
 			$html_block =
 			'<div class="table-outer">'.
-			'<table><caption class="hidden">'.__('Entries list').'</caption><tr>'.
+			'<table>';
+			
+			if( $filter ) {
+				$html_block .= '<caption>'.sprintf(__('List of %s entries match the filter.'), $this->rs_count).'</caption>';
+			} else {
+				$html_block .= '<caption class="hidden">'.__('Entries list').'</caption>';
+			}
+					
+			$html_block .= '<tr>'.
 			'<th colspan="2" class="first">'.__('Title').'</th>'.
 			'<th scope="col">'.__('Date').'</th>'.
 			'<th scope="col">'.__('Category').'</th>'.
 			'<th scope="col">'.__('Author').'</th>'.
-			'<th scope="col">'.__('Comments').'</th>'.
-			'<th scope="col">'.__('Trackbacks').'</th>'.
+			'<th scope="col"><img src="images/comments.png" alt="" title="'.__('Comments').'" /><span class="hidden">'.__('Comments').'</span></th>'.
+			'<th scope="col"><img src="images/trackbacks.png" alt="" title="'.__('Trackbacks').'" /><span class="hidden">'.__('Trackbacks').'</span></th>'.
 			'<th scope="col">'.__('Status').'</th>'.
 			'</tr>%s</table></div>';
@@ -362,9 +374,13 @@
 class adminCommentList extends adminGenericList
 {
-	public function display($page,$nb_per_page,$enclose_block='')
+	public function display($page,$nb_per_page,$enclose_block='',$filter=false)
 	{
 		if ($this->rs->isEmpty())
 		{
-			echo '<p><strong>'.__('No comment').'</strong></p>';
+			if( $filter ) {
+				echo '<p><strong>'.__('No comments or trackbacks matches the filter').'</strong></p>';
+			} else {
+				echo '<p><strong>'.__('No comment').'</strong></p>';
+			}
 		}
 		else
@@ -380,10 +396,18 @@
 			$html_block =
 			'<div class="table-outer">'.
-			'<table><caption class="hidden">'.__('Comments and trackbacks list').'</caption><tr>'.
+			'<table>';
+			
+			if( $filter ) {
+				$html_block .= '<caption>'.sprintf(__('List of %s Comments or trackbacks match the filter.'), $this->rs_count).'</caption>';
+			} else {
+				$html_block .= '<caption class="hidden">'.__('Comments and trackbacks list').'</caption>';
+			}
+					
+			$html_block .= '<tr>'.
 			'<th colspan="2" scope="col" abbr="comm" class="first">'.__('Type').'</th>'.
 			'<th scope="col">'.__('Author').'</th>'.
 			'<th scope="col">'.__('Date').'</th>'.
 			'<th scope="col" class="txt-center">'.__('Status').'</th>'.
-			'<th scope="col" abbr="entry">'.__('Entry title').'</th>'.
+			'<th scope="col" abbr="entry">'.__('Entry').'</th>'.
 			'</tr>%s</table></div>';
 
@@ -445,6 +469,6 @@
 		
 		$post_title = html::escapeHTML($this->rs->post_title);
-		if (mb_strlen($post_title) > 60) {
-			$post_title = mb_strcut($post_title,0,57).'...';
+		if (mb_strlen($post_title) > 70) {
+			$post_title = mb_strcut($post_title,0,67).'...';
 		}
 		$comment_title = sprintf(__('Edit the %1$s from %2$s'),
@@ -465,5 +489,5 @@
 		'<td class="nowrap count">'.dt::dt2str(__('%Y-%m-%d %H:%M'),$this->rs->comment_dt).'</td>'.
 		'<td class="nowrap status txt-center">'.$img_status.'</td>'.
-		'<td class="nowrap"><a href="'.$post_url.'">'.
+		'<td class="nowrap discrete"><a href="'.$post_url.'">'.
 		html::escapeHTML($post_title).'</a>'.
 		($this->rs->post_type != 'post' ? ' ('.html::escapeHTML($this->rs->post_type).')' : '').'</td>';
@@ -477,9 +501,13 @@
 class adminUserList extends adminGenericList
 {
-	public function display($page,$nb_per_page,$enclose_block='')
+	public function display($page,$nb_per_page,$enclose_block='',$filter=false)
 	{
 		if ($this->rs->isEmpty())
 		{
-			echo '<p><strong>'.__('No user').'</strong></p>';
+			if( $filter ) {
+				echo '<p><strong>'.__('No user matches the filter').'</strong></p>';
+			} else {
+				echo '<p><strong>'.__('No user').'</strong></p>';
+			}
 		}
 		else
@@ -489,5 +517,13 @@
 			$html_block =
 			'<div class="table-outer clear">'.
-			'<table><caption class="hidden">'.__('Users list').'</caption><tr>'.
+			'<table>';
+			
+			if( $filter ) {
+				$html_block .= '<caption>'.sprintf(__('List of %s users match the filter.'), $this->rs_count).'</caption>';
+			} else {
+				$html_block .= '<caption class="hidden">'.__('Users list').'</caption>';
+			}
+					
+			$html_block .= '<tr>'.
 			'<th colspan="2" scope="col" class="first">'.__('Username').'</th>'.
 			'<th scope="col">'.__('First Name').'</th>'.
Index: inc/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: inc/core/class.dc.repository.php
===================================================================
--- inc/core/class.dc.repository.php	(revision 2149)
+++ 	(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: inc/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/dbschema/upgrade.php
===================================================================
--- inc/dbschema/upgrade.php	(revision 1785)
+++ inc/dbschema/upgrade.php	(revision 2144)
@@ -14,4 +14,5 @@
 function dotclearUpgrade($core)
 {
+    $cleanup_sessions = false; // update it in a step that needed sessions to be removed
 	$version = $core->getVersion('core');
 	
@@ -344,6 +345,8 @@
 			$core->blogDefaults();
 			
-			# Drop content from session table
-			$core->con->execute('DELETE FROM '.$core->prefix.'session ');
+			# Drop content from session table if changes or if needed
+			if ($changes != 0 || $cleanup_sessions) {
+				$core->con->execute('DELETE FROM '.$core->prefix.'session ');
+			}
 			
 			# Empty templates cache directory
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';
