diff --git a/core/Tracker/GoalManager.php b/core/Tracker/GoalManager.php
index 880e5c91b402538b344f88fbff1fd5d5557f89f0..3c9cd0bcf2b28d34952ed38ffb7856fbe938417c 100644
--- a/core/Tracker/GoalManager.php
+++ b/core/Tracker/GoalManager.php
@@ -206,10 +206,10 @@ class GoalManager
     public function recordGoals(VisitProperties $visitProperties, Request $request)
     {
         $visitorInformation = $visitProperties->getProperties();
-        $visitCustomVariables = $visitProperties->getRequestMetadata('CustomVariables', 'visitCustomVariables');
+        $visitCustomVariables = $request->getMetadata('CustomVariables', 'visitCustomVariables');
 
         /** @var Action $action */
-        $action = $visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $request->getMetadata('Actions', 'action');
 
         $goal = $this->getGoalFromVisitor($visitProperties, $request, $action);
 
@@ -232,7 +232,7 @@ class GoalManager
         }
 
         // some goals are converted, so must be ecommerce Order or Cart Update
-        $isRequestEcommerce = $visitProperties->getRequestMetadata('Ecommerce', 'isRequestEcommerce');
+        $isRequestEcommerce = $request->getMetadata('Ecommerce', 'isRequestEcommerce');
         if ($isRequestEcommerce) {
             $this->recordEcommerceGoal($visitProperties, $request, $goal, $action);
         } else {
@@ -268,14 +268,14 @@ class GoalManager
      */
     protected function recordEcommerceGoal(VisitProperties $visitProperties, Request $request, $conversion, $action)
     {
-        $isThereExistingCartInVisit = $visitProperties->getRequestMetadata('Goals', 'isThereExistingCartInVisit');
+        $isThereExistingCartInVisit = $request->getMetadata('Goals', 'isThereExistingCartInVisit');
         if ($isThereExistingCartInVisit) {
             Common::printDebug("There is an existing cart for this visit");
         }
 
-        $visitor = Visitor::makeFromVisitProperties($visitProperties);
+        $visitor = Visitor::makeFromVisitProperties($visitProperties, $request);
 
-        $isGoalAnOrder = $visitProperties->getRequestMetadata('Ecommerce', 'isGoalAnOrder');
+        $isGoalAnOrder = $request->getMetadata('Ecommerce', 'isGoalAnOrder');
         if ($isGoalAnOrder) {
             $debugMessage = 'The conversion is an Ecommerce order';
 
@@ -648,9 +648,9 @@ class GoalManager
      */
     protected function recordStandardGoals(VisitProperties $visitProperties, Request $request, $goal, $action)
     {
-        $visitor = Visitor::makeFromVisitProperties($visitProperties);
+        $visitor = Visitor::makeFromVisitProperties($visitProperties, $request);
 
-        $convertedGoals = $visitProperties->getRequestMetadata('Goals', 'goalsConverted') ?: array();
+        $convertedGoals = $request->getMetadata('Goals', 'goalsConverted') ?: array();
         foreach ($convertedGoals as $convertedGoal) {
             $this->currentGoal = $convertedGoal;
             Common::printDebug("- Goal " . $convertedGoal['idgoal'] . " matched. Recording...");
@@ -799,7 +799,7 @@ class GoalManager
 
         $visitDimensions = VisitDimension::getAllDimensions();
 
-        $visit = Visitor::makeFromVisitProperties($visitProperties);
+        $visit = Visitor::makeFromVisitProperties($visitProperties, $request);
         foreach ($visitDimensions as $dimension) {
             $value = $dimension->onAnyGoalConversion($request, $visit, $action);
             if (false !== $value) {
diff --git a/core/Tracker/Request.php b/core/Tracker/Request.php
index c37a9b7624f489054b544889041374d4ba9ce44f..ecc027bc74b85b4bcf71a00353edeaceb2c53774 100644
--- a/core/Tracker/Request.php
+++ b/core/Tracker/Request.php
@@ -43,6 +43,15 @@ class Request
 
     protected $tokenAuth;
 
+    /**
+     * Stores plugin specific tracking request metadata. RequestProcessors can store
+     * whatever they want in this array, and other RequestProcessors can modify these
+     * values to change tracker behavior.
+     *
+     * @var string[][]
+     */
+    private $requestMetadata = array();
+
     const UNKNOWN_RESOLUTION = 'unknown';
 
     const CUSTOM_TIMESTAMP_DOES_NOT_REQUIRE_TOKENAUTH_WHEN_NEWER_THAN = 14400; // 4 hours
@@ -762,4 +771,28 @@ class Request
 
         return $cip;
     }
+
+    /**
+     * Set a request metadata value.
+     *
+     * @param string $pluginName eg, `'Actions'`, `'Goals'`, `'YourPlugin'`
+     * @param string $key
+     * @param mixed $value
+     */
+    public function setMetadata($pluginName, $key, $value)
+    {
+        $this->requestMetadata[$pluginName][$key] = $value;
+    }
+
+    /**
+     * Get a request metadata value. Returns `null` if none exists.
+     *
+     * @param string $pluginName eg, `'Actions'`, `'Goals'`, `'YourPlugin'`
+     * @param string $key
+     * @return mixed
+     */
+    public function getMetadata($pluginName, $key)
+    {
+        return isset($this->requestMetadata[$pluginName][$key]) ? $this->requestMetadata[$pluginName][$key] : null;
+    }
 }
diff --git a/core/Tracker/RequestProcessor.php b/core/Tracker/RequestProcessor.php
index 072e9d76b52fff817d52e80c8a0b6c71e87f762b..e96ae36be668918e8d63f9afd4454c5c3ffe758d 100644
--- a/core/Tracker/RequestProcessor.php
+++ b/core/Tracker/RequestProcessor.php
@@ -24,7 +24,7 @@ use Piwik\Tracker\Visit\VisitProperties;
  *
  * Request metadata is shared between RequestProcessors, so RequestProcessors can tweak each others
  * behavior, and thus, the behavior of the Tracker. Request metadata can be set and get using the
- * {@link VisitProperties::setRequestMetadata()} and {@link VisitProperties::getRequestMetadata()}
+ * {@link Request::setMetadata()} and {@link Request::getMetadata()}
  * methods.
  *
  * Each RequestProcessor lists the request metadata it computes and exposes in its class
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index da1ef85862e7486a338f1e904bd36b32da20c8fa..915f3cf654015048facc63deaf59119e2ff8a91d 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -119,10 +119,10 @@ class Visit implements VisitInterface
             }
         }
 
-        $isNewVisit = $this->visitProperties->getRequestMetadata('CoreHome', 'isNewVisit');
+        $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
         if (!$isNewVisit) {
             $isNewVisit = $this->triggerPredicateHookOnDimensions($this->getAllVisitDimensions(), 'shouldForceNewVisit');
-            $this->visitProperties->setRequestMetadata('CoreHome', 'isNewVisit', $isNewVisit);
+            $this->request->setMetadata('CoreHome', 'isNewVisit', $isNewVisit);
         }
 
         foreach ($this->requestProcessors as $processor) {
@@ -135,7 +135,7 @@ class Visit implements VisitInterface
             }
         }
 
-        $isNewVisit = $this->visitProperties->getRequestMetadata('CoreHome', 'isNewVisit');
+        $isNewVisit = $this->request->getMetadata('CoreHome', 'isNewVisit');
 
         // Known visit when:
         // ( - the visitor has the Piwik cookie with the idcookie ID used by Piwik to match the visitor
@@ -146,9 +146,9 @@ class Visit implements VisitInterface
         // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit()
         if (!$isNewVisit) {
             try {
-                $this->handleExistingVisit($this->visitProperties->getRequestMetadata('Goals', 'visitIsConverted'));
+                $this->handleExistingVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
             } catch (VisitorNotFoundInDb $e) {
-                $this->visitProperties->setRequestMetadata('CoreHome', 'visitorNotFoundInDb', true); // TODO: perhaps we should just abort here?
+                $this->request->setMetadata('CoreHome', 'visitorNotFoundInDb', true); // TODO: perhaps we should just abort here?
             }
         }
 
@@ -157,7 +157,7 @@ class Visit implements VisitInterface
         // - 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 ($isNewVisit) {
-            $this->handleNewVisit($this->visitProperties->getRequestMetadata('Goals', 'visitIsConverted'));
+            $this->handleNewVisit($this->request->getMetadata('Goals', 'visitIsConverted'));
         }
 
         // update the cookie with the new visit information
@@ -298,7 +298,7 @@ class Visit implements VisitInterface
      */
     protected function getVisitorIdcookie()
     {
-        $isKnown = $this->visitProperties->getRequestMetadata('CoreHome', 'isVisitorKnown');
+        $isKnown = $this->request->getMetadata('CoreHome', 'isVisitorKnown');
         if ($isKnown) {
             return $this->visitProperties->getProperty('idvisitor');
         }
@@ -407,7 +407,7 @@ class Visit implements VisitInterface
     {
         $idVisitor = $this->getVisitorIdcookie();
         $visitorIp = $this->getVisitorIp();
-        $configId = $this->visitProperties->getRequestMetadata('CoreHome', 'visitorId');
+        $configId = $this->request->getMetadata('CoreHome', 'visitorId');
 
         $this->visitProperties->clearProperties();
 
@@ -453,7 +453,7 @@ class Visit implements VisitInterface
         $visitor = $this->makeVisitorFacade();
 
         /** @var Action $action */
-        $action = $this->visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $this->request->getMetadata('Actions', 'action');
 
         foreach ($dimensions as $dimension) {
             $value = $dimension->$hook($this->request, $visitor, $action);
@@ -482,7 +482,7 @@ class Visit implements VisitInterface
         $visitor = $this->makeVisitorFacade();
 
         /** @var Action $action */
-        $action = $this->visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $this->request->getMetadata('Actions', 'action');
 
         foreach ($dimensions as $dimension) {
             if ($dimension->$hook($this->request, $visitor, $action)) {
@@ -577,6 +577,6 @@ class Visit implements VisitInterface
 
     private function makeVisitorFacade()
     {
-        return Visitor::makeFromVisitProperties($this->visitProperties);
+        return Visitor::makeFromVisitProperties($this->visitProperties, $this->request);
     }
 }
diff --git a/core/Tracker/Visit/VisitProperties.php b/core/Tracker/Visit/VisitProperties.php
index 30b3168f4c0cbf0154d4a88f89cdd540742a00a1..567d9bd0f6726bad26e03eca17f342e1f0110313 100644
--- a/core/Tracker/Visit/VisitProperties.php
+++ b/core/Tracker/Visit/VisitProperties.php
@@ -21,39 +21,6 @@ class VisitProperties
      */
     private $visitInfo = array();
 
-    /**
-     * Stores plugin specific tracking request metadata. RequestProcessors can store
-     * whatever they want in this array, and other RequestProcessors can modify these
-     * values to change tracker behavior.
-     *
-     * @var string[][]
-     */
-    private $requestMetadata = array();
-
-    /**
-     * Set a request metadata value.
-     *
-     * @param string $pluginName eg, `'Actions'`, `'Goals'`, `'YourPlugin'`
-     * @param string $key
-     * @param mixed $value
-     */
-    public function setRequestMetadata($pluginName, $key, $value)
-    {
-        $this->requestMetadata[$pluginName][$key] = $value;
-    }
-
-    /**
-     * Get a request metadata value. Returns `null` if none exists.
-     *
-     * @param string $pluginName eg, `'Actions'`, `'Goals'`, `'YourPlugin'`
-     * @param string $key
-     * @return mixed
-     */
-    public function getRequestMetadata($pluginName, $key)
-    {
-        return @$this->requestMetadata[$pluginName][$key];
-    }
-
     /**
      * Returns a visit property, or `null` if none is set.
      *
diff --git a/core/Tracker/Visitor.php b/core/Tracker/Visitor.php
index 833e5c87edf6ea4dd364a481492ec6a3bfdf9d60..92036ff9745cdf4ca216a1f13471bdc751f33c37 100644
--- a/core/Tracker/Visitor.php
+++ b/core/Tracker/Visitor.php
@@ -24,9 +24,9 @@ class Visitor
         $this->setIsVisitorKnown($isVisitorKnown);
     }
 
-    public static function makeFromVisitProperties(VisitProperties $visitProperties)
+    public static function makeFromVisitProperties(VisitProperties $visitProperties, Request $request)
     {
-        $isKnown = $visitProperties->getRequestMetadata('CoreHome', 'isVisitorKnown');
+        $isKnown = $request->getMetadata('CoreHome', 'isVisitorKnown');
         return new Visitor($visitProperties, $isKnown);
     }
 
diff --git a/plugins/Actions/Tracker/ActionsRequestProcessor.php b/plugins/Actions/Tracker/ActionsRequestProcessor.php
index 7dfb696bad8dddfbf6810972345820783832b623..0117afa452ba78b5c62958a4ebce2c8b18338966 100644
--- a/plugins/Actions/Tracker/ActionsRequestProcessor.php
+++ b/plugins/Actions/Tracker/ActionsRequestProcessor.php
@@ -51,20 +51,20 @@ class ActionsRequestProcessor extends RequestProcessor
         $action = Action::factory($request);
         $action->writeDebugInfo();
 
-        $visitProperties->setRequestMetadata('Actions', 'action', $action);
+        $request->setMetadata('Actions', 'action', $action);
 
         // save the exit actions of the last action in this visit as the referrer actions for the action being tracked.
         // when the visit is updated, these columns will be changed, so we have to do this before recordLogs
-        $visitProperties->setRequestMetadata('Actions', 'idReferrerActionUrl',
+        $request->setMetadata('Actions', 'idReferrerActionUrl',
             $visitProperties->getProperty('visit_exit_idaction_url'));
-        $visitProperties->setRequestMetadata('Actions', 'idReferrerActionName',
+        $request->setMetadata('Actions', 'idReferrerActionName',
             $visitProperties->getProperty('visit_exit_idaction_name'));
     }
 
     public function afterRequestProcessed(VisitProperties $visitProperties, Request $request)
     {
         /** @var Action $action */
-        $action = $visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $request->getMetadata('Actions', 'action');
 
         if (!empty($action)) { // other plugins can unset the action if they want
             $action->loadIdsFromLogActionTable();
@@ -74,20 +74,20 @@ class ActionsRequestProcessor extends RequestProcessor
     public function recordLogs(VisitProperties $visitProperties, Request $request)
     {
         /** @var Action $action */
-        $action = $visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $request->getMetadata('Actions', 'action');
 
         if ($action !== null
-            && !$visitProperties->getRequestMetadata('CoreHome', 'visitorNotFoundInDb')
+            && !$request->getMetadata('CoreHome', 'visitorNotFoundInDb')
         ) {
             $idReferrerActionUrl = 0;
             $idReferrerActionName = 0;
 
-            if (!$visitProperties->getRequestMetadata('CoreHome', 'isNewVisit')) {
-                $idReferrerActionUrl = $visitProperties->getRequestMetadata('Actions', 'idReferrerActionUrl');
-                $idReferrerActionName = $visitProperties->getRequestMetadata('Actions', 'idReferrerActionName');
+            if (!$request->getMetadata('CoreHome', 'isNewVisit')) {
+                $idReferrerActionUrl = $request->getMetadata('Actions', 'idReferrerActionUrl');
+                $idReferrerActionName = $request->getMetadata('Actions', 'idReferrerActionName');
             }
 
-            $visitor = Visitor::makeFromVisitProperties($visitProperties);
+            $visitor = Visitor::makeFromVisitProperties($visitProperties, $request);
             $action->record($visitor, $idReferrerActionUrl, $idReferrerActionName);
         }
     }
diff --git a/plugins/CoreHome/Columns/VisitGoalBuyer.php b/plugins/CoreHome/Columns/VisitGoalBuyer.php
index 006c93a179a1d7f2b767f9e8cca3e730aa338da1..21c8b069632c837322ed5b74290f33a45adedf97 100644
--- a/plugins/CoreHome/Columns/VisitGoalBuyer.php
+++ b/plugins/CoreHome/Columns/VisitGoalBuyer.php
@@ -56,7 +56,7 @@ class VisitGoalBuyer extends VisitDimension
      */
     public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
-        return $this->getBuyerType($visitor);
+        return $this->getBuyerType($request);
     }
 
     /**
@@ -70,7 +70,7 @@ class VisitGoalBuyer extends VisitDimension
         $goalBuyer = $visitor->getVisitorColumn($this->columnName);
 
         // Ecommerce buyer status
-        $visitEcommerceStatus = $this->getBuyerType($visitor, $goalBuyer);
+        $visitEcommerceStatus = $this->getBuyerType($request, $goalBuyer);
 
         if ($visitEcommerceStatus != self::TYPE_BUYER_NONE
             // only update if the value has changed (prevents overwriting the value in case a request has
@@ -106,14 +106,14 @@ class VisitGoalBuyer extends VisitDimension
         return self::$visitEcommerceStatus[$id];
     }
 
-    private function getBuyerType(Visitor $visitor, $existingType = self::TYPE_BUYER_NONE)
+    private function getBuyerType(Request $request, $existingType = self::TYPE_BUYER_NONE)
     {
-        $isRequestEcommerce = $visitor->visitProperties->getRequestMetadata('Ecommerce', 'isRequestEcommerce');
+        $isRequestEcommerce = $request->getMetadata('Ecommerce', 'isRequestEcommerce');
         if (!$isRequestEcommerce) {
             return $existingType;
         }
 
-        $isGoalAnOrder = $visitor->visitProperties->getRequestMetadata('Ecommerce', 'isGoalAnOrder');
+        $isGoalAnOrder = $request->getMetadata('Ecommerce', 'isGoalAnOrder');
         if ($isGoalAnOrder) {
             return self::TYPE_BUYER_ORDERED;
         }
diff --git a/plugins/CoreHome/Tracker/VisitRequestProcessor.php b/plugins/CoreHome/Tracker/VisitRequestProcessor.php
index 7d963303cee2deaad61d9786f92dc620b819acd5..7fee641de0dfa846e06e6548a7850c9b2e67ec99 100644
--- a/plugins/CoreHome/Tracker/VisitRequestProcessor.php
+++ b/plugins/CoreHome/Tracker/VisitRequestProcessor.php
@@ -93,13 +93,13 @@ class VisitRequestProcessor extends RequestProcessor
 
         // visitor recognition
         $visitorId = $this->userSettings->getConfigId($request, $visitProperties->getProperty('location_ip'));
-        $visitProperties->setRequestMetadata('CoreHome', 'visitorId', $visitorId);
+        $request->setMetadata('CoreHome', 'visitorId', $visitorId);
 
         $isKnown = $this->visitorRecognizer->findKnownVisitor($visitorId, $visitProperties, $request);
-        $visitProperties->setRequestMetadata('CoreHome', 'isVisitorKnown', $isKnown);
+        $request->setMetadata('CoreHome', 'isVisitorKnown', $isKnown);
 
         $isNewVisit = $this->isVisitNew($visitProperties, $request);
-        $visitProperties->setRequestMetadata('CoreHome', 'isNewVisit', $isNewVisit);
+        $request->setMetadata('CoreHome', 'isNewVisit', $isNewVisit);
 
         return false;
     }
@@ -133,7 +133,7 @@ class VisitRequestProcessor extends RequestProcessor
      */
     public function isVisitNew(VisitProperties $visitProperties, Request $request)
     {
-        $isKnown = $visitProperties->getRequestMetadata('CoreHome', 'isVisitorKnown');
+        $isKnown = $request->getMetadata('CoreHome', 'isVisitorKnown');
         if (!$isKnown) {
             return true;
         }
diff --git a/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
index b4507eb74c229e187a4349f22bc66c72c4f0cd8a..02ae4c6d99aee2bef12d5ca2bba02a38a136df39 100644
--- a/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
+++ b/plugins/CoreHome/tests/Integration/Tracker/VisitRequestProcessorTest.php
@@ -96,11 +96,12 @@ class VisitRequestProcessorTest extends IntegrationTestCase
     {
         $idsite = API::getInstance()->addSite("name", "http://piwik.net/");
 
+        /** @var Request $request */
         list($visit, $request) = $this->prepareVisitWithRequest(array('idsite' => $idsite), $currentActionTime);
 
         $visitProperties = new VisitProperties();
         $visitProperties->setProperty('visit_last_action_time', Date::factory($lastActionTimestamp)->getTimestamp());
-        $visitProperties->setRequestMetadata('CoreHome', 'isVisitorKnown', $isVisitorKnown);
+        $request->setMetadata('CoreHome', 'isVisitorKnown', $isVisitorKnown);
 
         return array($visit, $visitProperties, $request);
     }
diff --git a/plugins/CustomVariables/Tracker/CustomVariablesRequestProcessor.php b/plugins/CustomVariables/Tracker/CustomVariablesRequestProcessor.php
index 86e656929b80d9114d6fa663f9c569298605469e..44e6d593504ba183293a9e167fe61351b828fc96 100644
--- a/plugins/CustomVariables/Tracker/CustomVariablesRequestProcessor.php
+++ b/plugins/CustomVariables/Tracker/CustomVariablesRequestProcessor.php
@@ -42,12 +42,12 @@ class CustomVariablesRequestProcessor extends RequestProcessor
             Common::printDebug($visitorCustomVariables);
         }
 
-        $visitProperties->setRequestMetadata('CustomVariables', 'visitCustomVariables', $visitorCustomVariables);
+        $request->setMetadata('CustomVariables', 'visitCustomVariables', $visitorCustomVariables);
     }
 
     public function onNewVisit(VisitProperties $visitProperties, Request $request)
     {
-        $visitCustomVariables = $visitProperties->getRequestMetadata('CustomVariables', 'visitCustomVariables');
+        $visitCustomVariables = $request->getMetadata('CustomVariables', 'visitCustomVariables');
 
         if (!empty($visitCustomVariables)) {
             $visitProperties->setProperties(array_merge($visitProperties->getProperties(), $visitCustomVariables));
@@ -56,7 +56,7 @@ class CustomVariablesRequestProcessor extends RequestProcessor
 
     public function onExistingVisit(&$valuesToUpdate, VisitProperties $visitProperties, Request $request)
     {
-        $visitCustomVariables = $visitProperties->getRequestMetadata('CustomVariables', 'visitCustomVariables');
+        $visitCustomVariables = $request->getMetadata('CustomVariables', 'visitCustomVariables');
 
         if (!empty($visitCustomVariables)) {
             $valuesToUpdate = array_merge($valuesToUpdate, $visitCustomVariables);
diff --git a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
index 1bdf430032ec8c01e26f0a939124143437ad13c1..cc474d8df3c981f296f0854d8d2164f1a3f5c0c3 100644
--- a/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
+++ b/plugins/Ecommerce/Tracker/EcommerceRequestProcessor.php
@@ -44,32 +44,32 @@ class EcommerceRequestProcessor extends RequestProcessor
     public function processRequestParams(VisitProperties $visitProperties, Request $request)
     {
         $isGoalAnOrder = $this->isRequestForAnOrder($request);
-        $visitProperties->setRequestMetadata('Ecommerce', 'isGoalAnOrder', $isGoalAnOrder);
+        $request->setMetadata('Ecommerce', 'isGoalAnOrder', $isGoalAnOrder);
 
         $isRequestEcommerce = $this->isRequestEcommerce($request);
-        $visitProperties->setRequestMetadata('Ecommerce', 'isRequestEcommerce', $isRequestEcommerce);
+        $request->setMetadata('Ecommerce', 'isRequestEcommerce', $isRequestEcommerce);
 
         if ($isRequestEcommerce) {
             // Mark the visit as Converted only if it is an order (not for a Cart update)
             $idGoal = GoalManager::IDGOAL_CART;
             if ($isGoalAnOrder) {
                 $idGoal = GoalManager::IDGOAL_ORDER;
-                $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', true);
+                $request->setMetadata('Goals', 'visitIsConverted', true);
             }
 
-            $visitProperties->setRequestMetadata('Goals', 'goalsConverted', array(array('idgoal' => $idGoal)));
+            $request->setMetadata('Goals', 'goalsConverted', array(array('idgoal' => $idGoal)));
 
-            $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when tracking ecommerce orders
+            $request->setMetadata('Actions', 'action', null); // don't track actions when tracking ecommerce orders
         }
     }
 
     public function afterRequestProcessed(VisitProperties $visitProperties, Request $request)
     {
-        $goalsConverted = $visitProperties->getRequestMetadata('Goals', 'goalsConverted');
+        $goalsConverted = $request->getMetadata('Goals', 'goalsConverted');
         if (!empty($goalsConverted)) {
             $isThereExistingCartInVisit = $this->goalManager->detectIsThereExistingCartInVisit(
                 $visitProperties->getProperties());
-            $visitProperties->setRequestMetadata('Goals', 'isThereExistingCartInVisit', $isThereExistingCartInVisit);
+            $request->setMetadata('Goals', 'isThereExistingCartInVisit', $isThereExistingCartInVisit);
         }
     }
 
diff --git a/plugins/Goals/Tracker/GoalsRequestProcessor.php b/plugins/Goals/Tracker/GoalsRequestProcessor.php
index 9d9e753921769e55550adb9e69d2ef642b8c8029..85b4e1c809c3b93ddbe12b44c4923b604e837682 100644
--- a/plugins/Goals/Tracker/GoalsRequestProcessor.php
+++ b/plugins/Goals/Tracker/GoalsRequestProcessor.php
@@ -59,12 +59,12 @@ class GoalsRequestProcessor extends RequestProcessor
             $goal = $this->goalManager->detectGoalId($request->getIdSite(), $request);
 
             $visitIsConverted = !empty($goal);
-            $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', $visitIsConverted);
+            $request->setMetadata('Goals', 'visitIsConverted', $visitIsConverted);
 
-            $existingConvertedGoals = $visitProperties->getRequestMetadata('Goals', 'goalsConverted') ?: array();
-            $visitProperties->setRequestMetadata('Goals', 'goalsConverted', array_merge($existingConvertedGoals, array($goal)));
+            $existingConvertedGoals = $request->getMetadata('Goals', 'goalsConverted') ?: array();
+            $request->setMetadata('Goals', 'goalsConverted', array_merge($existingConvertedGoals, array($goal)));
 
-            $visitProperties->setRequestMetadata('Actions', 'action', null); // don't track actions when doing manual goal conversions
+            $request->setMetadata('Actions', 'action', null); // don't track actions when doing manual goal conversions
 
             // if we find a idgoal in the URL, but then the goal is not valid, this is most likely a fake request
             if (!$visitIsConverted) {
@@ -79,10 +79,10 @@ class GoalsRequestProcessor extends RequestProcessor
 
     public function afterRequestProcessed(VisitProperties $visitProperties, Request $request)
     {
-        $goalsConverted = $visitProperties->getRequestMetadata('Goals', 'goalsConverted');
+        $goalsConverted = $request->getMetadata('Goals', 'goalsConverted');
 
         /** @var Action $action */
-        $action = $visitProperties->getRequestMetadata('Actions', 'action');
+        $action = $request->getMetadata('Actions', 'action');
 
         // if the visit hasn't already been converted another way (ie, manual goal conversion or ecommerce conversion,
         // try to convert based on the action)
@@ -91,11 +91,11 @@ class GoalsRequestProcessor extends RequestProcessor
         ) {
             $goalsConverted = $this->goalManager->detectGoalsMatchingUrl($request->getIdSite(), $action);
 
-            $existingGoalsConverted = $visitProperties->getRequestMetadata('Goals', 'goalsConverted') ?: array();
-            $visitProperties->setRequestMetadata('Goals', 'goalsConverted', array_merge($existingGoalsConverted, $goalsConverted));
+            $existingGoalsConverted = $request->getMetadata('Goals', 'goalsConverted') ?: array();
+            $request->setMetadata('Goals', 'goalsConverted', array_merge($existingGoalsConverted, $goalsConverted));
 
             if (!empty($goalsConverted)) {
-                $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', true);
+                $request->setMetadata('Goals', 'visitIsConverted', true);
             }
         }
 
@@ -106,15 +106,15 @@ class GoalsRequestProcessor extends RequestProcessor
         // - the exception is caught here and will result in a new visit incorrectly
         // In this case, we cancel the current conversion to be recorded:
         $isManualGoalConversion = $this->isManualGoalConversion($request);
-        $requestIsEcommerce = $visitProperties->getRequestMetadata('Goals', 'isRequestEcommerce');
-        $visitorNotFoundInDb = $visitProperties->getRequestMetadata('CoreHome', 'visitorNotFoundInDb');
+        $requestIsEcommerce = $request->getMetadata('Goals', 'isRequestEcommerce');
+        $visitorNotFoundInDb = $request->getMetadata('CoreHome', 'visitorNotFoundInDb');
 
         if ($visitorNotFoundInDb
             && ($isManualGoalConversion
                 || $requestIsEcommerce)
         ) {
-            $visitProperties->setRequestMetadata('Goals', 'goalsConverted', array());
-            $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false);
+            $request->setMetadata('Goals', 'goalsConverted', array());
+            $request->setMetadata('Goals', 'visitIsConverted', false);
         }
 
     }
@@ -122,7 +122,7 @@ class GoalsRequestProcessor extends RequestProcessor
     public function recordLogs(VisitProperties $visitProperties, Request $request)
     {
         // record the goals if there were conversions in this request (even if the visit itself was not converted)
-        $goalsConverted = $visitProperties->getRequestMetadata('Goals', 'goalsConverted');
+        $goalsConverted = $request->getMetadata('Goals', 'goalsConverted');
         if (!empty($goalsConverted)) {
             $this->goalManager->recordGoals($visitProperties, $request);
         }
diff --git a/plugins/Heartbeat/Tracker/PingRequestProcessor.php b/plugins/Heartbeat/Tracker/PingRequestProcessor.php
index 99c22bfc77756101962c34ea91a290c092838dc2..7f110b1d55b20437d222a0048e3c30f47be20cff 100644
--- a/plugins/Heartbeat/Tracker/PingRequestProcessor.php
+++ b/plugins/Heartbeat/Tracker/PingRequestProcessor.php
@@ -24,13 +24,13 @@ class PingRequestProcessor extends RequestProcessor
         if ($this->isPingRequest($request)) {
             // on a ping request that is received before the standard visit length, we just update the visit time w/o adding a new action
             Common::printDebug("-> ping=1 request: we do not track a new action nor a new visit nor any goal.");
-            $visitProperties->setRequestMetadata('Actions', 'action', null);
-            $visitProperties->setRequestMetadata('Goals', 'goalsConverted', array());
-            $visitProperties->setRequestMetadata('Goals', 'visitIsConverted', false);
+            $request->setMetadata('Actions', 'action', null);
+            $request->setMetadata('Goals', 'goalsConverted', array());
+            $request->setMetadata('Goals', 'visitIsConverted', false);
 
             // When a ping request is received more than 30 min after the last request/ping,
             // we choose not to create a new visit.
-            if ($visitProperties->getRequestMetadata('CoreHome', 'isNewVisit')) {
+            if ($request->getMetadata('CoreHome', 'isNewVisit')) {
                 Common::printDebug("-> ping=1 request: we do _not_ create a new visit.");
                 return true; // abort request
             }