diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index cb23baeb6fbe1c1065481672527e2728bb613e47..0078ec39314cb888d5743efad8d5db99b2ca235a 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -1427,45 +1427,66 @@ class Piwik_Tracker_Visit_Referer
 		return true;
 	}
 
-	/*
-	 * Campaign analysis
-	 */
-	protected function detectRefererCampaign()
+	protected function detectCampaignFromString($string)
 	{
-		if(isset($this->currentUrlParse['query']))
+		foreach($this->campaignNames as $campaignNameParameter)
 		{
-			$campaignParameters = Piwik_Common::getCampaignParameters();
-
-			$campaignNames = $campaignParameters[0];
-			foreach($campaignNames as $campaignNameParameter)
+			$campaignName = trim(urldecode(Piwik_Common::getParameterFromQueryString($string, $campaignNameParameter)));
+			if( !empty($campaignName))
 			{
-				$campaignName = trim(urldecode(Piwik_Common::getParameterFromQueryString($this->currentUrlParse['query'], $campaignNameParameter)));
-				if( !empty($campaignName))
-				{
-					break;
-				}
+				break;
 			}
+		}
 
-			if(!empty($campaignName))
-			{
-				$this->typeRefererAnalyzed = Piwik_Common::REFERER_TYPE_CAMPAIGN;
-				$this->nameRefererAnalyzed = $campaignName;
+		if(!empty($campaignName))
+		{
+			$this->typeRefererAnalyzed = Piwik_Common::REFERER_TYPE_CAMPAIGN;
+			$this->nameRefererAnalyzed = $campaignName;
 
-				$campaignKeywords = $campaignParameters[1];
-				foreach($campaignKeywords as $campaignKeywordParameter)
+			foreach($this->campaignKeywords as $campaignKeywordParameter)
+			{
+				$campaignKeyword = Piwik_Common::getParameterFromQueryString($string, $campaignKeywordParameter);
+				if( !empty($campaignKeyword))
 				{
-					$campaignKeyword = Piwik_Common::getParameterFromQueryString($this->currentUrlParse['query'], $campaignKeywordParameter);
-					if( !empty($campaignKeyword))
-					{
-						$this->keywordRefererAnalyzed = trim(urldecode($campaignKeyword));
-						break;
-					}
+					$this->keywordRefererAnalyzed = trim(urldecode($campaignKeyword));
+					break;
 				}
-				return true;
 			}
+			return true;
 		}
 		return false;
 	}
+	
+	/*
+	 * Campaign analysis
+	 */
+	protected function detectRefererCampaign()
+	{
+		if(!isset($this->currentUrlParse['query'])
+			&& !isset($this->currentUrlParse['fragment']))
+		{
+			return false;
+		}
+		$campaignParameters = Piwik_Common::getCampaignParameters();
+		$this->campaignNames = $campaignParameters[0];
+		$this->campaignKeywords = $campaignParameters[1];
+		
+		$found = false;
+		
+		// 1) Detect campaign from query string
+		if(isset($this->currentUrlParse['query']))
+		{
+			$found = $this->detectCampaignFromString($this->currentUrlParse['query']);
+		}
+
+		// 2) Detect from fragment #hash
+		if(!$found
+			&& isset($this->currentUrlParse['fragment']))
+		{
+			$found = $this->detectCampaignFromString($this->currentUrlParse['fragment']);
+		}
+		return $found;
+	}
 
 	/*
 	 * We have previously tried to detect the campaign variables in the URL
diff --git a/plugins/CoreHome/templates/header.tpl b/plugins/CoreHome/templates/header.tpl
index 239b956bc9a1d12f23ff9474b215ba5279b88098..fd4fe450a5ceddf3bcec3a571f4277ecf851382b 100644
--- a/plugins/CoreHome/templates/header.tpl
+++ b/plugins/CoreHome/templates/header.tpl
@@ -1,5 +1,4 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml">
 <head>
 <title>{if !$isCustomLogo}Piwik &rsaquo; {/if} {'CoreHome_WebAnalyticsReports'|translate} - {$siteName}</title>
diff --git a/plugins/Live/templates/visitorLog.tpl b/plugins/Live/templates/visitorLog.tpl
index 0ef46a0349fe36e6b801e5c528647f37081d0aa8..7e2b4d7b934f471eb4e54c93e44787a2f3077671 100644
--- a/plugins/Live/templates/visitorLog.tpl
+++ b/plugins/Live/templates/visitorLog.tpl
@@ -223,7 +223,7 @@
 				{else}
 				{* Goal conversion *}
 					<img src="{$action.icon}" /> 
-					<strong>{$action.goalName}</strong>
+					<strong>{$action.goalName|escape:'html'}</strong>
 					{if $action.revenue > 0}, {'Live_GoalRevenue'|translate}: <strong>{$action.revenue|money:$javascriptVariablesToSet.idSite}</strong>{/if}
 				{/if}
 				</li>
diff --git a/tests/integration/TrackCustomVariablesAndCampaigns_ForceUsingVisitIdNotHeuristics.test.php b/tests/integration/TrackCustomVariablesAndCampaigns_ForceUsingVisitIdNotHeuristics.test.php
index b1226a46feda1b44b97391556bd27d56aff9094a..8d9fe5be9f200f89b553c872cb27811e2bfb0439 100755
--- a/tests/integration/TrackCustomVariablesAndCampaigns_ForceUsingVisitIdNotHeuristics.test.php
+++ b/tests/integration/TrackCustomVariablesAndCampaigns_ForceUsingVisitIdNotHeuristics.test.php
@@ -53,7 +53,7 @@ class Test_Piwik_Integration_TrackCustomVariablesAndCampaigns_ForceUsingVisitIdN
         $t = $this->getTracker($idSite, $dateTime, $defaultInit = true);
 
         // Record 1st page view
-        $t->setUrl( 'http://example.org/index.htm?utm_campaign=GA Campaign&piwik_kwd=Piwik kwd&utm_term=GA keyword SHOULD NOT DISPLAY' );
+        $t->setUrl( 'http://example.org/index.htm?utm_campaign=GA Campaign&piwik_kwd=Piwik kwd&utm_term=GA keyword SHOULD NOT DISPLAY#pk_campaign=NOT TRACKED!!&pk_kwd=NOT TRACKED!!' );
         $this->checkResponse($t->doTrackPageView( 'incredible title!'));
         
         $visitorId = $t->getVisitorId();
@@ -96,7 +96,7 @@ class Test_Piwik_Integration_TrackCustomVariablesAndCampaigns_ForceUsingVisitIdN
         $t3->setForceVisitDateTime(Piwik_Date::factory($dateTime)->addHour(1.3)->getDatetime());
         // fake a website ref cookie, the campaign should be credited for conversion, not referrer.example.com nor example.org 
         $t3->DEBUG_APPEND_URL = '&_ref=http%3A%2F%2Freferrer.example.com%2Fpage%2Fsub%3Fquery%3Dtest%26test2%3Dtest3';
-        $t3->setUrl( 'http://example.org/index.htm?pk_campaign=CREDITED TO GOAL PLEASE' );
+        $t3->setUrl( 'http://example.org/index.htm#pk_campaign=CREDITED TO GOAL PLEASE' );
         $this->checkResponse($t3->doTrackGoal($idGoal, 42));
 	}
 }