diff --git a/config/global.ini.php b/config/global.ini.php
index 2bab7b130d71ad47004c0161932d85f37c0a1a7e..4ce72bd813512309ed954370af4a6ce8b896b8ac 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -586,6 +586,16 @@ campaign_var_name = "pk_cpn,pk_campaign,piwik_campaign,utm_campaign,utm_source,u
 ; Includes by default the GA style campaign keyword parameter utm_term
 campaign_keyword_var_name = "pk_kwd,pk_keyword,piwik_kwd,utm_term"
 
+; if set to 1, actions that contain different campaign information from the visitor's ongoing visit will
+; be treated as the start of a new visit. This will include situations when campaign information was absent before,
+; but is present now.
+create_new_visit_when_campaign_changes = 1
+
+; if set to 1, actions that contain different website referrer information from the visitor's ongoing visit
+; will be treatedas the start of a new visit. This will include situations when website referrer information was
+; absent before, but is present now.
+create_new_visit_when_website_referrer_changes = 0
+
 ; maximum length of a Page Title or a Page URL recorded in the log_action.name table
 page_maximum_length = 1024;
 
diff --git a/core/Plugin/Dimension/VisitDimension.php b/core/Plugin/Dimension/VisitDimension.php
index 09a58554c09d521d9b0c660763c655252d4b7d74..b9aa3a9b2aa4235afe5f04b8eeba99e0e4b7025a 100644
--- a/core/Plugin/Dimension/VisitDimension.php
+++ b/core/Plugin/Dimension/VisitDimension.php
@@ -269,6 +269,25 @@ abstract class VisitDimension extends Dimension
         return false;
     }
 
+    /**
+     * This hook is executed by the tracker when determining if an action is the start of a new visit
+     * or part of an existing one. Derived classes can use it to force new visits based on dimension
+     * data.
+     *
+     * For example, the Campaign dimension in the Referrers plugin will force a new visit if the
+     * campaign information for the current action is different from the last.
+     *
+     * @param Request $request The current tracker request information.
+     * @param Visitor $visitor The information for the currently recognized visitor.
+     * @param Action|null $action The current action information (if any).
+     * @return bool Return true to force a visit, false if otherwise.
+     * @api
+     */
+    public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
+    {
+        return false;
+    }
+
     /**
      * Get all visit dimensions that are defined by all activated plugins.
      * @return VisitDimension[]
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index 4065ebe15cba87e849969045a36ee68e3f000e3f..4e108450b5dd81da0211cd2a38572f2a8b83cc81 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -152,11 +152,7 @@ class Visit implements VisitInterface
 
         $this->visitorInfo = $visitor->getVisitorInfo();
 
-        $isLastActionInTheSameVisit = $this->isLastActionInTheSameVisit($visitor);
-
-        if (!$isLastActionInTheSameVisit) {
-            Common::printDebug("Visitor detected, but last action was more than 30 minutes ago...");
-        }
+        $isNewVisit = $this->isVisitNew($visitor, $action);
 
         // Known visit when:
         // ( - the visitor has the Piwik cookie with the idcookie ID used by Piwik to match the visitor
@@ -165,9 +161,7 @@ class Visit implements VisitInterface
         // )
         // AND
         // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit()
-        if ($visitor->isVisitorKnown()
-            && $isLastActionInTheSameVisit
-        ) {
+        if (!$isNewVisit) {
             $idReferrerActionUrl  = $this->visitorInfo['visit_exit_idaction_url'];
             $idReferrerActionName = $this->visitorInfo['visit_exit_idaction_name'];
 
@@ -203,9 +197,7 @@ class Visit implements VisitInterface
         // - the visitor has the Piwik cookie but the last action was performed more than 30 min ago @see isLastActionInTheSameVisit()
         // - the visitor doesn't have the Piwik cookie, and couldn't be matched in @see recognizeTheVisitor()
         // - the visitor does have the Piwik cookie but the idcookie and idvisit found in the cookie didn't match to any existing visit in the DB
-        if (!$visitor->isVisitorKnown()
-            || !$isLastActionInTheSameVisit
-        ) {
+        if ($isNewVisit) {
             $this->handleNewVisit($visitor, $action, $visitIsConverted);
             if (!is_null($action)) {
                 $action->record($visitor, 0, 0);
@@ -550,6 +542,16 @@ class Visit implements VisitInterface
         return $valuesToUpdate;
     }
 
+    private function triggerPredicateHookOnDimensions($dimensions, $hook, Visitor $visitor, Action $action = null)
+    {
+        foreach ($dimensions as $dimension) {
+            if ($dimension->$hook($this->request, $visitor, $action)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     protected function getAllVisitDimensions()
     {
         $dimensions = VisitDimension::getAllDimensions();
@@ -598,4 +600,30 @@ class Visit implements VisitInterface
     {
         return $this->getModel()->createVisit($visit);
     }
+
+    /**
+     * Determines if the tracker if the current action should be treated as the start of a new visit or
+     * an action in an existing visit.
+     *
+     * @param Visitor $visitor The current visit/visitor information.
+     * @param Action|null $action The current action being tracked.
+     * @return bool
+     */
+    public function isVisitNew(Visitor $visitor, Action $action = null)
+    {
+        $isLastActionInTheSameVisit = $this->isLastActionInTheSameVisit($visitor);
+
+        if (!$isLastActionInTheSameVisit) {
+            Common::printDebug("Visitor detected, but last action was more than 30 minutes ago...");
+
+            return true;
+        }
+
+        $shouldForceNewVisit = $this->triggerPredicateHookOnDimensions($this->getAllVisitDimensions(), 'shouldForceNewVisit', $visitor, $action);
+        if ($shouldForceNewVisit) {
+            return true;
+        }
+
+        return !$visitor->isVisitorKnown();
+    }
 }
diff --git a/plugins/Referrers/Columns/Base.php b/plugins/Referrers/Columns/Base.php
index a69fcc54bfe3639fd3d4b6104cb476738d0ca2e6..5e8c186af8892402d0b1082ba09d865f194b253a 100644
--- a/plugins/Referrers/Columns/Base.php
+++ b/plugins/Referrers/Columns/Base.php
@@ -127,6 +127,14 @@ abstract class Base extends VisitDimension
         return $referrerInformation;
     }
 
+    protected function getReferrerInformationFromRequest(Request $request)
+    {
+        $referrerUrl = $request->getParam('urlref');
+        $currentUrl  = $request->getParam('url');
+
+        return $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite());
+    }
+
     /**
      * Search engine detection
      * @return bool
@@ -399,4 +407,23 @@ abstract class Base extends VisitDimension
         }
     }
 
-}
+    protected function isReferrerInformationNew(Visitor $visitor, $information)
+    {
+        foreach (array('referer_keyword', 'referer_name', 'referer_type') as $infoName) {
+            if ($this->hasReferrerColumnChanged($visitor, $information, $infoName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    protected function hasReferrerColumnChanged(Visitor $visitor, $information, $infoName)
+    {
+        return Common::mb_strtolower($visitor->getVisitorColumn($infoName)) != $information[$infoName];
+    }
+
+    protected function doesLastActionHaveSameReferrer(Visitor $visitor, $referrerType)
+    {
+        return $visitor->getVisitorColumn('referer_type') == $referrerType;
+    }
+}
\ No newline at end of file
diff --git a/plugins/Referrers/Columns/Campaign.php b/plugins/Referrers/Columns/Campaign.php
index 4413cd702f65a9eb936d872f41c9790031cc227e..ff2d5c24012b20586be770a5a9172df7d874083a 100644
--- a/plugins/Referrers/Columns/Campaign.php
+++ b/plugins/Referrers/Columns/Campaign.php
@@ -8,13 +8,58 @@
  */
 namespace Piwik\Plugins\Referrers\Columns;
 
-use Piwik\Columns\Dimension;
+use Piwik\Common;
 use Piwik\Piwik;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\TrackerConfig;
+use Piwik\Tracker\Visitor;
 
-class Campaign extends Dimension
+class Campaign extends Base
 {
+    /**
+     * Obtained from the `[Tracker] create_new_visit_when_campaign_changes` INI config option.
+     * If true, will create new visits when campaign name changes.
+     *
+     * @var bool
+     */
+    protected $createNewVisitWhenCampaignChanges;
+
+    public function __construct()
+    {
+        $this->createNewVisitWhenCampaignChanges = TrackerConfig::getConfigValue('create_new_visit_when_campaign_changes') == 1;
+    }
+
     public function getName()
     {
         return Piwik::translate('Referrers_ColumnCampaign');
     }
-}
+
+    /**
+     * If we should create a new visit when the campaign changes, check if the campaign info changed and if so
+     * force the tracker to create a new visit.
+     *
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return bool
+     */
+    public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
+    {
+        if (!$this->createNewVisitWhenCampaignChanges) {
+            return false;
+        }
+
+        $information = $this->getReferrerInformationFromRequest($request);
+
+        if ($information['referer_type'] == Common::REFERRER_TYPE_CAMPAIGN
+            && $this->isReferrerInformationNew($visitor, $information)
+        ) {
+            Common::printDebug("Existing visit detected, but creating new visit because campaign information is different than last action.");
+
+            return true;
+        }
+
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php
index a5025b63c21cc7b7696285ea7d9c3273b3091440..78605c9d94a4f742119e05be62870d9ee916165a 100644
--- a/plugins/Referrers/Columns/Keyword.php
+++ b/plugins/Referrers/Columns/Keyword.php
@@ -41,10 +41,7 @@ class Keyword extends Base
      */
     public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
-        $referrerUrl = $request->getParam('urlref');
-        $currentUrl  = $request->getParam('url');
-
-        $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite());
+        $information = $this->getReferrerInformationFromRequest($request);
 
         if (!empty($information['referer_keyword'])) {
             return substr($information['referer_keyword'], 0, 255);
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index fbd55219dccdc55bd696f578f161fb7fe8c4f308..7bdb0732a67d855ecefb9ccba21e753c564922a5 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -35,10 +35,7 @@ class ReferrerName extends Base
      */
     public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
-        $referrerUrl = $request->getParam('urlref');
-        $currentUrl  = $request->getParam('url');
-
-        $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite());
+        $information = $this->getReferrerInformationFromRequest($request);
 
         if (!empty($information['referer_name'])) {
 
diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php
index f4e688f60e05d5959bfb62f5c940214d32b68b42..5303a1c360f13ad194676b5df9b247e5bcc38387 100644
--- a/plugins/Referrers/Columns/ReferrerType.php
+++ b/plugins/Referrers/Columns/ReferrerType.php
@@ -42,10 +42,7 @@ class ReferrerType extends Base
      */
     public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
-        $referrerUrl = $request->getParam('urlref');
-        $currentUrl  = $request->getParam('url');
-
-        $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite());
+        $information = $this->getReferrerInformationFromRequest($request);
 
         return $information['referer_type'];
     }
diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php
index 0404a132472c9fca1e8aaadca95b2e58dd43e260..21c5cd5bdcc281ab3fb758cfaa8f7e423eaf7039 100644
--- a/plugins/Referrers/Columns/ReferrerUrl.php
+++ b/plugins/Referrers/Columns/ReferrerUrl.php
@@ -35,10 +35,7 @@ class ReferrerUrl extends Base
      */
     public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
-        $referrerUrl = $request->getParam('urlref');
-        $currentUrl  = $request->getParam('url');
-
-        $information = $this->getReferrerInformation($referrerUrl, $currentUrl, $request->getIdSite());
+        $information = $this->getReferrerInformationFromRequest($request);
 
         return $information['referer_url'];
     }
diff --git a/plugins/Referrers/Columns/Website.php b/plugins/Referrers/Columns/Website.php
index 53b143d6933f1ae33956ef2d603347aedfb7bdc3..42d05068d60e72731ff1ce4079a9e793e2ca4295 100644
--- a/plugins/Referrers/Columns/Website.php
+++ b/plugins/Referrers/Columns/Website.php
@@ -8,13 +8,50 @@
  */
 namespace Piwik\Plugins\Referrers\Columns;
 
-use Piwik\Columns\Dimension;
+use Piwik\Common;
 use Piwik\Piwik;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\TrackerConfig;
+use Piwik\Tracker\Visitor;
 
-class Website extends Dimension
+class Website extends Base
 {
+    /**
+     * Set using the `[Tracker] create_new_visit_when_website_referrer_changes` INI config option.
+     * If true, will force new visits if the referrer website changes.
+     *
+     * @var bool
+     */
+    protected $createNewVisitWhenWebsiteReferrerChanges;
+
+    public function __construct()
+    {
+        $this->createNewVisitWhenWebsiteReferrerChanges = TrackerConfig::getConfigValue('create_new_visit_when_website_referrer_changes') == 1;
+    }
+
     public function getName()
     {
         return Piwik::translate('General_Website');
     }
+
+    public function shouldForceNewVisit(Request $request, Visitor $visitor, Action $action = null)
+    {
+        if (!$this->createNewVisitWhenWebsiteReferrerChanges) {
+            return false;
+        }
+
+        $information = $this->getReferrerInformationFromRequest($request);
+
+        if ($information['referer_type'] == Common::REFERRER_TYPE_WEBSITE
+            && $this->isReferrerInformationNew($visitor, $information)
+        ) {
+            Common::printDebug("Existing visit detected, but creating new visit because website referrer information is different than last action.");
+
+            return true;
+        }
+
+        return false;
+
+    }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
index 3c73972a7a94a1c5ffc30fce12606634d3b3316e..5c3dcc553eeee4a9b31042765bc7e3501194aa12 100644
--- a/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
+++ b/tests/PHPUnit/Fixtures/SomeVisitsCustomVariablesCampaignsNotHeuristics.php
@@ -25,6 +25,7 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
 
     public function setUp()
     {
+        $this->setPiwikEnvironmentOverrides();
         $this->setUpWebsitesAndGoals();
         $this->trackVisits();
     }
@@ -33,6 +34,14 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
     {
     }
 
+    private function setPiwikEnvironmentOverrides()
+    {
+        $configOverride = $this->getTestEnvironment()->configOverride;
+        $configOverride['Tracker']['create_new_visit_when_website_referrer_changes'] = 1;
+        $this->getTestEnvironment()->configOverride = $configOverride;
+        $this->getTestEnvironment()->save();
+    }
+
     private function setUpWebsitesAndGoals()
     {
         if (!self::siteCreated($idSite = 1)) {
@@ -85,6 +94,11 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
         $t3->setUrl('http://example.org/index.htm#pk_campaign=CREDITED TO GOAL PLEASE');
         self::checkResponse($t3->doTrackGoal($idGoal, 42));
 
+        // another action soon after last but with different campaign (should result in new visit)
+        $t3->setForceVisitDateTime(Date::factory($dateTime)->addHour(1.4)->getDatetime());
+        $t3->setUrl('http://example.org/index.html#pk_campaign=CREDITED TO ANOTHER GOAL');
+        self::checkResponse($t3->doTrackGoal($idGoal, 24));
+
         // visitor #4, test for blank referrer campaign keyword
         $t4 = self::getTracker($idSite, $dateTime);
         $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(3)->getDatetime());
@@ -125,6 +139,44 @@ class SomeVisitsCustomVariablesCampaignsNotHeuristics extends Fixture
         $t4->setUrlReferrer($adwords);
         $t4->setUrl('http://example.org/index.html');
         self::checkResponse($t4->doTrackPageView('Bonjour le monde'));
+
+        // test one action w/ no campaign & then one action w/ a campaign (should result in 2 visits)
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(10)->getDatetime());
+        $t4->setUrlReferrer('');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('Hallo welt'));
+
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(10.1)->getDatetime());
+        $t4->setUrl('http://example.org/index.html?utm_campaign=GA Campaign&piwik_kwd=Piwik kwd');
+        self::checkResponse($t4->doTrackPageView('¡hola mundo'));
+
+        // right after last action, visit w/ referrer website (should result in another visit)
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(10.2)->getDatetime());
+        $t4->setUrlReferrer('http://myreferrerwebsite.com');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('Dia duit ar domhan'));
+
+        // test one action w/ no referrer website & then one action w/ referrer website (should result in 2 visits)
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(11)->getDatetime());
+        $t4->setUrlReferrer('');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('привет мир'));
+
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(11.1)->getDatetime());
+        $t4->setUrlReferrer('http://myotherreferrerwebsite.com');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('hallå världen'));
+
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(11.2)->getDatetime()); // same referrer in next action, should result in just another action
+        $t4->setUrlReferrer('http://myotherreferrerwebsite.com');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('halló heimur'));
+
+        // same visitor as last w/ action soon after last action but w/ new referrer website (should result in another visit)
+        $t4->setForceVisitDateTime(Date::factory($dateTime)->addHour(11.3)->getDatetime());
+        $t4->setUrlReferrer('http://mutantregistration.com');
+        $t4->setUrl('http://example.org/index.html');
+        self::checkResponse($t4->doTrackPageView('העלא וועלט'));
     }
 
     // see updateDomainHash() in piwik.js
diff --git a/tests/PHPUnit/Integration/Tracker/VisitTest.php b/tests/PHPUnit/Integration/Tracker/VisitTest.php
index 3a516d1c53be2b9a6bba990bb42e3c3e75a530c1..eb5fd28d781335394eb33fc4da55405d573b1b2d 100644
--- a/tests/PHPUnit/Integration/Tracker/VisitTest.php
+++ b/tests/PHPUnit/Integration/Tracker/VisitTest.php
@@ -9,13 +9,18 @@
 namespace Piwik\Tests\Integration\Tracker;
 
 use Piwik\Access;
+use Piwik\Cache\PluginAwareStaticCache;
+use Piwik\Date;
 use Piwik\Network\IPUtils;
 use Piwik\Plugin\Manager;
 use Piwik\Plugins\SitesManager\API;
 use Piwik\Tests\Framework\Mock\FakeAccess;
+use Piwik\Tracker\ActionPageview;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visit;
 use Piwik\Tracker\VisitExcluded;
 use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+use Piwik\Tracker\Visitor;
 
 /**
  * @group Core
@@ -249,6 +254,86 @@ class VisitTest extends IntegrationTestCase
             $this->assertSame($isBot, $excluded->public_isNonHumanBot(), $userAgent);
         }
     }
+
+    public function test_isVisitNew_ReturnsFalse_IfLastActionTimestampIsWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorKnown()
+    {
+        $this->setDimensionsWithOnNewVisit(array(false, false, false));
+
+        /** @var Visit $visit */
+        list($visit, $visitor, $action) = $this->makeVisitorAndAction(
+            $lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45', $isVisitorKnown = true);
+
+        $result = $visit->isVisitNew($visitor, $action);
+
+        $this->assertFalse($result);
+    }
+
+    public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsNotWithinVisitTimeLength_AndNoDimensionForcesVisit_AndVisitorNotKnown()
+    {
+        $this->setDimensionsWithOnNewVisit(array(false, false, false));
+
+        /** @var Visit $visit */
+        list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 09:12:45');
+
+        $result = $visit->isVisitNew($visitor, $action);
+
+        $this->assertTrue($result);
+    }
+
+    public function test_isVisitNew_ReturnsTrue_IfLastActionTimestampIsWithinVisitTimeLength_AndDimensionForcesVisit()
+    {
+        $this->setDimensionsWithOnNewVisit(array(false, false, true));
+
+        /** @var Visit $visit */
+        list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45');
+
+        $result = $visit->isVisitNew($visitor, $action);
+
+        $this->assertTrue($result);
+    }
+
+    public  function test_isVisitNew_ReturnsTrue_IfDimensionForcesVisit_AndVisitorKnown()
+    {
+        $this->setDimensionsWithOnNewVisit(array(false, false, true));
+
+        /** @var Visit $visit */
+        list($visit, $visitor, $action) = $this->makeVisitorAndAction($lastActionTime = '2012-01-02 08:08:34', $thisActionTime = '2012-01-02 08:12:45');
+
+        $result = $visit->isVisitNew($visitor, $action);
+
+        $this->assertTrue($result);
+    }
+
+    private function makeVisitorAndAction($lastActionTimestamp, $currentActionTime, $isVisitorKnown = false)
+    {
+        $idsite = API::getInstance()->addSite("name", "http://piwik.net/");
+
+        $request = new Request(array('idsite' => $idsite));
+        $request->setCurrentTimestamp(Date::factory($currentActionTime)->getTimestamp());
+
+        $visit = new Visit();
+        $visit->setRequest($request);
+
+        $visitor = new Visitor($request, 'configid', array('visit_last_action_time' => Date::factory($lastActionTimestamp)->getTimestamp()));
+        $visitor->setIsVisitorKnown($isVisitorKnown);
+
+        $action = new ActionPageview($request);
+
+        return array($visit, $visitor, $action);
+    }
+
+    private function setDimensionsWithOnNewVisit($dimensionOnNewVisitResults)
+    {
+        $dimensions = array();
+        foreach ($dimensionOnNewVisitResults as $onNewVisitResult) {
+            $dim = $this->getMock('Piwik\\Plugin\\Dimension', array('shouldForceNewVisit', 'getColumnName'));
+            $dim->expects($this->any())->method('shouldForceNewVisit')->will($this->returnValue($onNewVisitResult));
+            $dimensions[] = $dim;
+        }
+
+        $cache = new PluginAwareStaticCache('VisitDimensions');
+        $cache->set($dimensions);
+    }
 }
 
 class VisitExcluded_public extends VisitExcluded
diff --git a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getCampaigns_day.xml b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getCampaigns_day.xml
index 0ad33169a4c2aacfe167773bf48746439c210e12..8adb115a5f43e71ca56cbf229152d3e99763bec0 100644
--- a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getCampaigns_day.xml
+++ b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getCampaigns_day.xml
@@ -2,13 +2,13 @@
 <result>
 	<row>
 		<label>ga campaign</label>
-		<nb_uniq_visitors>3</nb_uniq_visitors>
-		<nb_visits>3</nb_visits>
-		<nb_actions>3</nb_actions>
+		<nb_uniq_visitors>4</nb_uniq_visitors>
+		<nb_visits>4</nb_visits>
+		<nb_actions>4</nb_actions>
 		<nb_users>0</nb_users>
 		<max_actions>1</max_actions>
 		<sum_visit_length>1084</sum_visit_length>
-		<bounce_count>3</bounce_count>
+		<bounce_count>4</bounce_count>
 		<goals>
 			<row idgoal='1'>
 				<nb_conversions>1</nb_conversions>
@@ -21,13 +21,13 @@
 		<subtable>
 			<row>
 				<label>piwik kwd</label>
-				<nb_uniq_visitors>1</nb_uniq_visitors>
-				<nb_visits>1</nb_visits>
-				<nb_actions>1</nb_actions>
+				<nb_uniq_visitors>2</nb_uniq_visitors>
+				<nb_visits>2</nb_visits>
+				<nb_actions>2</nb_actions>
 				<nb_users>0</nb_users>
 				<max_actions>1</max_actions>
 				<sum_visit_length>1084</sum_visit_length>
-				<bounce_count>1</bounce_count>
+				<bounce_count>2</bounce_count>
 				<goals>
 					<row idgoal='1'>
 						<nb_conversions>1</nb_conversions>
@@ -145,6 +145,46 @@
 			</row>
 		</subtable>
 	</row>
+	<row>
+		<label>credited to another goal</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>1</nb_visits>
+		<nb_actions>0</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>0</max_actions>
+		<sum_visit_length>3</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<goals>
+			<row idgoal='1'>
+				<nb_conversions>1</nb_conversions>
+				<nb_visits_converted>1</nb_visits_converted>
+				<revenue>24</revenue>
+			</row>
+		</goals>
+		<nb_conversions>1</nb_conversions>
+		<revenue>24</revenue>
+		<subtable>
+			<row>
+				<label>example.org</label>
+				<nb_uniq_visitors>1</nb_uniq_visitors>
+				<nb_visits>1</nb_visits>
+				<nb_actions>0</nb_actions>
+				<nb_users>0</nb_users>
+				<max_actions>0</max_actions>
+				<sum_visit_length>3</sum_visit_length>
+				<bounce_count>1</bounce_count>
+				<goals>
+					<row idgoal='1'>
+						<nb_conversions>1</nb_conversions>
+						<nb_visits_converted>1</nb_visits_converted>
+						<revenue>24</revenue>
+					</row>
+				</goals>
+				<nb_conversions>1</nb_conversions>
+				<revenue>24</revenue>
+			</row>
+		</subtable>
+	</row>
 	<row>
 		<label>credited to goal please</label>
 		<nb_uniq_visitors>1</nb_uniq_visitors>
diff --git a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getWebsites_day.xml b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getWebsites_day.xml
index c234bed59e963e268d7a9bc05348d941758c4aa9..51ea81cd04197e40d0b00ae795c116a69372a79b 100644
--- a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getWebsites_day.xml
+++ b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__Referrers.getWebsites_day.xml
@@ -1,2 +1,75 @@
 <?xml version="1.0" encoding="utf-8" ?>
-<result />
\ No newline at end of file
+<result>
+	<row>
+		<label>mutantregistration.com</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>1</nb_visits>
+		<nb_actions>1</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>1</max_actions>
+		<sum_visit_length>0</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>0</nb_visits_converted>
+		<subtable>
+			<row>
+				<label>http://mutantregistration.com</label>
+				<nb_uniq_visitors>1</nb_uniq_visitors>
+				<nb_visits>1</nb_visits>
+				<nb_actions>1</nb_actions>
+				<nb_users>0</nb_users>
+				<max_actions>1</max_actions>
+				<sum_visit_length>0</sum_visit_length>
+				<bounce_count>1</bounce_count>
+				<nb_visits_converted>0</nb_visits_converted>
+			</row>
+		</subtable>
+	</row>
+	<row>
+		<label>myotherreferrerwebsite.com</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>1</nb_visits>
+		<nb_actions>2</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>2</max_actions>
+		<sum_visit_length>361</sum_visit_length>
+		<bounce_count>0</bounce_count>
+		<nb_visits_converted>0</nb_visits_converted>
+		<subtable>
+			<row>
+				<label>http://myotherreferrerwebsite.com</label>
+				<nb_uniq_visitors>1</nb_uniq_visitors>
+				<nb_visits>1</nb_visits>
+				<nb_actions>2</nb_actions>
+				<nb_users>0</nb_users>
+				<max_actions>2</max_actions>
+				<sum_visit_length>361</sum_visit_length>
+				<bounce_count>0</bounce_count>
+				<nb_visits_converted>0</nb_visits_converted>
+			</row>
+		</subtable>
+	</row>
+	<row>
+		<label>myreferrerwebsite.com</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>1</nb_visits>
+		<nb_actions>1</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>1</max_actions>
+		<sum_visit_length>0</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>0</nb_visits_converted>
+		<subtable>
+			<row>
+				<label>http://myreferrerwebsite.com</label>
+				<nb_uniq_visitors>1</nb_uniq_visitors>
+				<nb_visits>1</nb_visits>
+				<nb_actions>1</nb_actions>
+				<nb_users>0</nb_users>
+				<max_actions>1</max_actions>
+				<sum_visit_length>0</sum_visit_length>
+				<bounce_count>1</bounce_count>
+				<nb_visits_converted>0</nb_visits_converted>
+			</row>
+		</subtable>
+	</row>
+</result>
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__VisitsSummary.get_day.xml b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__VisitsSummary.get_day.xml
index 78c6610886d659cb7416bef6861b095983ba9d45..3e911d8174b58d7f4e2499d4228941eb2bd478f8 100644
--- a/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__VisitsSummary.get_day.xml
+++ b/tests/PHPUnit/System/expected/test_PiwikTracker_trackForceUsingVisitId_insteadOfHeuristics_alsoTestsCampaignTracking__VisitsSummary.get_day.xml
@@ -2,13 +2,13 @@
 <result>
 	<nb_uniq_visitors>3</nb_uniq_visitors>
 	<nb_users>0</nb_users>
-	<nb_visits>8</nb_visits>
-	<nb_actions>7</nb_actions>
-	<nb_visits_converted>2</nb_visits_converted>
-	<bounce_count>8</bounce_count>
-	<sum_visit_length>1084</sum_visit_length>
-	<max_actions>1</max_actions>
-	<bounce_rate>100%</bounce_rate>
+	<nb_visits>15</nb_visits>
+	<nb_actions>14</nb_actions>
+	<nb_visits_converted>3</nb_visits_converted>
+	<bounce_count>14</bounce_count>
+	<sum_visit_length>1448</sum_visit_length>
+	<max_actions>2</max_actions>
+	<bounce_rate>93%</bounce_rate>
 	<nb_actions_per_visit>0.9</nb_actions_per_visit>
-	<avg_time_on_site>136</avg_time_on_site>
+	<avg_time_on_site>97</avg_time_on_site>
 </result>
\ No newline at end of file