diff --git a/core/Archive.php b/core/Archive.php
index a909a76dfecc080e5c5de191f344d7bae721feb0..f5f658d440030fd2903db64a8dafcfdd5b9c8126 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -21,7 +21,7 @@ require_once 'Archive/Single.php';
  * <pre>
  * 		$archive = Piwik_Archive::build($idSite = 1, $period = 'week', '2008-03-08' );
  * 		$dataTable = $archive->getDataTable('Provider_hostnameExt');
- * 		$dataTable->queuefilter('ReplaceColumnNames');
+ * 		$dataTable->queueFilter('ReplaceColumnNames');
  * 		return $dataTable;
  * </pre>
  * 
diff --git a/core/Common.php b/core/Common.php
index fd18c9571781920982f7b016ad8f0a4fc6fffa23..855e5b287af35acd4de208ee8a14142711c71a20 100644
--- a/core/Common.php
+++ b/core/Common.php
@@ -94,7 +94,7 @@ class Piwik_Common
 			require_once "Zend/Auth.php";
 			require_once "Timer.php";
 			require_once "PluginsManager.php";
-			require_once "Piwik.php";
+			require_once "core/Piwik.php";
 			require_once "Access.php";
 			require_once "Auth.php";
 			require_once "API/Proxy.php";
@@ -497,22 +497,12 @@ class Piwik_Common
 		return md5(uniqid(rand(), true));
 	}
 
-	/**
-	 * Convert dotted IP to a stringified integer representation
-	 *
-	 * @return string ip
-	 */
-	static public function getIp()
-	{
-		return sprintf("%u", ip2long(self::getIpString()));
-	}
-
 	/**
 	 * Returns the best possible IP of the current user, in the format A.B.C.D
 	 *
 	 * @return string ip
 	 */
-	static public function getIpString()
+	static public function getIp()
 	{
 		if(isset($_SERVER['HTTP_CLIENT_IP'])
 		&& ($ip = Piwik_Common::getFirstIpFromList($_SERVER['HTTP_CLIENT_IP']))
@@ -808,9 +798,9 @@ class Piwik_Common
 		}
 		
 		if(function_exists('iconv') 
-			&& isset($GLOBALS['Piwik_SearchEngines'][$refererHost][2]))
+			&& isset($GLOBALS['Piwik_SearchEngines'][$refererHost][3]))
 		{
-			$charset = trim($GLOBALS['Piwik_SearchEngines'][$refererHost][2]);
+			$charset = trim($GLOBALS['Piwik_SearchEngines'][$refererHost][3]);
 			if(!empty($charset)) 
 			{
 				$key = @iconv($charset, 'utf-8//IGNORE', $key);
diff --git a/core/DataFiles/SearchEngines.php b/core/DataFiles/SearchEngines.php
index 814096265edbaf5880443ac52eddca6df35a86c4..a1aafd460f2984be4918027ca5ceb06aee58abc3 100644
--- a/core/DataFiles/SearchEngines.php
+++ b/core/DataFiles/SearchEngines.php
@@ -22,13 +22,14 @@
  * The main search engine URL has to be at the top of the list for the given search Engine.
  * You can add new search engines icons by adding the icon in the plugins/Referers/images/SearchEngines directory 
  * using the format "mainSearchEngineUrl.png". Example: www.google.com.png
+ * To help Piwik link directly the search engine result page for the keyword, specify the third entry in the array 
+ * using the macro {k} that will automatically be replaced by the keyword.
  * 
  *  A simple example is:
- *  "www.google.com"		=> array("Google", "q"),
+ *  "www.google.com"		=> array("Google", "q", "search?q={k}"),
  * 
  *  A more complicated example, with an array of possible variable names, and a custom charset:
- *  "www.baidu.com"			=> array("Baidu", array("wd","word","kw"), "gb2312"),
- * 
+ *  "www.baidu.com"			=> array("Baidu", array("wd","word","kw"), "s?wd={k}", "gb2312"),
  */
 if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 {
@@ -37,8 +38,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		//" "		=> array(" ", " " [, " "]),
 		
 		// 1
-		"1.cz" 						=> array("1.cz", "q", "iso-8859-2"),
-		"www.1.cz" 					=> array("1.cz", "q", "iso-8859-2"),
+		"1.cz" 						=> array("1.cz", "q", "index.php?q={k}", "iso-8859-2"),
+		"www.1.cz" 					=> array("1.cz", "q", false, "iso-8859-2"),
 
 		// 123people
 		"www.123people.com"			=> array("123people", "search_term"),
@@ -74,7 +75,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"acont.de"			=> array("Acont", "query"),
 		
 		//Alexa
-		"www.alexa.com"		        => array("Alexa", "q"),
+		"www.alexa.com"		        => array("Alexa", "q", "search?q={k}"),
 		"alexa.com"		        => array("Alexa", "q"),
 		
 		//Alice Adsl
@@ -118,7 +119,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"apollo7.de"			=> array("Apollo7", "query"),
 		
 		// AOL
-		"search.aol.com"		=> array("AOL", array("query", "q")),
+		"search.aol.com"		=> array("AOL", array("query", "q"), "aol/search?query={k}"),
 		"aolsearch.aol.com"		=> array("AOL", array("query", "q")),
 		"www.aolrecherche.aol.fr"	=> array("AOL", array("query", "q")),
 		"www.aolrecherches.aol.fr" 	=> array("AOL", array("query", "q")),
@@ -148,7 +149,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"arianna.libero.it" 		=> array("Arianna", "query"),
 		
 		// Ask
-		"www.ask.com"			=> array("Ask", array("ask","q")),
+		"www.ask.com"			=> array("Ask", array("ask","q"), "web?q={k}"),
 		"web.ask.com"			=> array("Ask", array("ask","q")),
 		"www.ask.co.uk"			=> array("Ask", "q"),
 		"uk.ask.com"			=> array("Ask", "q"),
@@ -160,7 +161,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"ask.jp"			=> array("Ask", "q"),
 		
 		// Atlas
-		"search.atlas.cz" 		=> array("Atlas", "q", "windows-1250"),
+		"search.atlas.cz" 		=> array("Atlas", "q", "?q={k}", "windows-1250"),
 		
 		// Austronaut
 		"www2.austronaut.at"		=> array("Austronaut", "begriff"),
@@ -169,11 +170,11 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"search.babylon.com"		=> array("Babylon (Powered by Google)","q"),
 	
 		// Baidu
-		"www.baidu.com"			=> array("Baidu", array("wd","word","kw"), "gb2312"),
-		"www1.baidu.com"		=> array("Baidu", array("wd","word","kw"), "gb2312"),
-		"zhidao.baidu.com"		=> array("Baidu", array("wd","word","kw"), "gb2312"),
-		"tieba.baidu.com"		=> array("Baidu", array("wd","word","kw"), "gb2312"),
-		"news.baidu.com"		=> array("Baidu", array("wd","word","kw"), "gb2312"),
+		"www.baidu.com"			=> array("Baidu", array("wd","word","kw"), "s?wd={k}", "gb2312"),
+		"www1.baidu.com"		=> array("Baidu", array("wd","word","kw"), false, "gb2312"),
+		"zhidao.baidu.com"		=> array("Baidu", array("wd","word","kw"), false, "gb2312"),
+		"tieba.baidu.com"		=> array("Baidu", array("wd","word","kw"), false, "gb2312"),
+		"news.baidu.com"		=> array("Baidu", array("wd","word","kw"), false, "gb2312"),
 		"web.gougou.com"		=> array("Baidu", "search"),
 		
 		// BBC
@@ -207,9 +208,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.cegetel.net" 		=> array("Cegetel (Google)", "q"),
 		
 		// Centrum
-		"fulltext.centrum.cz" 		=> array("Centrum", "q", "windows-1250"),
-		"morfeo.centrum.cz" 		=> array("Centrum", "q", "windows-1250"),
-		"search.centrum.cz" 		=> array("Centrum", "q", "windows-1250"),
+		"search.centrum.cz" 		=> array("Centrum", "q", "index.php?q={k}", "windows-1250"),
+		"fulltext.centrum.cz" 		=> array("Centrum", "q", false, "windows-1250"),
+		"morfeo.centrum.cz" 		=> array("Centrum", "q", false, "windows-1250"),
 		
 		// Chello
 		"www.chello.fr"		 	=> array("Chello", "q1"),
@@ -218,7 +219,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"recherche.club-internet.fr"    => array("Club Internet", "q"),
 		
 		// Conduit
-		"search.conduit.com"         => array("Conduit.com (Powered by Google)", "q"),
+		"search.conduit.com"         => array("Conduit.com", "q", "Results.aspx?q={k}"),
 	
 		// Comcast
 		"www.comcast.net" 		=> array("Comcast", "query"),
@@ -238,7 +239,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.crossbot.de"		=> array("Crossbot", "q"),
 		
 		// Cuil
-		"www.cuil.com"			=> array("Cuil", "q"),
+		"www.cuil.com"			=> array("Cuil", "q", "search?q={k}"),
 	
 		// DasOertliche
 		"www.dasoertliche.de"	        => array("DasOertliche", "kw"),
@@ -301,7 +302,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.excite.fr"			=> array("Excite", "search"),
 		
 		// Exalead
-		"www.exalead.fr"		=> array("Exalead", "q"),
+		"www.exalead.fr"		=> array("Exalead", "q", "search/results?q={k}"),
 		"www.exalead.com"		=> array("Exalead", "q"),
 		
 		// eo
@@ -371,7 +372,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"ocnsearch.goo.ne.jp"		=> array("goo", "mt"),
 		
 		// Google
-		"www.google.com"		=> array("Google", "q"),
+		"www.google.com"		=> array("Google", "q", "search?q={k}"),
 		"gogole.fr"				=> array("Google", "q"),
 		"www.gogole.fr"			=> array("Google", "q"),
 		"wwwgoogle.fr"			=> array("Google", "q"),
@@ -555,7 +556,6 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"buscador.terra.es" 	        => array("Google", "query"),
 		"buscador.terra.cl" 	        => array("Google", "query"),
 		"buscador.terra.com.br"		=> array("Google", "query"),
-		"www.icq.com" 			=> array("Google", "q"),
 		"www.adelphia.net" 		=> array("Google", "q"),
 		"so.qq.com" 			=> array("Google", "word"),
 		"misc.skynet.be" 		=> array("Google", "keywords"),
@@ -566,7 +566,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		
 		
 		//Google Blogsearch
-		"blogsearch.google.com"		=> array("Google Blogsearch", "q"),
+		"blogsearch.google.com"		=> array("Google Blogsearch", "q", "blogsearch?q={k}"),
 		"blogsearch.google.de"		=> array("Google Blogsearch", "q"),
 		"blogsearch.google.fr"		=> array("Google Blogsearch", "q"),
 		"blogsearch.google.co.uk"	=> array("Google Blogsearch", "q"),
@@ -589,8 +589,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"directory.google.com"		=> array("Google Directory", " "),
 		
 		// Google Images        
-		"images.google.com"        => array("Google Images", "q"),
+		"images.google.com"        => array("Google Images", "q", "images?q={k}"),
 		"images.google.cz"        => array("Google Images", "q"),
+        "images.google.lt"        => array("Google Images", "q"),
         "images.google.hr"        => array("Google Images", "q"),
         "images.google.hu"        => array("Google Images", "q"),
         "images.google.com.kw"        => array("Google Images", "q"),
@@ -647,8 +648,6 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"images.google.ru"		=> array("Google Images", "q"),
 		"images.google.se"		=> array("Google Images", "q"),
 		"images.google.sk"		=> array("Google Images", "q"),
-		"images.google.com"		=> array("Google Images", "q"),
-	
 		
 		// Google News
 		"news.google.com" 		=> array("Google News", "q"),
@@ -708,7 +707,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"blogs.icerocket.com"		  => array("Icerocket", "qt"),
 		
 		// ICQ
-		"www.icq.com"			=> array("ICQ", "q"),
+		"www.icq.com"			=> array("ICQ", "q", "search/results.php?q={k}"),
 		"search.icq.com"		=> array("ICQ", "q"),
 		
 		// Ilse
@@ -767,17 +766,17 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"recherche.toile.qc.ca"		=> array("La Toile Du Québec", "query"),
 		
 		// Live.com
-		"www.live.com"			=> array("Live", "q"),
+		"search.live.com"		=> array("Live", "q", "results.aspx?q={k}"),
 		"beta.search.live.com"	=> array("Live", "q"),
-		"search.live.com"		=> array("Live", "q"),
+		"www.live.com"			=> array("Live", "q"),
 		"search.msn.com"		=> array("Live", "q"),
-		"beta.search.msn.fr"		=> array("Live", "q"),
+		"beta.search.msn.fr"	=> array("Live", "q"),
 		"search.msn.fr"			=> array("Live", "q"),
 		"search.msn.es"			=> array("Live", "q"),
 		"search.msn.se"			=> array("Live", "q"),
-		"search.latam.msn.com"		=> array("Live", "q"),
+		"search.latam.msn.com"	=> array("Live", "q"),
 		"search.msn.nl" 		=> array("Live", "q"),
-		"leguide.fr.msn.com"		=> array("Live", "s"),
+		"leguide.fr.msn.com"	=> array("Live", "s"),
 		"leguide.msn.fr"		=> array("Live", "s"),
 		"search.msn.co.jp"		=> array("Live", "q"),
 		"search.msn.no"			=> array("Live", "q"),
@@ -857,6 +856,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"home.meinestadt.de"	        => array("Meinestadt.de", "words"),
 		
 		// Mister Wong
+		"www.mister-wong.com" => array('Mister Wong', 'keywords', "search/?keywords={k}"),
 		"www.mister-wong.de" => array('Mister Wong', 'keywords'),
 	
 		// Monstercrawler
@@ -890,8 +890,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"ko.search.need2find.com"	=> array("Needtofind", "searchfor"),
 
 		// Neti
-		"www.neti.ee" 		    => array("Neti", "query", "iso-8859-1"),
-		"www.neti.ee/odp/"      => array("Neti World", "query", "iso-8859-1"),
+		"www.neti.ee" 		    => array("Neti", "query", "cgi-bin/otsing?query={k}", "iso-8859-1"),
 		
 		// Netster
 		"www.netster.com"		=> array("Netster", "keywords"),
@@ -953,10 +952,10 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.qualigo.nl"	        => array("Qualigo", "q"),
 		
 		// Rambler
+		"nova.rambler.ru"           => array("Rambler", "query", "search?query={k}"), 
 		"search.rambler.ru" 		=> array("Rambler", "words"),
 		"www.rambler.ru"            => array("Rambler", "words"),
-		"nova.rambler.ru"           => array("Rambler", "query"), 
-		"nova.rambler.ru" => array('Rambler', 'q'),
+		"nova.rambler.ru" 			=> array("Rambler", "q"),
 
 		// Reacteur.com
 		"www.reacteur.com"		=> array("Reacteur", "kw"),
@@ -1010,9 +1009,9 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"sesam.no" 					=> array("Sesam", "q"),
 	
 		// Seznam
+		"search.seznam.cz" 		=> array("Seznam", "q"),
 		"search1.seznam.cz" 		=> array("Seznam", "q"),
 		"search2.seznam.cz" 		=> array("Seznam", "q"),
-		"search.seznam.cz" 		=> array("Seznam", "q"),
 		
 		// Sharelook
 		"www.sharelook.fr"		=> array("Sharelook", "keyword"),
@@ -1053,7 +1052,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"search-dyn.tiscali.it" 	=> array("Tiscali", "key"),
 		"www.tiscali.co.uk"		=> array("Tiscali", "query"),
 		"search-dyn.tiscali.de"		=> array("Tiscali", "key"),
-		"hledani.tiscali.cz" 		=> array("Tiscali", "query", "windows-1250"),
+		"hledani.tiscali.cz" 		=> array("Tiscali", "query", false, "windows-1250"),
 		
 		// T-Online
 		"suche.t-online.de"		=> array("T-Online", "q"),
@@ -1083,7 +1082,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"beta.voila.fr"			=> array("Voila", "kw"),
 		
 		// Volny
-		"web.volny.cz" 			=> array("Volny", "search", "windows-1250"),
+		"volny.zlatestranky.cz" => array("Volny", "search", "fulltext/?search={k}", "windows-1250"),
+		"web.volny.cz" 			=> array("Volny", "search", false, "windows-1250"),
 		
 		// Wanadoo
 		"search.ke.wanadoo.fr"		=> array("Wanadoo", "kw"),
@@ -1100,7 +1100,7 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.x-recherche.com" 		=> array("X-Recherche", "mots"),
 		
 		// Yahoo
-		"search.yahoo.com"		=> array("Yahoo!", "p"),
+		"search.yahoo.com"		=> array("Yahoo!", "p", "search?p={k}"),
 		"ink.yahoo.com"			=> array("Yahoo!", "p"),
 		"ink.yahoo.fr"			=> array("Yahoo!", "p"),
 		"fr.ink.yahoo.com"		=> array("Yahoo!", "p"),
@@ -1133,11 +1133,12 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"cf.dir.yahoo.com"		=> array("Yahoo! Directory", ""),
 		"fr.dir.yahoo.com"		=> array("Yahoo! Directory", ""),
 
-		"images.search.yahoo.com" => array('Yahoo! Images', 'p'),
+		// Yahoo! Images
+		"images.search.yahoo.com" => array('Yahoo! Images', 'p', "search/images?p={k}"),
 	
 		// Yandex
-		"www.yandex.ru" 		=> array("Yandex", "text"),
-		"yandex.ru" 			=> array("Yandex", "text"),
+		"yandex.ru" 		=> array("Yandex", "text", "yandsearch?text={k}"),
+		"www.yandex.ru" 			=> array("Yandex", "text"),
 		"search.yaca.yandex.ru" 	=> array("Yandex", "text"),
 		"ya.ru" 			=> array("Yandex", "text"),
 		"www.ya.ru" 			=> array("Yandex", "text"),
@@ -1193,8 +1194,8 @@ if(!isset($GLOBALS['Piwik_SearchEngines'] ))
 		"www.zoeken.nl" 		=> array("Zoeken","query"),
 		
 		// Zoohoo
-		"zoohoo.cz" 			=> array("Zoohoo", "q", "windows-1250"),
-		"www.zoohoo.cz" 		=> array("Zoohoo", "q", "windows-1250"),
+		"zoohoo.cz" 			=> array("Zoohoo", "q", "?q={k}", "windows-1250"),
+		"www.zoohoo.cz" 		=> array("Zoohoo", "q", false, "windows-1250"),
 		
 		// Zoznam
 		"www.zoznam.sk" 		=> array("Zoznam", "s"),
diff --git a/core/DataTable.php b/core/DataTable.php
index b4f100b7b9476815d94de2bf31bc44fbb5ef7ed8..c69e4fad69f2c08cf176ae7dc82e99ca303884fb 100644
--- a/core/DataTable.php
+++ b/core/DataTable.php
@@ -485,6 +485,25 @@ class Piwik_DataTable
 		return $this->rows[$id];
 	}
 
+	/**
+	 * Returns a row that has the subtable ID matching the parameter
+	 * 
+	 * @param int $idSubTable
+	 * @return Piwik_DataTable_Row or false if not found
+	 */
+	public function getRowFromIdSubDataTable($idSubTable)
+	{
+		$idSubTable = (int)$idSubTable;
+		foreach($this->rows as $row)
+		{
+			if($row->getIdSubDataTable() === $idSubTable)
+			{
+				return $row;
+			}
+		}
+		return false;
+	}
+	
 	/**
 	 * Add a row to the table and rebuild the index if necessary
 	 * 
diff --git a/core/DataTable/Filter.php b/core/DataTable/Filter.php
index 64654905ce6930e5ab67652086972058e5f5d844..b1545a500d02c91f11f0c1d146f5085ab9bc0171 100644
--- a/core/DataTable/Filter.php
+++ b/core/DataTable/Filter.php
@@ -47,6 +47,7 @@ require_once "DataTable/Filter/ColumnCallbackAddMetadata.php";
 require_once "DataTable/Filter/ColumnCallbackReplace.php";
 require_once "DataTable/Filter/ColumnCallbackAddColumnPercentage.php";
 require_once "DataTable/Filter/MetadataCallbackAddMetadata.php";
+require_once "DataTable/Filter/MetadataCallbackReplace.php";
 require_once "DataTable/Filter/AddConstantMetadata.php";
 require_once "DataTable/Filter/Null.php";
 require_once "DataTable/Filter/ExcludeLowPopulation.php";
diff --git a/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php b/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php
index 15ffab66c5bca8488594d6eb25351311a2b9b61c..4ac709634411042c60da0a22401936efddb24cae 100644
--- a/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php
+++ b/core/DataTable/Filter/ColumnCallbackAddColumnPercentage.php
@@ -9,7 +9,7 @@
  * 
  * Usage:
  *   $nbVisits = Piwik_VisitsSummary_API::getVisits($idSite, $period, $date);
- *   $dataTable->queuefilter('ColumnCallbackAddColumnPercentage', array('nb_visits', 'nb_visits_percentage', $nbVisits, 1));
+ *   $dataTable->queueFilter('ColumnCallbackAddColumnPercentage', array('nb_visits', 'nb_visits_percentage', $nbVisits, 1));
  *
  */
 class Piwik_DataTable_Filter_ColumnCallbackAddColumnPercentage extends Piwik_DataTable_Filter
diff --git a/core/DataTable/Filter/ColumnCallbackAddMetadata.php b/core/DataTable/Filter/ColumnCallbackAddMetadata.php
index 36558c357faa418ce0ad0141446616c837ae05fe..0dd44f7003ba321f88851a30173c2beea70112cf 100644
--- a/core/DataTable/Filter/ColumnCallbackAddMetadata.php
+++ b/core/DataTable/Filter/ColumnCallbackAddMetadata.php
@@ -25,12 +25,14 @@ class Piwik_DataTable_Filter_ColumnCallbackAddMetadata extends Piwik_DataTable_F
 {
 	private $columnToRead;
 	private $functionToApply;
+	private $functionParameters;
 	private $metadataToAdd;
 	
-	public function __construct( $table, $columnToRead, $metadataToAdd, $functionToApply )
+	public function __construct( $table, $columnToRead, $metadataToAdd, $functionToApply, $functionParameters = null )
 	{
 		parent::__construct($table);
 		$this->functionToApply = $functionToApply;
+		$this->functionParameters = $functionParameters;
 		$this->columnToRead = $columnToRead;
 		$this->metadataToAdd = $metadataToAdd;
 		$this->filter();
@@ -41,7 +43,12 @@ class Piwik_DataTable_Filter_ColumnCallbackAddMetadata extends Piwik_DataTable_F
 		foreach($this->table->getRows() as $key => $row)
 		{
 			$oldValue = $row->getColumn($this->columnToRead);
-			$newValue = call_user_func( $this->functionToApply, $oldValue);
+			$parameters = array($oldValue);
+			if(!is_null($this->functionParameters))
+			{
+				$parameters = array_merge($parameters, $this->functionParameters);
+			}
+			$newValue = call_user_func_array( $this->functionToApply, $parameters);
 			$row->addMetadata($this->metadataToAdd, $newValue);
 		}
 	}
diff --git a/core/DataTable/Filter/ColumnCallbackReplace.php b/core/DataTable/Filter/ColumnCallbackReplace.php
index ec296cb50e1a5b599ae81ec8843b859cd82f3e61..0fc435589ed8ac058b8ddcd5b7f0d99875a57343 100644
--- a/core/DataTable/Filter/ColumnCallbackReplace.php
+++ b/core/DataTable/Filter/ColumnCallbackReplace.php
@@ -34,14 +34,22 @@ class Piwik_DataTable_Filter_ColumnCallbackReplace extends Piwik_DataTable_Filte
 	{
 		foreach($this->table->getRows() as $key => $row)
 		{
-			$parameters = array($row->getColumn($this->columnToFilter));
+			$parameters = array($this->getElementToReplace($row, $this->columnToFilter));
 			if(!is_null($this->functionParameters))
 			{
 				$parameters = array_merge($parameters, $this->functionParameters);
 			}
 			$newValue = call_user_func_array( $this->functionToApply, $parameters);
-			$row->setColumn($this->columnToFilter, $newValue);
+			$this->setElementToReplace($row, $this->columnToFilter, $newValue);
 		}
 	}
+	
+	protected function setElementToReplace($row, $columnToFilter, $newValue)
+	{
+		$row->setColumn($columnToFilter, $newValue);
+	}
+	protected function getElementToReplace($row, $columnToFilter)
+	{
+		return $row->getColumn($columnToFilter);
+	}
 }
-
diff --git a/core/DataTable/Filter/MetadataCallbackReplace.php b/core/DataTable/Filter/MetadataCallbackReplace.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf3d071b1a296f7d2741505eda3337716e849a8c
--- /dev/null
+++ b/core/DataTable/Filter/MetadataCallbackReplace.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ * 
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html Gpl v3 or later
+ * @version $Id$
+ * 
+ * @package Piwik_DataTable
+ */
+
+/**
+ * Replace a metadata value with a new value resulting 
+ * from the function called with the metadata's value
+ * 
+ * @package Piwik_DataTable
+ * @subpackage Piwik_DataTable_Filter 
+ */
+class Piwik_DataTable_Filter_MetadataCallbackReplace extends Piwik_DataTable_Filter_ColumnCallbackReplace
+{
+	public function __construct( $table, $metadataToFilter, $functionToApply, $functionParameters = null )
+	{
+		parent::__construct($table, $metadataToFilter, $functionToApply, $functionParameters);
+	}
+
+	protected function setElementToReplace($row, $metadataToFilter, $newValue)
+	{
+		$row->setMetadata($metadataToFilter, $newValue);
+	}
+		
+	protected function getElementToReplace($row, $metadataToFilter)
+	{
+		return $row->getMetadata($metadataToFilter);
+	}
+}
diff --git a/core/DataTable/Row.php b/core/DataTable/Row.php
index d29b70f5e1a0b39376beeef49ba67f1ab67a49fc..de2a2c6831232adcb30633d725efc0776d6a5a05 100644
--- a/core/DataTable/Row.php
+++ b/core/DataTable/Row.php
@@ -276,7 +276,7 @@ class Piwik_DataTable_Row
 	{
 		$this->c[self::COLUMNS] = $columns;
 	}
-	
+
 	/**
 	 * Set the value $value to the column called $name.
 	 * 
@@ -288,6 +288,17 @@ class Piwik_DataTable_Row
 		$this->c[self::COLUMNS][$name] = $value;
 	}
 	
+	/**
+	 * Set the value $value to the metadata called $name.
+	 * 
+	 * @param string $name of the metadata to set
+	 * @param mixed $value of the metadata to set
+	 */
+	public function setMetadata($name, $value)
+	{
+		$this->c[self::METADATA][$name] = $value;
+	}
+	
 	/**
 	 * Add a new column to the row. If the column already exists, throws an exception
 	 * 
diff --git a/plugins/Actions/API.php b/plugins/Actions/API.php
index f9725828d1e4c3406d6085aecfcc7cafc1c8b639..38521703e4d391206e57bd03380126f727ce5bd9 100644
--- a/plugins/Actions/API.php
+++ b/plugins/Actions/API.php
@@ -47,7 +47,7 @@ class Piwik_Actions_API
 			$dataTable = $archive->getDataTable($name, $idSubtable);
 		}
 		$dataTable->filter('Sort', array('nb_visits', 'desc', $naturalSort = false, $expanded));
-		$dataTable->queuefilter('ReplaceSummaryRowLabel');
+		$dataTable->queueFilter('ReplaceSummaryRowLabel');
 		return $dataTable;
 	}
 	
diff --git a/plugins/Live/Visitor.php b/plugins/Live/Visitor.php
index 638dd91e65fcfac5b236ae99934c4943c38237a9..9a2a8c10d218b269306ff0215d94cf9926e932b7 100644
--- a/plugins/Live/Visitor.php
+++ b/plugins/Live/Visitor.php
@@ -168,10 +168,10 @@ class Piwik_Live_Visitor
 	
 	function getSearchEngineIcon()
 	{
-		$searchEngine = $this->getSearchEngineUrl();
-		if( !is_null($searchEngine) )
+		$searchEngineUrl = $this->getSearchEngineUrl();
+		if( !is_null($searchEngineUrl) )
 		{
-			return Piwik_getSearchEngineLogoFromName($searchEngine);
+			return Piwik_getSearchEngineLogoFromUrl($searchEngineUrl);
 		}
 		return null;
 	}
diff --git a/plugins/Provider/API.php b/plugins/Provider/API.php
index 19b185c619a6e3776d8e10d38bb97c7b71cf2789..0e2c3f6dd91d097da7cab3ea365f0ee952f47bd6 100644
--- a/plugins/Provider/API.php
+++ b/plugins/Provider/API.php
@@ -34,9 +34,9 @@ class Piwik_Provider_API
 		$archive = Piwik_Archive::build($idSite, $period, $date );
 		$dataTable = $archive->getDataTable('Provider_hostnameExt');
 		$dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS));
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'url', 'Piwik_getHostnameUrl'));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getHostnameName'));
-		$dataTable->queuefilter('ReplaceColumnNames');
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'url', 'Piwik_getHostnameUrl'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getHostnameName'));
+		$dataTable->queueFilter('ReplaceColumnNames');
 		return $dataTable;
 	}
 }
diff --git a/plugins/Referers/API.php b/plugins/Referers/API.php
index 0f0affebf4ca6bd61dc03f7587b54e34f83fbcee..1ae24a1832f7867511ae5caf8e6e4563d1eb9703 100644
--- a/plugins/Referers/API.php
+++ b/plugins/Referers/API.php
@@ -45,8 +45,8 @@ class Piwik_Referers_API
 			$dataTable = $archive->getDataTable($name, $idSubtable);
 		}
 		$dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS, 'desc', $naturalSort = false, $expanded));
-		$dataTable->queuefilter('ReplaceColumnNames', array($expanded));
-		$dataTable->queuefilter('ReplaceSummaryRowLabel');
+		$dataTable->queueFilter('ReplaceColumnNames', array($expanded));
+		$dataTable->queueFilter('ReplaceSummaryRowLabel');
 		return $dataTable;
 	}
 	
@@ -57,7 +57,7 @@ class Piwik_Referers_API
 		{
 			$dataTable->filter('Pattern', array('label', $typeReferer));
 		}
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getRefererTypeLabel'));
 		return $dataTable;
 	}
 	
@@ -70,22 +70,33 @@ class Piwik_Referers_API
 	function getSearchEnginesFromKeywordId($idSite, $period, $date, $idSubtable)
 	{
 		$dataTable = $this->getDataTable('Referers_searchEngineByKeyword',$idSite, $period, $date, $expanded = false, $idSubtable);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') );
-		$dataTable->queuefilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromName') );
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') );
+		$dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') );
+		
+		// get the keyword and create the URL to the search result page
+		$keywords = $this->getKeywords($idSite, $period, $date);
+		$keyword = $keywords->getRowFromIdSubDataTable($idSubtable)->getColumn('label');
+		$dataTable->queueFilter('MetadataCallbackReplace', array( 'url', 'Piwik_getSearchEngineUrlFromUrlAndKeyword', array($keyword)) );
 		return $dataTable;
 	}
 
 	function getSearchEngines($idSite, $period, $date, $expanded = false)
 	{
 		$dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') );
-		$dataTable->queuefilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromName') );
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromName') );
+		$dataTable->queueFilter('MetadataCallbackAddMetadata', array( 'url', 'logo', 'Piwik_getSearchEngineLogoFromUrl') );
 		return $dataTable;
 	}
 
 	function getKeywordsFromSearchEngineId($idSite, $period, $date, $idSubtable)
 	{
 		$dataTable = $this->getDataTable('Referers_keywordBySearchEngine',$idSite, $period, $date, $expanded = false, $idSubtable);
+		
+		// get the search engine and create the URL to the search result page
+		$searchEngines = $this->getSearchEngines($idSite, $period, $date);
+		$searchEngines->applyQueuedFilters();
+		$searchEngineUrl = $searchEngines->getRowFromIdSubDataTable($idSubtable)->getMetadata('url');
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', 'Piwik_getSearchEngineUrlFromKeywordAndUrl', array($searchEngineUrl)));
 		return $dataTable;
 	}
 
@@ -110,8 +121,8 @@ class Piwik_Referers_API
 	function getUrlsFromWebsiteId($idSite, $period, $date, $idSubtable)
 	{
 		$dataTable = $this->getDataTable('Referers_urlByWebsite',$idSite, $period, $date, $expanded = false, $idSubtable);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'url', create_function('$label', 'return $label;')) );
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'url', create_function('$label', 'return $label;')) );
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getPathFromUrl'));
 		return $dataTable;
 	}
 
diff --git a/plugins/Referers/functions.php b/plugins/Referers/functions.php
index 1683d9bdbcf427d242d8fd1e3e45da12ca08dbb5..c0118ae837816ad972af04d3ed7ad967cf1f4d73 100644
--- a/plugins/Referers/functions.php
+++ b/plugins/Referers/functions.php
@@ -23,14 +23,10 @@ function Piwik_getSearchEngineUrlFromName($name)
 	return $url;
 }
 
-
-function Piwik_getSearchEngineLogoFromName($url)
+function Piwik_getSearchEngineLogoFromUrl($url)
 {
-	require_once "DataFiles/SearchEngines.php";
-	$beginningUrl = strpos($url,'//') + 2;
-
 	$pathInPiwik = 'plugins/Referers/images/searchEngines/%s.png';
-	$pathWithCode = sprintf($pathInPiwik, substr($url,$beginningUrl));
+	$pathWithCode = sprintf($pathInPiwik, Piwik_getSearchEngineHostFromUrl($url));
 	$absolutePath = PIWIK_INCLUDE_PATH . '/' . $pathWithCode;
 	if(file_exists($absolutePath))
 	{
@@ -39,6 +35,24 @@ function Piwik_getSearchEngineLogoFromName($url)
 	return sprintf($pathInPiwik, 'xx');
 }
 
+function Piwik_getSearchEngineHostFromUrl($url)
+{
+	return substr($url, strpos($url,'//') + 2);
+}
+
+function Piwik_getSearchEngineUrlFromUrlAndKeyword($url, $keyword)
+{
+	require_once "DataFiles/SearchEngines.php";
+	$keyword = urlencode($keyword);
+	$path = @$GLOBALS['Piwik_SearchEngines'][Piwik_getSearchEngineHostFromUrl($url)][2];
+	$path = str_replace("{k}", $keyword, $path);
+	return $url . '/' . $path;
+}
+
+function Piwik_getSearchEngineUrlFromKeywordAndUrl($keyword, $url)
+{
+	return Piwik_getSearchEngineUrlFromUrlAndKeyword($url, $keyword);
+}
 
 function Piwik_getRefererTypeLabel($label)
 {
diff --git a/plugins/Referers/images/searchEngines/www.rambler.ru.png b/plugins/Referers/images/searchEngines/nova.rambler.ru.png
similarity index 100%
rename from plugins/Referers/images/searchEngines/www.rambler.ru.png
rename to plugins/Referers/images/searchEngines/nova.rambler.ru.png
diff --git a/plugins/Referers/images/searchEngines/www.live.com.png b/plugins/Referers/images/searchEngines/search.live.com.png
similarity index 100%
rename from plugins/Referers/images/searchEngines/www.live.com.png
rename to plugins/Referers/images/searchEngines/search.live.com.png
diff --git a/plugins/Referers/images/searchEngines/search2.seznam.cz.png b/plugins/Referers/images/searchEngines/search2.seznam.cz.png
deleted file mode 100644
index 49ea24c48cc7eefe6c7dee9a2cd05e7250b37831..0000000000000000000000000000000000000000
Binary files a/plugins/Referers/images/searchEngines/search2.seznam.cz.png and /dev/null differ
diff --git a/plugins/Referers/images/searchEngines/web.volny.cz.png b/plugins/Referers/images/searchEngines/volny.zlatestranky.cz.png
similarity index 100%
rename from plugins/Referers/images/searchEngines/web.volny.cz.png
rename to plugins/Referers/images/searchEngines/volny.zlatestranky.cz.png
diff --git a/plugins/UserCountry/API.php b/plugins/UserCountry/API.php
index 976f649344932a460508263b23c9c16f1a0c452a..ba54bcfab877adbc7ad8e7d4b6ce094c352d1b30 100644
--- a/plugins/UserCountry/API.php
+++ b/plugins/UserCountry/API.php
@@ -35,8 +35,8 @@ class Piwik_UserCountry_API
 		$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;')));
 		$dataTable->filter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getFlagFromCode'));
 		$dataTable->filter('ColumnCallbackReplace', array('label', 'Piwik_CountryTranslate'));
-		$dataTable->queuefilter('AddConstantMetadata', array('logoWidth', 18));
-		$dataTable->queuefilter('AddConstantMetadata', array('logoHeight', 12));
+		$dataTable->queueFilter('AddConstantMetadata', array('logoWidth', 18));
+		$dataTable->queueFilter('AddConstantMetadata', array('logoHeight', 12));
 		return $dataTable;
 	}
 	
@@ -44,7 +44,7 @@ class Piwik_UserCountry_API
 	{
 		$dataTable = $this->getDataTable('UserCountry_continent', $idSite, $period, $date);
 		$dataTable->filter('ColumnCallbackReplace', array('label', 'Piwik_ContinentTranslate'));
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;')));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'code', create_function('$label', 'return $label;')));
 		return $dataTable;
 	}
 	
@@ -54,7 +54,7 @@ class Piwik_UserCountry_API
 		$archive = Piwik_Archive::build($idSite, $period, $date );
 		$dataTable = $archive->getDataTable($name);
 		$dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS));
-		$dataTable->queuefilter('ReplaceColumnNames');
+		$dataTable->queueFilter('ReplaceColumnNames');
 		return $dataTable;
 	}
 	
diff --git a/plugins/UserSettings/API.php b/plugins/UserSettings/API.php
index 9b51464a70fdbbbbd14241b3f57ba8affa77807e..2fe37170549e7ec4946b0a2d4ef93ba0dbec0610 100644
--- a/plugins/UserSettings/API.php
+++ b/plugins/UserSettings/API.php
@@ -33,7 +33,7 @@ class Piwik_UserSettings_API
 		$archive = Piwik_Archive::build($idSite, $period, $date );
 		$dataTable = $archive->getDataTable($name);
 		$dataTable->filter('Sort', array(Piwik_Archive::INDEX_NB_VISITS));
-		$dataTable->queuefilter('ReplaceColumnNames');
+		$dataTable->queueFilter('ReplaceColumnNames');
 		return $dataTable;
 	}
 	public function getResolution( $idSite, $period, $date )
@@ -45,49 +45,49 @@ class Piwik_UserSettings_API
 	public function getConfiguration( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_configuration', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getConfigurationLabel'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getConfigurationLabel'));
 		return $dataTable;
 	}
 
 	public function getOS( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_os', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getOSLogo'));
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array( 'label', 'shortLabel', 'Piwik_getOSShortLabel') );
-		$dataTable->queuefilter('ColumnCallbackReplace', array( 'label', 'Piwik_getOSLabel') );
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getOSLogo'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array( 'label', 'shortLabel', 'Piwik_getOSShortLabel') );
+		$dataTable->queueFilter('ColumnCallbackReplace', array( 'label', 'Piwik_getOSLabel') );
 		return $dataTable;
 	}
 		
 	public function getBrowser( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_browser', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getBrowsersLogo'));
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'Piwik_getBrowserShortLabel'));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserLabel'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getBrowsersLogo'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'Piwik_getBrowserShortLabel'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserLabel'));
 		return $dataTable;
 	}
 	
 	public function getBrowserType( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_browserType', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'ucfirst'));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserTypeLabel'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'shortLabel', 'ucfirst'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getBrowserTypeLabel'));
 		return $dataTable;
 	}
 	
 	public function getWideScreen( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_wideScreen', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getScreensLogo'));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'ucfirst'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getScreensLogo'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst'));
 		return $dataTable;
 	}
 	
 	public function getPlugin( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('UserSettings_plugin', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getPluginsLogo'));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'ucfirst'));
+		$dataTable->queueFilter('ColumnCallbackAddMetadata', array('label', 'logo', 'Piwik_getPluginsLogo'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'ucfirst'));
 		return $dataTable;
 	}	
 }
diff --git a/plugins/VisitTime/API.php b/plugins/VisitTime/API.php
index 0e88059befcd5b6363860fb18c474ed40e30fea3..6290a6030605401a818dc01f84c717cecc109f28 100644
--- a/plugins/VisitTime/API.php
+++ b/plugins/VisitTime/API.php
@@ -33,8 +33,8 @@ class Piwik_VisitTime_API
 		$archive = Piwik_Archive::build($idSite, $period, $date );
 		$dataTable = $archive->getDataTable($name);
 		$dataTable->filter('Sort', array('label', 'asc', true));
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getTimeLabel'));
-		$dataTable->queuefilter('ReplaceColumnNames');
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getTimeLabel'));
+		$dataTable->queueFilter('ReplaceColumnNames');
 		return $dataTable;
 	}
 	
diff --git a/plugins/VisitorInterest/API.php b/plugins/VisitorInterest/API.php
index 9d7be0264e45f62599699ec088c29c11f8349476..3a95380a663cbb4bb99176ad4f422c692e4dd2b8 100644
--- a/plugins/VisitorInterest/API.php
+++ b/plugins/VisitorInterest/API.php
@@ -32,22 +32,22 @@ class Piwik_VisitorInterest_API
 		$archive = Piwik_Archive::build($idSite, $period, $date );
 		$dataTable = $archive->getDataTable($name);
 		$dataTable->filter('Sort',array(Piwik_Archive::INDEX_NB_VISITS));
-		$dataTable->queuefilter('ReplaceColumnNames');
-		$dataTable->queuefilter('Sort', array('label', 'asc', true));
+		$dataTable->queueFilter('ReplaceColumnNames');
+		$dataTable->queueFilter('Sort', array('label', 'asc', true));
 		return $dataTable;
 	}
 	
 	public function getNumberOfVisitsPerVisitDuration( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('VisitorInterest_timeGap', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getDurationLabel'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getDurationLabel'));
 		return $dataTable;
 	}
 
 	public function getNumberOfVisitsPerPage( $idSite, $period, $date )
 	{
 		$dataTable = $this->getDataTable('VisitorInterest_pageGap', $idSite, $period, $date);
-		$dataTable->queuefilter('ColumnCallbackReplace', array('label', 'Piwik_getPageGapLabel'));
+		$dataTable->queueFilter('ColumnCallbackReplace', array('label', 'Piwik_getPageGapLabel'));
 		return $dataTable;
 	}
 }
diff --git a/tests/core/Common.test.php b/tests/core/Common.test.php
index 574e5fe210708b8306338d4c8addf7b030335953..1f7c3d8623ce5d6404fb5af88de3518cd4a3f3b2 100755
--- a/tests/core/Common.test.php
+++ b/tests/core/Common.test.php
@@ -585,6 +585,18 @@ class Test_Piwik_Common extends UnitTestCase
 		}
 	}
 	
+	public function test_SearchEngines_areDefinedCorrectly()
+	{
+		require_once "DataFiles/SearchEngines.php";
+		foreach($GLOBALS['Piwik_SearchEngines'] as $host => $info)
+		{
+			if(isset($info[2]) && $info[2] !== false)
+			{
+				$this->assertTrue(strrpos($info[2], "{k}") !== false, "$host search URL is not defined correctly, found {$info[2]} but must contain the macro {k}");
+			}
+		}
+	}
+	
 	public function test_extractSearchEngineInformationFromUrl()
 	{
 		$urls = array(
diff --git a/tests/core/DataTable.test.php b/tests/core/DataTable.test.php
index b9f679acd4a8fc199e1100793329311cd28469f7..878ca2e5ef671d2648987cc5ba12ffb16a9fac26 100644
--- a/tests/core/DataTable.test.php
+++ b/tests/core/DataTable.test.php
@@ -76,6 +76,22 @@ class Test_Piwik_DataTable extends UnitTestCase
 		$this->assertTrue($table->getLastRow(), $table->getRowFromId($rowsCount-2));
 	}
 	
+	public function test_getRowFromIdSubDataTable()
+	{
+		$table1 = $this->getDataTable1ForTest();
+		$idTable1 = $table1->getId();
+		$table2 = $this->getDataTable2ForTest();
+		$this->assertEqual($table2->getRowFromIdSubDataTable($idTable1), false);
+		
+		$table2->getFirstRow()->addSubtable($table1);
+		$this->assertEqual($table2->getRowFromIdSubDataTable($idTable1), $table2->getFirstRow());
+		
+		$table3 = $this->getDataTable1ForTest();
+		$idTable3 = $table3->getId();
+		$table2->getLastRow()->addSubtable($table3);
+		$this->assertEqual($table2->getRowFromIdSubDataTable($idTable3), $table2->getLastRow());
+	}
+	
 	/**
 	 * we test the count rows and the count rows recursive version
 	 * on a Simple array (1 level only)