diff --git a/core/Db/Schema/Mysql.php b/core/Db/Schema/Mysql.php
index 7d1645ca2fa1e3d9057bc173f1d97ce0df83b5dc..c3ce4307c102c11171535733410f43e6056db5b6 100644
--- a/core/Db/Schema/Mysql.php
+++ b/core/Db/Schema/Mysql.php
@@ -148,10 +148,6 @@ class Mysql implements SchemaInterface
 							  idvisit INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 							  idsite INTEGER(10) UNSIGNED NOT NULL,
 							  idvisitor BINARY(8) NOT NULL,
-							  visitor_returning TINYINT(1) NOT NULL,
-							  visit_total_time SMALLINT(5) UNSIGNED NOT NULL,
-							  visit_goal_converted TINYINT(1) NOT NULL,
-							  visit_goal_buyer TINYINT(1) NOT NULL,
 							  visit_last_action_time DATETIME NOT NULL,
 							  config_id BINARY(8) NOT NULL,
 							  config_pdf TINYINT(1) NOT NULL,
@@ -165,11 +161,6 @@ class Mysql implements SchemaInterface
 							  config_silverlight TINYINT(1) NOT NULL,
 							  config_cookie TINYINT(1) NOT NULL,
 							  location_ip VARBINARY(16) NOT NULL,
-							  location_country CHAR(3) NOT NULL,
-							  location_region char(2) DEFAULT NULL,
-							  location_city varchar(255) DEFAULT NULL,
-							  location_latitude float(10, 6) DEFAULT NULL,
-							  location_longitude float(10, 6) DEFAULT NULL,
 							  PRIMARY KEY(idvisit),
 							  INDEX index_idsite_config_datetime (idsite, config_id, visit_last_action_time),
 							  INDEX index_idsite_datetime (idsite, visit_last_action_time),
diff --git a/core/Plugin/ActionDimension.php b/core/Plugin/ActionDimension.php
index 9b871ef58c231d6fe38e41a17a34c78fc7ce928c..f42dfb0eb2ac155641d85382f6bfd8ba3148f4d7 100644
--- a/core/Plugin/ActionDimension.php
+++ b/core/Plugin/ActionDimension.php
@@ -15,6 +15,7 @@ use Piwik\Plugin\Manager as PluginManager;
 
 /**
  * @api
+ * @since 2.4.0
  */
 abstract class ActionDimension
 {
diff --git a/core/Plugin/Menu.php b/core/Plugin/Menu.php
index 72a7f675ddb17abb8a8672f2d52356fbcac52b14..e7caceb30778a0596e9ea8302bcb79643fa8c7e8 100644
--- a/core/Plugin/Menu.php
+++ b/core/Plugin/Menu.php
@@ -23,6 +23,7 @@ use Piwik\Menu\MenuUser;
  * For an example, see the {@link https://github.com/piwik/piwik/blob/master/plugins/ExampleUI/Menu.php} plugin.
  *
  * @api
+ * @since 2.4.0
  */
 class Menu
 {
diff --git a/core/Plugin/Report.php b/core/Plugin/Report.php
index c47f2ce5ec2471c62b79042829c95e2480e69e2b..2a38d27ef245c08f6eeda94da9cfa3cce352d2eb 100644
--- a/core/Plugin/Report.php
+++ b/core/Plugin/Report.php
@@ -17,6 +17,10 @@ use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
 use Piwik\WidgetsList;
 use Piwik\ViewDataTable\Factory as ViewDataTableFactory;
 
+/**
+ * @api
+ * @since 2.4.0
+ */
 class Report
 {
     protected $module;
@@ -28,6 +32,7 @@ class Report
     protected $widgetParams = array();
     protected $menuTitle;
     protected $processedMetrics = array();
+    protected $hasGoalMetrics = false;
     protected $metrics = array();
     protected $constantRowsCount = null;
     protected $isSubtableReport = null;
@@ -85,7 +90,7 @@ class Report
 
         $apiAction = $apiProxy->buildApiActionName($this->module, $this->action);
 
-        $view      = ViewDataTableFactory::build(null, $apiAction, 'CoreHome.renderWidget');
+        $view      = ViewDataTableFactory::build(null, $apiAction, 'CoreHome.renderMenuReport');
         $rendered  = $view->render();
 
         return $rendered;
@@ -115,7 +120,7 @@ class Report
         }
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         // TODO cache this
         $translations = Metrics::getDefaultMetricTranslations();
@@ -147,13 +152,18 @@ class Report
         return $documentation;
     }
 
+    public function hasGoalMetrics()
+    {
+        return $this->hasGoalMetrics;
+    }
+
     public function toArray()
     {
         $report = array(
-            'category' => Piwik::translate($this->category),
-            'name'     => $this->name,
-            'module'   => $this->module,
-            'action'   => $this->action
+            'category' => $this->getCategory(),
+            'name'     => $this->getName(),
+            'module'   => $this->getModule(),
+            'action'   => $this->getAction()
         );
 
         if (!empty($this->dimension)) {
@@ -185,6 +195,14 @@ class Report
         return $report;
     }
 
+    /**
+     * @return Report[]
+     */
+    public function getRelatedReports()
+    {
+        return array();
+    }
+
     public function getName()
     {
         return $this->name;
@@ -195,6 +213,16 @@ class Report
         return $this->action;
     }
 
+    public function getCategory()
+    {
+        return Piwik::translate($this->category);
+    }
+
+    public function getModule()
+    {
+        return $this->module;
+    }
+
     public static function factory($module, $action = '')
     {
         foreach (self::getAllReports() as $report) {
diff --git a/core/Plugin/Segment.php b/core/Plugin/Segment.php
index ea507f33afaea7a98463ad22dd3e7ed14f850331..d4135a7965ce7428c9743b0add050c6d1b6916fb 100644
--- a/core/Plugin/Segment.php
+++ b/core/Plugin/Segment.php
@@ -10,6 +10,7 @@ namespace Piwik\Plugin;
 
 /**
  * @api
+ * @since 2.4.0
  */
 class Segment
 {
@@ -39,7 +40,7 @@ class Segment
     /**
      * @param string $acceptValues
      */
-    public function setAcceptValues($acceptValues)
+    public function setAcceptedValues($acceptValues)
     {
         $this->acceptValues = $acceptValues;
     }
diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php
index 56304762c48f6d59cb46bb8e0cd36cb9f3d4ddbe..b72dd1aad36e637e853c5a86a0ce82fb0ecd116c 100644
--- a/core/Plugin/ViewDataTable.php
+++ b/core/Plugin/ViewDataTable.php
@@ -194,6 +194,22 @@ abstract class ViewDataTable implements ViewInterface
         $report = Report::factory($this->requestConfig->getApiModuleToRequest(), $this->requestConfig->getApiMethodToRequest());
 
         if (!empty($report)) {
+            $this->config->subtable_controller_action = 'renderWidget';
+            $relatedReports = $report->getRelatedReports();
+            if (!empty($relatedReports)) {
+                foreach ($relatedReports as $relatedReport) {
+                    $params = array('reportModule' => $relatedReport->getModule(), 'reportAction' => $relatedReport->getAction());
+                    $this->config->addRelatedReport('CoreHome.renderWidget',
+                                                    $relatedReport->getName(),
+                                                    $params);
+                }
+            }
+
+            $metrics = $report->getMetrics();
+            if (!empty($metrics)) {
+                $this->config->addTranslations($metrics);
+            }
+
             $report->configureView($this);
         }
 
diff --git a/core/Plugin/VisitDimension.php b/core/Plugin/VisitDimension.php
index def111f489ceab1d5fb2133a2099f98d0dd08b89..d8434f9ee97c8e119bdbbcc6448f19bf859be22c 100644
--- a/core/Plugin/VisitDimension.php
+++ b/core/Plugin/VisitDimension.php
@@ -15,6 +15,7 @@ use Piwik\Plugin\Manager as PluginManager;
 
 /**
  * @api
+ * @since 2.4.0
  */
 abstract class VisitDimension
 {
diff --git a/core/Settings/SystemSetting.php b/core/Settings/SystemSetting.php
index 8ca6a347cc8bf21cb40320550c020da6b61d687b..35878da8ed4ec1e1a7388de7400bf01dc8de6746 100644
--- a/core/Settings/SystemSetting.php
+++ b/core/Settings/SystemSetting.php
@@ -27,6 +27,7 @@ class SystemSetting extends Setting
      * readable by everyone.
      *
      * @var bool
+     * @since 2.4.0
      */
     public $readableByCurrentUser = false;
 
diff --git a/core/Tracker/Request.php b/core/Tracker/Request.php
index df551e7d82344366b599ec68c650b511276e47ef..0f62596b4061a61d93761ec26b4bea1643641b42 100644
--- a/core/Tracker/Request.php
+++ b/core/Tracker/Request.php
@@ -300,6 +300,11 @@ class Request
         return $value;
     }
 
+    public function getParams()
+    {
+        return $this->params;
+    }
+
     public function getCurrentTimestamp()
     {
         return $this->timestamp;
@@ -518,31 +523,6 @@ class Request
         return $this->forcedVisitorId;
     }
 
-    public function overrideLocation(&$visitorInfo)
-    {
-        if (!$this->isAuthenticated()) {
-            return;
-        }
-
-        // check for location override query parameters (ie, lat, long, country, region, city)
-        static $locationOverrideParams = array(
-            'country' => array('string', 'location_country'),
-            'region'  => array('string', 'location_region'),
-            'city'    => array('string', 'location_city'),
-            'lat'     => array('float', 'location_latitude'),
-            'long'    => array('float', 'location_longitude'),
-        );
-        foreach ($locationOverrideParams as $queryParamName => $info) {
-            list($type, $visitorInfoKey) = $info;
-
-            $value = Common::getRequestVar($queryParamName, false, $type, $this->params);
-            if (!empty($value)) {
-                $visitorInfo[$visitorInfoKey] = $value;
-            }
-        }
-        return;
-    }
-
     public function getPlugins()
     {
         static $pluginsInOrder = array('fla', 'java', 'dir', 'qt', 'realp', 'pdf', 'wma', 'gears', 'ag', 'cookie');
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index da374d4dabab697effcd17d857d8639618ce57ee..79cd857358f02786148f91f7ad1977f33ca7e054 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -49,7 +49,6 @@ class Visit implements VisitInterface
      */
     protected $userSettings;
     protected $visitorCustomVariables = array();
-    protected $visitorKnown;
 
     /**
      * @param Request $request
@@ -146,7 +145,6 @@ class Visit implements VisitInterface
         $visitor = new Visitor($this->request, $this->getSettingsObject(), $this->visitorInfo, $this->visitorCustomVariables);
         $visitor->recognize();
 
-        $this->visitorKnown = $visitor->isVisitorKnown();
         $this->visitorInfo = $visitor->getVisitorInfo();
 
         $isLastActionInTheSameVisit = $this->isLastActionInTheSameVisit();
@@ -161,13 +159,13 @@ class Visit implements VisitInterface
         // )
         // AND
         // - the last page view for this visitor was less than 30 minutes ago @see isLastActionInTheSameVisit()
-        if ($this->isVisitorKnown()
+        if ($visitor->isVisitorKnown()
             && $isLastActionInTheSameVisit
         ) {
             $idReferrerActionUrl = $this->visitorInfo['visit_exit_idaction_url'];
             $idReferrerActionName = $this->visitorInfo['visit_exit_idaction_name'];
             try {
-                $this->handleExistingVisit($action, $visitIsConverted);
+                $this->handleExistingVisit($visitor, $action, $visitIsConverted);
                 if (!is_null($action)) {
                     $action->record($this->visitorInfo['idvisit'],
                         $this->visitorInfo['idvisitor'],
@@ -191,7 +189,7 @@ class Visit implements VisitInterface
                 } // When the row wasn't found in the logs, and this is a pageview or
                 // goal matching URL, we force a new visitor
                 else {
-                    $this->visitorKnown = false;
+                    $visitor->setIsVisitorKonwn(false);
                 }
             }
         }
@@ -200,10 +198,10 @@ 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 (!$this->isVisitorKnown()
+        if (!$visitor->isVisitorKnown()
             || !$isLastActionInTheSameVisit
         ) {
-            $this->handleNewVisit($action, $visitIsConverted);
+            $this->handleNewVisit($visitor, $action, $visitIsConverted);
             if (!is_null($action)) {
                 $action->record($this->visitorInfo['idvisit'], $this->visitorInfo['idvisitor'], 0, 0, 0);
             }
@@ -231,20 +229,19 @@ class Visit implements VisitInterface
      * 1) Insert the new action
      * 2) Update the visit information
      *
+     * @param Visitor $visitor
      * @param Action $action
      * @param $visitIsConverted
      * @throws VisitorNotFoundInDb
      */
-    protected function handleExistingVisit($action, $visitIsConverted)
+    protected function handleExistingVisit($visitor, $action, $visitIsConverted)
     {
         Common::printDebug("Visit is known (IP = " . IP::N2P($this->getVisitorIp()) . ")");
 
-        $valuesToUpdate = $this->getExistingVisitFieldsToUpdate($action, $visitIsConverted);
+        $valuesToUpdate = $this->getExistingVisitFieldsToUpdate($visitor, $action, $visitIsConverted);
 
         $this->visitorInfo['time_spent_ref_action'] = $this->getTimeSpentReferrerAction();
 
-        $this->request->overrideLocation($valuesToUpdate);
-
         // update visitorInfo
         foreach ($valuesToUpdate AS $name => $value) {
             $this->visitorInfo[$name] = $value;
@@ -287,26 +284,26 @@ class Visit implements VisitInterface
      *
      * 2) Insert the visit information
      *
+     * @param Visitor $visitor
      * @param Action $action
      * @param bool $visitIsConverted
      */
-    protected function handleNewVisit($action, $visitIsConverted)
+    protected function handleNewVisit($visitor, $action, $visitIsConverted)
     {
         Common::printDebug("New Visit (IP = " . IP::N2P($this->getVisitorIp()) . ")");
 
-        $this->visitorInfo = $this->getNewVisitorInformation($action);
+        $idVisitor = $this->getVisitorIdcookie($visitor);
+        $this->visitorInfo = $this->getNewVisitorInformation($idVisitor);
 
         // Add Custom variable key,value to the visitor array
         $this->visitorInfo = array_merge($this->visitorInfo, $this->visitorCustomVariables);
 
-        $this->visitorInfo['visit_goal_converted'] = $visitIsConverted ? 1 : 0;
-
         $dimensions = VisitDimension::getAllDimensions();
-        foreach ($dimensions as $dimension) {
-            if (!method_exists($dimension, 'onNewVisit')) {
-                continue;
-            }
-            $this->visitorInfo[$dimension->getFieldName()] = $dimension->onNewVisit($this->request, $this->visitorInfo, $action);
+
+        $this->triggerHookOnDimensions($dimensions, 'onNewVisit', $visitor, $action);
+
+        if ($visitIsConverted) {
+            $this->triggerHookOnDimensions($dimensions, 'onConvertedVisit', $visitor, $action);
         }
 
         /**
@@ -321,7 +318,6 @@ class Visit implements VisitInterface
          */
         Piwik::postEvent('Tracker.newVisitorInformation', array(&$this->visitorInfo, $this->request));
 
-        $this->request->overrideLocation($this->visitorInfo);
         $this->printVisitorInformation();
 
         $idVisit = $this->insertNewVisit( $this->visitorInfo );
@@ -331,35 +327,24 @@ class Visit implements VisitInterface
         $this->visitorInfo['visit_last_action_time'] = $this->request->getCurrentTimestamp();
     }
 
-    static private function cleanupVisitTotalTime($t)
-    {
-        $t = (int)$t;
-        if ($t < 0) {
-            $t = 0;
-        }
-        $smallintMysqlLimit = 65534;
-        if ($t > $smallintMysqlLimit) {
-            $t = $smallintMysqlLimit;
-        }
-        return $t;
-    }
-
     /**
      *  Returns visitor cookie
      *
      * @return string  binary
      */
-    protected function getVisitorIdcookie()
+    protected function getVisitorIdcookie(Visitor $visitor)
     {
-        if ($this->isVisitorKnown()) {
+        if ($visitor->isVisitorKnown()) {
             return $this->visitorInfo['idvisitor'];
         }
+
         // If the visitor had a first party ID cookie, then we use this value
         if (!empty($this->visitorInfo['idvisitor'])
             && strlen($this->visitorInfo['idvisitor']) == Tracker::LENGTH_BINARY_ID
         ) {
             return $this->visitorInfo['idvisitor'];
         }
+
         return Common::hex2bin($this->generateUniqueVisitorId());
     }
 
@@ -406,15 +391,6 @@ class Visit implements VisitInterface
             > ($this->request->getCurrentTimestamp() - Config::getInstance()->Tracker['visit_standard_length']));
     }
 
-    /**
-     * Returns true if the recognizeTheVisitor() method did recognize the visitor
-     * @return bool
-     */
-    protected function isVisitorKnown()
-    {
-        return $this->visitorKnown === true;
-    }
-
     // is the referrer host any of the registered URLs for this website?
     static public function isHostKnownAliasHost($urlHost, $idSite)
     {
@@ -502,31 +478,12 @@ class Visit implements VisitInterface
         Common::printDebug($debugVisitInfo);
     }
 
-    protected function getNewVisitorInformation($action)
+    protected function getNewVisitorInformation($idVisitor)
     {
-        $visitCount = $this->request->getVisitCount();
-        $daysSinceLastVisit = $this->request->getDaysSinceLastVisit();
-
-        $daysSinceLastOrder = $this->request->getDaysSinceLastOrder();
-        $isReturningCustomer = ($daysSinceLastOrder !== false);
-
-        // User settings
-        $userInfo = $this->getSettingsObject();
-        $userInfo = $userInfo->getInfo();
-
-        $visitorReturning = $isReturningCustomer
-            ? 2 /* Returning customer */
-            : ($visitCount > 1 || $this->isVisitorKnown() || $daysSinceLastVisit > 0
-                ? 1 /* Returning */
-                : 0 /* New */);
-        $defaultTimeOnePageVisit = Config::getInstance()->Tracker['default_time_one_page_visit'];
+        $userInfo = $this->getSettingsObject()->getInfo();
 
         return array(
-            'idsite'                    => $this->request->getIdSite(),
-            'idvisitor'                 => $this->getVisitorIdcookie(),
-            'visitor_returning'         => $visitorReturning,
-            'visit_total_time'          => self::cleanupVisitTotalTime($defaultTimeOnePageVisit),
-            'visit_goal_buyer'          => $this->goalManager->getBuyerType(),
+            'idvisitor'                 => $idVisitor,
             'config_id'                 => $userInfo['config_id'],
             'config_pdf'                => $userInfo['config_pdf'],
             'config_flash'              => $userInfo['config_flash'],
@@ -545,59 +502,62 @@ class Visit implements VisitInterface
     /**
      * Gather fields=>values that needs to be updated for the existing visit in log_visit
      *
-     * @param $action
+     * @param Visitor $visitor
+     * @param Action|null $action
      * @param $visitIsConverted
      * @return array
      */
-    protected function getExistingVisitFieldsToUpdate($action, $visitIsConverted)
+    protected function getExistingVisitFieldsToUpdate($visitor, $action, $visitIsConverted)
     {
         $valuesToUpdate = array();
 
-        // Add 1 so it's always > 0
-        $visitTotalTime = 1 + $this->request->getCurrentTimestamp() - $this->visitorInfo['visit_first_action_time'];
-        $valuesToUpdate['visit_total_time'] = self::cleanupVisitTotalTime($visitTotalTime);
-
-        // Goal conversion
-        if ($visitIsConverted) {
-            $valuesToUpdate['visit_goal_converted'] = 1;
-            // If a pageview and goal conversion in the same second, with previously a goal conversion recorded
-            // the request would not "update" the row since all values are the same as previous
-            // therefore the request below throws exception, instead we make sure the UPDATE will affect the row
-            $valuesToUpdate['visit_total_time'] = self::cleanupVisitTotalTime(
-                $valuesToUpdate['visit_total_time']
-                + $this->goalManager->idGoal
-                // +2 to offset idgoal=-1 and idgoal=0
-                + 2);
-        }
-
         // Might update the idvisitor when it was forced or overwritten for this visit
         if (strlen($this->visitorInfo['idvisitor']) == Tracker::LENGTH_BINARY_ID) {
             $valuesToUpdate['idvisitor'] = $this->visitorInfo['idvisitor'];
         }
 
-        // Ecommerce buyer status
-        $visitEcommerceStatus = $this->goalManager->getBuyerType($this->visitorInfo['visit_goal_buyer']);
+        $dimensions = VisitDimension::getAllDimensions();
+        $valuesToUpdate = $this->triggerHookOnDimensions($dimensions, 'onExistingVisit', $visitor, $action, $valuesToUpdate);
 
-        if($visitEcommerceStatus != GoalManager::TYPE_BUYER_NONE
-            // only update if the value has changed (prevents overwriting the value in case a request has updated it in the meantime)
-            && $visitEcommerceStatus != $this->visitorInfo['visit_goal_buyer']) {
-            $valuesToUpdate['visit_goal_buyer'] = $visitEcommerceStatus;
+        if ($visitIsConverted) {
+            $valuesToUpdate = $this->triggerHookOnDimensions($dimensions, 'onConvertedVisit', $visitor, $action, $valuesToUpdate);
         }
 
-        $dimensions = VisitDimension::getAllDimensions();
+        // Custom Variables overwrite previous values on each page view
+        $valuesToUpdate = array_merge($valuesToUpdate, $this->visitorCustomVariables);
+        return $valuesToUpdate;
+    }
+
+    /**
+     * @param VisitDimension[] $dimensions
+     * @param string $hook
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @param array|null $valuesToUpdate If null, $this->visitorInfo will be updated
+     *
+     * @return array|null The updated $valuesToUpdate or null if no $valuesToUpdate given
+     */
+    private function triggerHookOnDimensions($dimensions, $hook, $visitor, $action, $valuesToUpdate = null)
+    {
         foreach ($dimensions as $dimension) {
-            if (!method_exists($dimension, 'onExistingVisit')) {
+            if (!method_exists($dimension, $hook)) {
                 continue;
             }
-            $value = $dimension->onExistingVisit($this->request, $this->visitorInfo, $action);
 
-            if (false !== $value) {
-                $valuesToUpdate[$dimension->getFieldName()] = $value;
+            $value = $dimension->$hook($this->request, $visitor, $action);
+
+            if ($value !== false) {
+                $fieldName = $dimension->getFieldName();
+                $visitor->setVisitorColumn($fieldName, $value);
+
+                if ($valuesToUpdate !== null) {
+                    $valuesToUpdate[$fieldName] = $value;
+                } else {
+                    $this->visitorInfo[$fieldName] = $value;
+                }
             }
         }
 
-        // Custom Variables overwrite previous values on each page view
-        $valuesToUpdate = array_merge($valuesToUpdate, $this->visitorCustomVariables);
         return $valuesToUpdate;
     }
 }
diff --git a/core/Tracker/Visitor.php b/core/Tracker/Visitor.php
index 19ac7171e46844423f8f5aede010b7f306ade92c..8839c30a5bd1ad8b21abe08db675d222d7e94f2c 100644
--- a/core/Tracker/Visitor.php
+++ b/core/Tracker/Visitor.php
@@ -10,13 +10,19 @@ namespace Piwik\Tracker;
 
 use Piwik\Common;
 use Piwik\Config;
+use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\CustomVariables\CustomVariables;
 use Piwik\Piwik;
 use Piwik\Tracker;
 
 class Visitor
 {
-    function __construct(Request $request, Tracker\Settings $settings, $visitorInfo = array(), $customVariables = null)
+    private $visitorKnown = false;
+    private $request;
+    private $visitorInfo;
+    private $userInfo;
+
+    public function __construct(Request $request, Tracker\Settings $settings, $visitorInfo = array(), $customVariables = null)
     {
         $this->request = $request;
         $this->visitorInfo = $visitorInfo;
@@ -31,9 +37,9 @@ class Visitor
      * - Known visitor
      * - New visitor
      */
-    function recognize()
+    public function recognize()
     {
-        $this->visitorKnown = false;
+        $this->setIsVisitorKonwn(false);
 
         $configId = $this->userInfo['config_id'];
 
@@ -58,12 +64,13 @@ class Visitor
         }
 
         $persistedVisitAttributes = self::getVisitFieldsPersist();
+        array_unshift($persistedVisitAttributes, 'visit_first_action_time');
+        array_unshift($persistedVisitAttributes, 'visit_last_action_time');
+        $persistedVisitAttributes = array_unique($persistedVisitAttributes);
 
         $selectFields = implode(", ", $persistedVisitAttributes);
 
         $select = "SELECT
-                        visit_last_action_time,
-                        visit_first_action_time,
                         $selectFields
                         $selectCustomVariables
         ";
@@ -155,14 +162,15 @@ class Visitor
             && $visitRow
             && count($visitRow) > 0
         ) {
-            // These values will be used throughout the request
-            $this->visitorInfo['visit_last_action_time'] = strtotime($visitRow['visit_last_action_time']);
-            $this->visitorInfo['visit_first_action_time'] = strtotime($visitRow['visit_first_action_time']);
 
+            // These values will be used throughout the request
             foreach($persistedVisitAttributes as $field) {
                 $this->visitorInfo[$field] = $visitRow[$field];
             }
 
+            $this->visitorInfo['visit_last_action_time'] = strtotime($visitRow['visit_last_action_time']);
+            $this->visitorInfo['visit_first_action_time'] = strtotime($visitRow['visit_first_action_time']);
+
             // Custom Variables copied from Visit in potential later conversion
             if (!empty($selectCustomVariables)) {
                 $maxCustomVariables = CustomVariables::getMaxCustomVariables();
@@ -180,7 +188,7 @@ class Visitor
                 }
             }
 
-            $this->visitorKnown = true;
+            $this->setIsVisitorKonwn(true);
             Common::printDebug("The visitor is known (idvisitor = " . bin2hex($this->visitorInfo['idvisitor']) . ",
                     config_id = " . bin2hex($configId) . ",
                     idvisit = {$this->visitorInfo['idvisit']},
@@ -248,7 +256,6 @@ class Visitor
             'visitor_days_since_first',
             'visitor_days_since_order',
             'visitor_count_visits',
-            'visit_goal_buyer',
 
             'location_country',
             'location_region',
@@ -261,36 +268,64 @@ class Visitor
             'referer_type',
         );
 
+        $dimensions = VisitDimension::getAllDimensions();
+        foreach ($dimensions as $dimension) {
+            if (method_exists($dimension, 'onExistingVisit')) {
+                $fields[] = $dimension->getFieldName();
+            }
+
+
+            /**
+             * This event collects a list of [visit entity]() properties that should be loaded when reading
+             * the existing visit. Properties that appear in this list will be available in other tracking
+             * events such as 'onExistingVisit'.
+             *
+             * Plugins can use this event to load additional visit entity properties for later use during tracking.
+             *
+             * This way all dimensions cannot only make sure the column values are loaded that they need, we can later
+             * even implement to resolve required dimensions before the defining dimension is resolved.
+             */
+            if (method_exists($dimension, 'getRequiredVisitFields')) {
+                foreach ($dimension->getRequiredVisitFields() as $field) {
+                    $fields[] = $field;
+                }
+            }
+        }
+
         /**
-         * Triggered when checking if the current action being tracked belongs to an existing visit.
-         *
-         * This event collects a list of [visit entity]() properties that should be loaded when reading
-         * the existing visit. Properties that appear in this list will be available in other tracking
-         * events such as {@hook Tracker.newConversionInformation} and {@hook Tracker.newVisitorInformation}.
-         *
-         * Plugins can use this event to load additional visit entity properties for later use during tracking.
-         * When you add fields to this $fields array, they will be later available in Tracker.newConversionInformation
-         *
-         * **Example**
-         *
-         *     Piwik::addAction('Tracker.getVisitFieldsToPersist', function (&$fields) {
-         *         $fields[] = 'custom_visit_property';
-         *     });
-         *
-         * @param array &$fields The list of visit properties to load.
+         * @ignore
          */
         Piwik::postEvent('Tracker.getVisitFieldsToPersist', array(&$fields));
 
         return $fields;
     }
 
-    function getVisitorInfo()
+    public function getVisitorInfo()
     {
         return $this->visitorInfo;
     }
 
-    function isVisitorKnown()
+    public function setVisitorColumn($column, $value)
+    {
+        $this->visitorInfo[$column] = $value;
+    }
+
+    public function getVisitorColumn($column)
+    {
+        if (array_key_exists($column, $this->visitorInfo)) {
+            return $this->visitorInfo[$column];
+        }
+
+        return false;
+    }
+
+    public function isVisitorKnown()
     {
         return $this->visitorKnown === true;
     }
+
+    public function setIsVisitorKonwn($isVisitorKnown)
+    {
+        return $this->visitorKnown = $isVisitorKnown;
+    }
 }
diff --git a/core/ViewDataTable/Factory.php b/core/ViewDataTable/Factory.php
index 3b53dd739ff77c2de36da1969be987aaee7d61e6..8c03a54a29904f8d6f2ee9a9e62481c680140ede 100644
--- a/core/ViewDataTable/Factory.php
+++ b/core/ViewDataTable/Factory.php
@@ -107,6 +107,7 @@ class Factory
             $params = array();
         } else {
             $login  = Piwik::getCurrentUserLogin();
+            // TODO this won't work as currently all reports use CoreHome.renderMenuReport
             $params = Manager::getViewDataTableParameters($login, $controllerAction);
         }
 
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 8af6471353dbbc3261be5719608cdcae0804b879..76a2e7a6008d10392dc139d6330dd0d9b1ba7c6a 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -180,58 +180,6 @@ class API extends \Piwik\Plugin\API
             'sqlFilterValue' => array('Piwik\IP', 'P2N'),
             'permission'     => $isAuthenticatedWithViewAccess,
         );
-        $segments[] = array(
-            'type'       => 'metric',
-            'category'   => Piwik::translate('General_Visit'),
-            'name'       => 'General_ColumnVisitDuration',
-            'segment'    => 'visitDuration',
-            'sqlSegment' => 'log_visit.visit_total_time',
-        );
-        $segments[] = array(
-            'type'           => 'dimension',
-            'category'       => Piwik::translate('General_Visit'),
-            'name'           => Piwik::translate('General_VisitType'),
-            'segment'        => 'visitorType',
-            'acceptedValues' => 'new, returning, returningCustomer' . ". " . Piwik::translate('General_VisitTypeExample', '"&segment=visitorType==returning,visitorType==returningCustomer"'),
-            'sqlSegment'     => 'log_visit.visitor_returning',
-            'sqlFilterValue' => function ($type) {
-                    return $type == "new" ? 0 : ($type == "returning" ? 1 : 2);
-                }
-        );
-        $segments[] = array(
-            'type'       => 'metric',
-            'category'   => Piwik::translate('General_Visit'),
-            'name'       => 'General_DaysSinceLastVisit',
-            'segment'    => 'daysSinceLastVisit',
-            'sqlSegment' => 'log_visit.visitor_days_since_last',
-        );
-        $segments[] = array(
-            'type'           => 'dimension',
-            'category'       => Piwik::translate('General_Visit'),
-            'name'           => 'General_VisitConvertedGoal',
-            'segment'        => 'visitConverted',
-            'acceptedValues' => '0, 1',
-            'sqlSegment'     => 'log_visit.visit_goal_converted',
-        );
-
-        $segments[] = array(
-            'type'           => 'dimension',
-            'category'       => Piwik::translate('General_Visit'),
-            'name'           => Piwik::translate('General_EcommerceVisitStatusDesc'),
-            'segment'        => 'visitEcommerceStatus',
-            'acceptedValues' => implode(", ", self::$visitEcommerceStatus)
-                . '. ' . Piwik::translate('General_EcommerceVisitStatusEg', '"&segment=visitEcommerceStatus==ordered,visitEcommerceStatus==orderedThenAbandonedCart"'),
-            'sqlSegment'     => 'log_visit.visit_goal_buyer',
-            'sqlFilterValue' => __NAMESPACE__ . '\API::getVisitEcommerceStatus',
-        );
-
-        $segments[] = array(
-            'type'       => 'metric',
-            'category'   => Piwik::translate('General_Visit'),
-            'name'       => 'General_DaysSinceLastEcommerceOrder',
-            'segment'    => 'daysSinceLastEcommerceOrder',
-            'sqlSegment' => 'log_visit.visitor_days_since_order',
-        );
 
         foreach ($segments as &$segment) {
             $segment['name'] = Piwik::translate($segment['name']);
@@ -248,36 +196,6 @@ class API extends \Piwik\Plugin\API
         return $segments;
     }
 
-    static protected $visitEcommerceStatus = array(
-        GoalManager::TYPE_BUYER_NONE                  => 'none',
-        GoalManager::TYPE_BUYER_ORDERED               => 'ordered',
-        GoalManager::TYPE_BUYER_OPEN_CART             => 'abandonedCart',
-        GoalManager::TYPE_BUYER_ORDERED_AND_OPEN_CART => 'orderedThenAbandonedCart',
-    );
-
-    /**
-     * @ignore
-     */
-    static public function getVisitEcommerceStatusFromId($id)
-    {
-        if (!isset(self::$visitEcommerceStatus[$id])) {
-            throw new \Exception("Unexpected ECommerce status value ");
-        }
-        return self::$visitEcommerceStatus[$id];
-    }
-
-    /**
-     * @ignore
-     */
-    static public function getVisitEcommerceStatus($status)
-    {
-        $id = array_search($status, self::$visitEcommerceStatus);
-        if ($id === false) {
-            throw new \Exception("Invalid 'visitEcommerceStatus' segment value $status");
-        }
-        return $id;
-    }
-
     private function sortSegments($row1, $row2)
     {
         $columns = array('type', 'category', 'name', 'segment');
diff --git a/plugins/Actions/Columns/EntryPageTitle.php b/plugins/Actions/Columns/EntryPageTitle.php
index 5664ea7c2170458e34dad1c53f606235c1aceed2..47045f13cfb3207bfa843994fa0960fcfb8e30c3 100644
--- a/plugins/Actions/Columns/EntryPageTitle.php
+++ b/plugins/Actions/Columns/EntryPageTitle.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\Actions\Segment;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class EntryPageTitle extends VisitDimension
 {
@@ -29,11 +30,11 @@ class EntryPageTitle extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $idActionName = false;
 
diff --git a/plugins/Actions/Columns/EntryPageUrl.php b/plugins/Actions/Columns/EntryPageUrl.php
index 760f4b635a9db1823f3c3112037493656504d996..5c89117df3b0f15ff99e83683c52cf70328b4aa3 100644
--- a/plugins/Actions/Columns/EntryPageUrl.php
+++ b/plugins/Actions/Columns/EntryPageUrl.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\Actions\Segment;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class EntryPageUrl extends VisitDimension
 {
@@ -29,11 +30,11 @@ class EntryPageUrl extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $idActionUrl = false;
 
diff --git a/plugins/Actions/Columns/ExitPageTitle.php b/plugins/Actions/Columns/ExitPageTitle.php
index 2f2054ac6084a386d848551f08f31fa13064d7c2..c606035fb3ba1b58b68bad839a0e4b8052817609 100644
--- a/plugins/Actions/Columns/ExitPageTitle.php
+++ b/plugins/Actions/Columns/ExitPageTitle.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\Actions\Segment;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class ExitPageTitle extends VisitDimension
 {
@@ -29,11 +30,11 @@ class ExitPageTitle extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int|bool
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $idActionName = false;
 
@@ -46,11 +47,11 @@ class ExitPageTitle extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int|bool
      */
-    public function onExistingVisit(Request $request, $visit, $action)
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
         if (empty($action)) {
             return false;
diff --git a/plugins/Actions/Columns/ExitPageUrl.php b/plugins/Actions/Columns/ExitPageUrl.php
index 82ad5c598aef7b27d845cc61ff5a1f13ef129978..b85e26ad5090dbacdd45b2fc74c7366e01382597 100644
--- a/plugins/Actions/Columns/ExitPageUrl.php
+++ b/plugins/Actions/Columns/ExitPageUrl.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\Actions\Segment;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class ExitPageUrl extends VisitDimension
 {
@@ -29,11 +30,11 @@ class ExitPageUrl extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int|bool
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $idActionUrl = false;
 
@@ -44,7 +45,13 @@ class ExitPageUrl extends VisitDimension
         return (int) $idActionUrl;
     }
 
-    public function onExistingVisit(Request $request, $visit, $action)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
         if (empty($action)) {
             return false;
diff --git a/plugins/Actions/Columns/PageUrl.php b/plugins/Actions/Columns/PageUrl.php
index 0d0d5504f461fd9af3410cca188db3541bf957e4..56d21e6ed1a2b2636ac87d204c011fe9c52e946e 100644
--- a/plugins/Actions/Columns/PageUrl.php
+++ b/plugins/Actions/Columns/PageUrl.php
@@ -22,7 +22,7 @@ class PageUrl extends ActionDimension
         $segment = new Segment();
         $segment->setSegment('pageUrl');
         $segment->setName('Actions_ColumnPageURL');
-        $segment->setAcceptValues('All these segments must be URL encoded, for example: ' . urlencode('http://example.com/path/page?query'));
+        $segment->setAcceptedValues('All these segments must be URL encoded, for example: ' . urlencode('http://example.com/path/page?query'));
         $this->addSegment($segment);
     }
 
@@ -30,15 +30,4 @@ class PageUrl extends ActionDimension
     {
         return Piwik::translate('Actions_ColumnPageURL');
     }
-
-    /*
-    public function shouldHandleAction(Request $request)
-    {
-        return true;
-    }
-
-    public function getActionId()
-    {
-        return 1;
-    }*/
 }
diff --git a/plugins/Actions/Columns/VisitTotalActions.php b/plugins/Actions/Columns/VisitTotalActions.php
index 49177a3143bc21aab81a35487a2da9ea9bdaacd0..5705d822f0b48412e57f00d55f0dfd0a35ab6466 100644
--- a/plugins/Actions/Columns/VisitTotalActions.php
+++ b/plugins/Actions/Columns/VisitTotalActions.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
 use Piwik\Tracker;
+use Piwik\Tracker\Visitor;
 
 class VisitTotalActions extends VisitDimension
 {
@@ -35,11 +36,11 @@ class VisitTotalActions extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $actionType = false;
         if ($action) {
@@ -64,11 +65,11 @@ class VisitTotalActions extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int
      */
-    public function onExistingVisit(Request $request, $visit, $action)
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
         if (!$action) {
             return false;
diff --git a/plugins/Actions/Columns/VisitTotalSearches.php b/plugins/Actions/Columns/VisitTotalSearches.php
index 42a9ac8b14f4e209fbb44eb3dee1654203143afa..ca09132bce03fb69ea7bf521c58d2926164cd3b0 100644
--- a/plugins/Actions/Columns/VisitTotalSearches.php
+++ b/plugins/Actions/Columns/VisitTotalSearches.php
@@ -13,6 +13,7 @@ use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
 use Piwik\Tracker;
+use Piwik\Tracker\Visitor;
 
 class VisitTotalSearches extends VisitDimension
 {
@@ -25,7 +26,7 @@ class VisitTotalSearches extends VisitDimension
         $segment->setType(Segment::TYPE_METRIC);
         $segment->setSegment('searches');
         $segment->setName('General_NbSearches');
-        $segment->setAcceptValues('To select all visits who used internal Site Search, use: &segment=searches>0');
+        $segment->setAcceptedValues('To select all visits who used internal Site Search, use: &segment=searches>0');
         $this->addSegment($segment);
     }
 
@@ -36,11 +37,11 @@ class VisitTotalSearches extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         if ($this->isSiteSearchAction($action)) {
             return 1;
@@ -51,11 +52,11 @@ class VisitTotalSearches extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int
      */
-    public function onExistingVisit(Request $request, $visit, $action)
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
         if ($this->isSiteSearchAction($action)) {
             return 'visit_total_searches + 1';
diff --git a/plugins/Actions/Reports/GetDownloads.php b/plugins/Actions/Reports/GetDownloads.php
index 1722142083d4ce2a7241cbb7e5e87e6ca9a655ec..099fcb271b0876f4217990a0853c3faa154cc9b9 100644
--- a/plugins/Actions/Reports/GetDownloads.php
+++ b/plugins/Actions/Reports/GetDownloads.php
@@ -30,7 +30,7 @@ class GetDownloads extends Base
         $this->widgetTitle  = 'General_Downloads';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_visits' => Piwik::translate('Actions_ColumnUniqueDownloads'),
@@ -48,11 +48,7 @@ class GetDownloads extends Base
 
     public function configureView(ViewDataTable $view)
     {
-        $view->config->addTranslations(array(
-            'label'     => $this->dimension->getName(),
-            'nb_visits' => Piwik::translate('Actions_ColumnUniqueDownloads'),
-            'nb_hits'   => Piwik::translate('General_Downloads'),
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->columns_to_display = array('label', 'nb_visits', 'nb_hits');
         $view->config->show_exclude_low_population = false;
diff --git a/plugins/Actions/Reports/GetEntryPageTitles.php b/plugins/Actions/Reports/GetEntryPageTitles.php
index a1af47c94dcfc069d8b00d612ca3edb889d1ac04..88778ebacf9e89f4268983c134d601c24e07b79b 100644
--- a/plugins/Actions/Reports/GetEntryPageTitles.php
+++ b/plugins/Actions/Reports/GetEntryPageTitles.php
@@ -10,11 +10,8 @@ namespace Piwik\Plugins\Actions\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\Actions\API;
-use Piwik\API\Request;
 use Piwik\Common;
 use Piwik\Plugins\Actions\Columns\EntryPageTitle;
-use Piwik\Plugins\Actions\Columns\PageTitle;
 
 class GetEntryPageTitles extends Base
 {
@@ -43,18 +40,7 @@ class GetEntryPageTitles extends Base
 
     public function configureView(ViewDataTable $view)
     {
-        $entryPageUrlAction =
-            Common::getRequestVar('widget', false) === false ? 'indexEntryPageUrls' : 'getEntryPageUrls';
-
-        $view->config->addTranslations(array(
-            'label'              => $this->dimension->getName(),
-            'entry_bounce_count' => Piwik::translate('General_ColumnBounces'),
-            'entry_nb_visits'    => Piwik::translate('General_ColumnEntrances'),
-        ));
-        $view->config->addRelatedReports(array(
-            'Actions.getPageTitles'       => Piwik::translate('Actions_SubmenuPageTitles'),
-            "Actions.$entryPageUrlAction" => Piwik::translate('Actions_SubmenuPagesEntry')
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate');
         $view->config->title = $this->name;
diff --git a/plugins/Actions/Reports/GetEntryPageUrls.php b/plugins/Actions/Reports/GetEntryPageUrls.php
index dc86ad7f965810920375a68455de6fd90c985602..659887b15d39ba235161a9d7bd14bb934ba37143 100644
--- a/plugins/Actions/Reports/GetEntryPageUrls.php
+++ b/plugins/Actions/Reports/GetEntryPageUrls.php
@@ -11,10 +11,8 @@ namespace Piwik\Plugins\Actions\Reports;
 use Piwik\Common;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\Actions\API;
 use Piwik\API\Request;
 use Piwik\Plugins\Actions\Columns\EntryPageUrl;
-use Piwik\Plugins\Actions\Columns\PageUrl;
 
 class GetEntryPageUrls extends Base
 {
@@ -54,14 +52,9 @@ class GetEntryPageUrls extends Base
             'action' => $widget === false ? 'indexEntryPageUrls' : 'getEntryPageUrls'
         ));
 
-        $view->config->addTranslations(array(
-            'label'              => $this->dimension->getName(),
-            'entry_bounce_count' => Piwik::translate('General_ColumnBounces'),
-            'entry_nb_visits'    => Piwik::translate('General_ColumnEntrances'))
-        );
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
-       // $view->config->title = $this->name;
-        $view->config->addRelatedReport('Actions.getEntryPageTitles', Piwik::translate('Actions_EntryPageTitles'));
+        $view->config->title = $this->name;
         $view->config->columns_to_display = array('label', 'entry_nb_visits', 'entry_bounce_count', 'bounce_rate');
         $view->requestConfig->filter_sort_column = 'entry_nb_visits';
         $view->requestConfig->filter_sort_order  = 'desc';
diff --git a/plugins/Actions/Reports/GetExitPageTitles.php b/plugins/Actions/Reports/GetExitPageTitles.php
index 2fd68fb0bd56373560563faebf21625ce58def91..7f33b57df293207989f062795e6b07d5f541f97c 100644
--- a/plugins/Actions/Reports/GetExitPageTitles.php
+++ b/plugins/Actions/Reports/GetExitPageTitles.php
@@ -35,7 +35,7 @@ class GetExitPageTitles extends Base
         $this->widgetTitle = 'Actions_WidgetExitPageTitles';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         $metrics = parent::getMetrics();
         $metrics['nb_visits'] = Piwik::translate('General_ColumnUniquePageviews');
@@ -53,17 +53,7 @@ class GetExitPageTitles extends Base
 
     public function configureView(ViewDataTable $view)
     {
-        $exitPageUrlAction =
-            Common::getRequestVar('widget', false) === false ? 'indexExitPageUrls' : 'getExitPageUrls';
-
-        $view->config->addTranslations(array(
-            'label'          => $this->dimension->getName(),
-            'exit_nb_visits' => Piwik::translate('General_ColumnExits'),
-        ));
-        $view->config->addRelatedReports(array(
-            'Actions.getPageTitles'      => Piwik::translate('Actions_SubmenuPageTitles'),
-            "Actions.$exitPageUrlAction" => Piwik::translate('Actions_SubmenuPagesExit'),
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->title = $this->name;
         $view->config->columns_to_display = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate');
@@ -75,7 +65,6 @@ class GetExitPageTitles extends Base
     public function getRelatedReports()
     {
         return array(
-            new GetPageTitles(),
             new GetExitPageUrls()
         );
     }
diff --git a/plugins/Actions/Reports/GetExitPageUrls.php b/plugins/Actions/Reports/GetExitPageUrls.php
index 61ffc1c82ad1ee4171a75fed7bd29a4329ca45d2..c9b99f114c74432a376bc23a2aed5ddc0c21c923 100644
--- a/plugins/Actions/Reports/GetExitPageUrls.php
+++ b/plugins/Actions/Reports/GetExitPageUrls.php
@@ -36,8 +36,7 @@ class GetExitPageUrls extends Base
         $this->widgetTitle = 'Actions_WidgetPagesExit';
     }
 
-
-    protected function getMetrics()
+    public function getMetrics()
     {
         $metrics = parent::getMetrics();
         $metrics['nb_visits'] = Piwik::translate('General_ColumnUniquePageviews');
@@ -63,13 +62,9 @@ class GetExitPageUrls extends Base
             'action' => $widget === false ? 'indexExitPageUrls' : 'getExitPageUrls'
         ));
 
-        $view->config->addTranslations(array(
-            'label'          => $this->dimension->getName(),
-            'exit_nb_visits' => Piwik::translate('General_ColumnExits'))
-        );
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->title = $this->name;
-        $view->config->addRelatedReport('Actions.getExitPageTitles', Piwik::translate('Actions_ExitPageTitles'));
 
         $view->config->columns_to_display        = array('label', 'exit_nb_visits', 'nb_visits', 'exit_rate');
         $view->requestConfig->filter_sort_column = 'exit_nb_visits';
diff --git a/plugins/Actions/Reports/GetOutlinks.php b/plugins/Actions/Reports/GetOutlinks.php
index e7abcd4f522ed932a90cac4fb9b0a90849264a70..e8e296e2dbd06372792e7eba788427f8afd3a655 100644
--- a/plugins/Actions/Reports/GetOutlinks.php
+++ b/plugins/Actions/Reports/GetOutlinks.php
@@ -37,7 +37,7 @@ class GetOutlinks extends Base
         $this->widgetTitle = 'General_Outlinks';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicks'),
@@ -55,11 +55,7 @@ class GetOutlinks extends Base
 
     public function configureView(ViewDataTable $view)
     {
-        $view->config->addTranslations(array(
-            'label'     => $this->dimension->getName(),
-            'nb_visits' => Piwik::translate('Actions_ColumnUniqueClicks'),
-            'nb_hits'   => Piwik::translate('Actions_ColumnClicks'),
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->columns_to_display          = array('label', 'nb_visits', 'nb_hits');
         $view->config->show_exclude_low_population = false;
diff --git a/plugins/Actions/Reports/GetPageTitles.php b/plugins/Actions/Reports/GetPageTitles.php
index 56c75ceac2875be2e57f347acb7e29b84aa1174f..7a64a2661ea42b28478f0fadb50e4a8fa031b847 100644
--- a/plugins/Actions/Reports/GetPageTitles.php
+++ b/plugins/Actions/Reports/GetPageTitles.php
@@ -35,7 +35,7 @@ class GetPageTitles extends Base
         $this->widgetTitle = 'Actions_WidgetPageTitles';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         $metrics = parent::getMetrics();
         $metrics['nb_visits'] = Piwik::translate('General_ColumnUniquePageviews');
@@ -58,19 +58,15 @@ class GetPageTitles extends Base
         $widget = Common::getRequestVar('widget', false);
 
         $view->config->self_url = Request::getCurrentUrlWithoutGenericFilters(array(
-            'module' => 'Actions',
+            'module' => $this->module,
             'action' => $widget === false ? 'indexPageTitles' : 'getPageTitles'
         ));
 
         $view->config->title = $this->name;
-        $view->config->addRelatedReports(array(
-            'Actions.getEntryPageTitles' => Piwik::translate('Actions_EntryPageTitles'),
-            'Actions.getExitPageTitles'  => Piwik::translate('Actions_ExitPageTitles'),
-        ));
 
         $view->config->addTranslation('label', $this->dimension->getName());
         $view->config->columns_to_display = array('label', 'nb_hits', 'nb_visits', 'bounce_rate',
-            'avg_time_on_page', 'exit_rate', 'avg_time_generation');
+                                                  'avg_time_on_page', 'exit_rate', 'avg_time_generation');
 
         $this->addPageDisplayProperties($view);
         $this->addBaseDisplayProperties($view);
diff --git a/plugins/Actions/Reports/GetPageTitlesFollowingSiteSearch.php b/plugins/Actions/Reports/GetPageTitlesFollowingSiteSearch.php
index e69d558fc0e21ac3ad82f5475701e961f0595e2e..be069179c1ee67abb4dc15a3ceb6b327583007ae 100644
--- a/plugins/Actions/Reports/GetPageTitlesFollowingSiteSearch.php
+++ b/plugins/Actions/Reports/GetPageTitlesFollowingSiteSearch.php
@@ -32,7 +32,7 @@ class GetPageTitlesFollowingSiteSearch extends SiteSearchBase
         $this->configureViewForUrlAndTitle($view, $title);
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_hits_following_search' => Piwik::translate('General_ColumnViewedAfterSearch'),
@@ -50,17 +50,7 @@ class GetPageTitlesFollowingSiteSearch extends SiteSearchBase
 
     protected function configureViewForUrlAndTitle(ViewDataTable $view, $title)
     {
-        $relatedReports = array(
-            'Actions.getPageTitlesFollowingSiteSearch' => Piwik::translate('Actions_WidgetPageTitlesFollowingSearch'),
-            'Actions.getPageUrlsFollowingSiteSearch'   => Piwik::translate('Actions_WidgetPageUrlsFollowingSearch'),
-        );
-
-        $view->config->addRelatedReports($relatedReports);
-        $view->config->addTranslations(array(
-            'label'                    => $this->dimension->getName(),
-            'nb_hits_following_search' => Piwik::translate('General_ColumnViewedAfterSearch'),
-            'nb_hits'                  => Piwik::translate('General_ColumnTotalPageviews')
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->title = $title;
         $view->config->columns_to_display          = array('label', 'nb_hits_following_search', 'nb_hits');
@@ -72,4 +62,10 @@ class GetPageTitlesFollowingSiteSearch extends SiteSearchBase
         $this->addBaseDisplayProperties($view);
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetPageUrlsFollowingSiteSearch()
+        );
+    }
 }
diff --git a/plugins/Actions/Reports/GetPageUrls.php b/plugins/Actions/Reports/GetPageUrls.php
index f8fbd9afd6f910ceba9cf6db1fd94f70d63e72b5..c8805fe408bdf66cfe8ea56c759de37717196a60 100644
--- a/plugins/Actions/Reports/GetPageUrls.php
+++ b/plugins/Actions/Reports/GetPageUrls.php
@@ -34,7 +34,7 @@ class GetPageUrls extends Base
         $this->widgetTitle = 'General_Pages';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         $metrics = parent::getMetrics();
         $metrics['nb_visits'] = Piwik::translate('General_ColumnUniquePageviews');
diff --git a/plugins/Actions/Reports/GetPageUrlsFollowingSiteSearch.php b/plugins/Actions/Reports/GetPageUrlsFollowingSiteSearch.php
index d41380d78892c131cf00ab358dba56c75b2b1389..1891b92978658306319e8478092f9d7366df84de 100644
--- a/plugins/Actions/Reports/GetPageUrlsFollowingSiteSearch.php
+++ b/plugins/Actions/Reports/GetPageUrlsFollowingSiteSearch.php
@@ -30,4 +30,11 @@ class GetPageUrlsFollowingSiteSearch extends GetPageTitlesFollowingSiteSearch
 
         $this->configureViewForUrlAndTitle($view, $title);
     }
+
+    public function getRelatedReports()
+    {
+        return array(
+            new GetPageTitlesFollowingSiteSearch()
+        );
+    }
 }
diff --git a/plugins/Actions/Reports/GetSiteSearchCategories.php b/plugins/Actions/Reports/GetSiteSearchCategories.php
index 404457b5057d0e8f3ecc2c1c2b755d03bdf7abae..35e7421feb2683f1794c3111be8c4e9cbc5863e9 100644
--- a/plugins/Actions/Reports/GetSiteSearchCategories.php
+++ b/plugins/Actions/Reports/GetSiteSearchCategories.php
@@ -32,7 +32,7 @@ class GetSiteSearchCategories extends SiteSearchBase
         return parent::isEnabled() && Actions::isCustomVariablesPluginsEnabled();
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_visits'           => Piwik::translate('Actions_ColumnSearches'),
@@ -52,11 +52,7 @@ class GetSiteSearchCategories extends SiteSearchBase
 
     public function configureView(ViewDataTable $view)
     {
-        $view->config->addTranslations(array(
-            'label'               => $this->dimension->getName(),
-            'nb_visits'           => Piwik::translate('Actions_ColumnSearches'),
-            'nb_pages_per_search' => Piwik::translate('Actions_ColumnPagesPerSearch')
-        ));
+        $view->config->addTranslations(array('label' => $this->dimension->getName()));
 
         $view->config->columns_to_display     = array('label', 'nb_visits', 'nb_pages_per_search');
         $view->config->show_table_all_columns = false;
diff --git a/plugins/Actions/Reports/GetSiteSearchKeywords.php b/plugins/Actions/Reports/GetSiteSearchKeywords.php
index a3fa93dc1dff84dc8032abda078145adac3b305b..d1941c726a4180ada7f79d1acad91468c7d75866 100644
--- a/plugins/Actions/Reports/GetSiteSearchKeywords.php
+++ b/plugins/Actions/Reports/GetSiteSearchKeywords.php
@@ -26,7 +26,7 @@ class GetSiteSearchKeywords extends SiteSearchBase
         $this->widgetTitle  = 'Actions_WidgetSearchKeywords';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_visits'           => Piwik::translate('Actions_ColumnSearches'),
diff --git a/plugins/Actions/Reports/GetSiteSearchNoResultKeywords.php b/plugins/Actions/Reports/GetSiteSearchNoResultKeywords.php
index df867917031a70b46c61c098422d063694568cd4..ee5a9968405541d59b44eed375d2686b1c3ba9e6 100644
--- a/plugins/Actions/Reports/GetSiteSearchNoResultKeywords.php
+++ b/plugins/Actions/Reports/GetSiteSearchNoResultKeywords.php
@@ -25,7 +25,7 @@ class GetSiteSearchNoResultKeywords extends SiteSearchBase
         $this->widgetTitle  = 'Actions_WidgetSearchNoResultKeywords';
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         return array(
             'nb_visits' => Piwik::translate('Actions_ColumnSearches'),
diff --git a/plugins/CoreHome/Columns/IdSite.php b/plugins/CoreHome/Columns/IdSite.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c29df898b0c8009395679a0bab21f9ecf8b4490
--- /dev/null
+++ b/plugins/CoreHome/Columns/IdSite.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker;
+use Piwik\Tracker\Visitor;
+
+class IdSite extends VisitDimension
+{
+    protected $fieldName = 'idsite';
+    // we do not install or define column definition here as we need to create this column when installing as there is
+    // an index on it. Currently we do not define the index here... although we could overwrite the install() method
+    // and add column 'idsite' and add index. Problem is there is also an index
+    // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at
+    // installing point (we do not know whether visit_last_action_time or idsite column would be added first).
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $request->getIdSite();
+    }
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitFirstActionTime.php b/plugins/CoreHome/Columns/VisitFirstActionTime.php
index e0b7078fb8faa94bf43687d591e811004a238933..15a8e70043ff71d40b7e69ec14f18b1cfcd917e6 100644
--- a/plugins/CoreHome/Columns/VisitFirstActionTime.php
+++ b/plugins/CoreHome/Columns/VisitFirstActionTime.php
@@ -12,6 +12,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
 use Piwik\Tracker;
+use Piwik\Tracker\Visitor;
 
 class VisitFirstActionTime extends VisitDimension
 {
@@ -25,11 +26,11 @@ class VisitFirstActionTime extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp());
     }
diff --git a/plugins/CoreHome/Columns/VisitGoalBuyer.php b/plugins/CoreHome/Columns/VisitGoalBuyer.php
new file mode 100644
index 0000000000000000000000000000000000000000..64ca106962bd0d37c65bfcdd8f9c2ac6607ef727
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitGoalBuyer.php
@@ -0,0 +1,106 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Piwik;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\GoalManager;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+
+class VisitGoalBuyer extends VisitDimension
+{
+    static protected $visitEcommerceStatus = array(
+        GoalManager::TYPE_BUYER_NONE                  => 'none',
+        GoalManager::TYPE_BUYER_ORDERED               => 'ordered',
+        GoalManager::TYPE_BUYER_OPEN_CART             => 'abandonedCart',
+        GoalManager::TYPE_BUYER_ORDERED_AND_OPEN_CART => 'orderedThenAbandonedCart',
+    );
+
+    protected $fieldName = 'visit_goal_buyer';
+    protected $fieldType = 'TINYINT(1) NOT NULL';
+
+    protected function init()
+    {
+        $example = Piwik::translate('General_EcommerceVisitStatusEg', '"&segment=visitEcommerceStatus==ordered,visitEcommerceStatus==orderedThenAbandonedCart"');
+        $acceptedValues = implode(", ", self::$visitEcommerceStatus) . '. ' . $example;
+
+        $segment = new Segment();
+        $segment->setSegment('visitEcommerceStatus');
+        $segment->setName('General_EcommerceVisitStatusDesc');
+        $segment->setAcceptedValues($acceptedValues);
+        $segment->setSqlFilterValue(__NAMESPACE__ . '\VisitGoalBuyer::getVisitEcommerceStatus');
+
+        $this->addSegment($segment);
+    }
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $goalManager = new GoalManager($request);
+
+        return $goalManager->getBuyerType();
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        $goalBuyer = $visitor->getVisitorColumn('visit_goal_buyer');
+
+        // Ecommerce buyer status
+        $goalManager          = new GoalManager($request);
+        $visitEcommerceStatus = $goalManager->getBuyerType($goalBuyer);
+
+        if($visitEcommerceStatus != GoalManager::TYPE_BUYER_NONE
+            // only update if the value has changed (prevents overwriting the value in case a request has updated it in the meantime)
+            && $visitEcommerceStatus != $goalBuyer) {
+            return $visitEcommerceStatus;
+        }
+
+        return false;
+    }
+
+    static public function getVisitEcommerceStatus($status)
+    {
+        $id = array_search($status, self::$visitEcommerceStatus);
+        if ($id === false) {
+            throw new \Exception("Invalid 'visitEcommerceStatus' segment value $status");
+        }
+        return $id;
+    }
+
+    /**
+     * @ignore
+     */
+    static public function getVisitEcommerceStatusFromId($id)
+    {
+        if (!isset(self::$visitEcommerceStatus[$id])) {
+            throw new \Exception("Unexpected ECommerce status value ");
+        }
+        return self::$visitEcommerceStatus[$id];
+    }
+
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitGoalConverted.php b/plugins/CoreHome/Columns/VisitGoalConverted.php
new file mode 100644
index 0000000000000000000000000000000000000000..0e4fc72caa6e2369edc5fcf8a9fc23e80dcffe41
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitGoalConverted.php
@@ -0,0 +1,57 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+
+class VisitGoalConverted extends VisitDimension
+{
+    protected $fieldName = 'visit_goal_converted';
+    protected $fieldType = 'TINYINT(1) NOT NULL';
+
+    protected function init()
+    {
+        $segment = new Segment();
+        $segment->setSegment('visitConverted');
+        $segment->setName('General_VisitConvertedGoal');
+        $segment->setAcceptedValues('0, 1');
+        $this->addSegment($segment);
+    }
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        return 0;
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onConvertedVisit(Request $request, Visitor $visitor, $action)
+    {
+        return 1;
+    }
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitLastActionTime.php b/plugins/CoreHome/Columns/VisitLastActionTime.php
index 5c45cb31a556f0077601030bbd34066b57529b67..9bf5990687017646d9d217eaf8e9ce86c77f83bf 100644
--- a/plugins/CoreHome/Columns/VisitLastActionTime.php
+++ b/plugins/CoreHome/Columns/VisitLastActionTime.php
@@ -12,6 +12,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
 use Piwik\Tracker;
+use Piwik\Tracker\Visitor;
 
 class VisitLastActionTime extends VisitDimension
 {
@@ -19,9 +20,8 @@ class VisitLastActionTime extends VisitDimension
     // we do not install or define column definition here as we need to create this column when installing as there is
     // an index on it. Currently we do not define the index here... although we could overwrite the install() method
     // and add column 'visit_last_action_time' and add index. Problem is there is also an index
-    // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether config_id already exists at
-    // installing point (in case config_id is installed via dimension as well we do not know which column will be added
-    // first).
+    // INDEX(idsite, config_id, visit_last_action_time) and we maybe not be sure whether idsite already exists at
+    // installing point (we do not know whether idsite column will be added first).
 
     public function getName()
     {
@@ -30,24 +30,24 @@ class VisitLastActionTime extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return Tracker::getDatetimeFromTimestamp($request->getCurrentTimestamp());
     }
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onExistingVisit(Request $request, $visit, $action)
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
-        return $this->onNewVisit($request, $visit, $action);
+        return $this->onNewVisit($request, $visitor, $action);
     }
 
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitTotalTime.php b/plugins/CoreHome/Columns/VisitTotalTime.php
new file mode 100644
index 0000000000000000000000000000000000000000..02e7a6c5470120e6fe489202cb7666ed40af4bbc
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitTotalTime.php
@@ -0,0 +1,120 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Config;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\GoalManager;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+
+class VisitTotalTime extends VisitDimension
+{
+    protected $fieldName = 'visit_total_time';
+    protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
+
+    private $isExistingVisit = false;
+
+    protected function init()
+    {
+        $segment = new Segment();
+        $segment->setSegment('visitDuration');
+        $segment->setName('General_ColumnVisitDuration');
+        $segment->setType(Segment::TYPE_METRIC);
+        $this->addSegment($segment);
+    }
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $totalTime = Config::getInstance()->Tracker['default_time_one_page_visit'];
+        $totalTime = $this->cleanupVisitTotalTime($totalTime);
+
+        return $totalTime;
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        $firstActionTime = $visitor->getVisitorColumn('visit_first_action_time');
+
+        $totalTime = 1 + $request->getCurrentTimestamp() - $firstActionTime;
+        $totalTime = $this->cleanupVisitTotalTime($totalTime);
+
+        $this->isExistingVisit = true;
+
+        return $totalTime;
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onConvertedVisit(Request $request, Visitor $visitor, $action)
+    {
+        if (!$this->isExistingVisit) {
+            return false;
+        }
+
+        $goalManager = new GoalManager($request);
+
+        $totalTime = $visitor->getVisitorColumn('visit_total_time');
+
+        // If a pageview and goal conversion in the same second, with previously a goal conversion recorded
+        // the request would not "update" the row since all values are the same as previous
+        // therefore the request below throws exception, instead we make sure the UPDATE will affect the row
+        $totalTime = $totalTime + $goalManager->idGoal;
+        // +2 to offset idgoal=-1 and idgoal=0
+        $totalTime = $totalTime + 2;
+
+        return $this->cleanupVisitTotalTime($totalTime);
+    }
+
+    public function getRequiredVisitFields()
+    {
+        return array('visit_first_action_time');
+    }
+
+    private function cleanupVisitTotalTime($t)
+    {
+        $t = (int)$t;
+
+        if ($t < 0) {
+            $t = 0;
+        }
+
+        $smallintMysqlLimit = 65534;
+
+        if ($t > $smallintMysqlLimit) {
+            $t = $smallintMysqlLimit;
+        }
+
+        return $t;
+    }
+
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
index c418e6e76490a39e7d3115059764dd235c0525ae..04791dcf81e255ae171e14f47c08edcb5c1bae3a 100644
--- a/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceFirst.php
@@ -12,6 +12,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class VisitorDaysSinceFirst extends VisitDimension
 {
@@ -34,11 +35,11 @@ class VisitorDaysSinceFirst extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return $request->getDaysSinceFirstVisit();
     }
diff --git a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
index 5597a426f777539f79a242a1b82bda74d957b949..d4007bc58a26fd5e9f8b54eb2ce8d8d0f518675e 100644
--- a/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
+++ b/plugins/CoreHome/Columns/VisitorDaysSinceOrder.php
@@ -9,14 +9,26 @@
 namespace Piwik\Plugins\CoreHome\Columns;
 
 use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class VisitorDaysSinceOrder extends VisitDimension
 {
     protected $fieldName = 'visitor_days_since_order';
     protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
 
+    protected function init()
+    {
+        $segment = new Segment();
+        $segment->setSegment('daysSinceLastEcommerceOrder');
+        $segment->setName('General_DaysSinceLastEcommerceOrder');
+        $segment->setType(Segment::TYPE_METRIC);
+
+        $this->addSegment($segment);
+    }
+
     public function getName()
     {
         return '';
@@ -24,11 +36,11 @@ class VisitorDaysSinceOrder extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $daysSinceLastOrder = $request->getDaysSinceLastOrder();
 
diff --git a/plugins/CoreHome/Columns/VisitorReturning.php b/plugins/CoreHome/Columns/VisitorReturning.php
new file mode 100644
index 0000000000000000000000000000000000000000..bfd3c4763350fad1a49b504a29dcfd525f28497b
--- /dev/null
+++ b/plugins/CoreHome/Columns/VisitorReturning.php
@@ -0,0 +1,72 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\CoreHome\Columns;
+
+use Piwik\Piwik;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+
+class VisitorReturning extends VisitDimension
+{
+    const IS_RETURNING_CUSTOMER = 2;
+    const IS_RETURNING = 1;
+    const IS_NEW = 0;
+
+    protected $fieldName = 'visitor_returning';
+    protected $fieldType = 'TINYINT(1) NOT NULL';
+
+    protected function init()
+    {
+        $acceptedValues  = 'new, returning, returningCustomer. ';
+        $acceptedValues .= Piwik::translate('General_VisitTypeExample', '"&segment=visitorType==returning,visitorType==returningCustomer"');
+
+        $segment = new Segment();
+        $segment->setSegment('visitorType');
+        $segment->setName('General_VisitType');
+        $segment->setAcceptedValues($acceptedValues);
+        $segment->setSqlFilterValue(function ($type) {
+            return $type == "new" ? 0 : ($type == "returning" ? 1 : 2);
+        });
+
+        $this->addSegment($segment);
+    }
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $visitCount = $request->getVisitCount();
+        $daysSinceLastVisit = $request->getDaysSinceLastVisit();
+
+        $daysSinceLastOrder = $request->getDaysSinceLastOrder();
+        $isReturningCustomer = ($daysSinceLastOrder !== false);
+
+        if ($isReturningCustomer) {
+            return self::IS_RETURNING_CUSTOMER;
+        }
+
+        if ($visitCount > 1 || $visitor->isVisitorKnown() || $daysSinceLastVisit > 0) {
+            return self::IS_RETURNING;
+        }
+
+        return self::IS_NEW;
+    }
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/Columns/VisitsCount.php b/plugins/CoreHome/Columns/VisitsCount.php
index 6b900eefef7730dc95701c47b4faf6afd5689230..6fb53c6ff0c29e76aecdf81cce93d03c6dbbf6f4 100644
--- a/plugins/CoreHome/Columns/VisitsCount.php
+++ b/plugins/CoreHome/Columns/VisitsCount.php
@@ -12,6 +12,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class VisitsCount extends VisitDimension
 {
@@ -34,11 +35,11 @@ class VisitsCount extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return $request->getVisitCount();
     }
diff --git a/plugins/CustomVariables/Columns/CustomVariablename.php b/plugins/CustomVariables/Columns/CustomVariablename.php
index 31fa5c58d26d0443d5cd7b67feefe593e34499cd..bf7474af9aa5670dbf9e293cdb7859f3b6428424 100644
--- a/plugins/CustomVariables/Columns/CustomVariablename.php
+++ b/plugins/CustomVariables/Columns/CustomVariablename.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\CustomVariables\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class CustomVariablename extends VisitDimension
+class CustomVariableName extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/CustomVariables/Columns/CustomVariablevalue.php b/plugins/CustomVariables/Columns/CustomVariablevalue.php
index 71ca2219f283c077f00d324f751227d5aee60b45..7b7f2ef31598ef8e643a4dc56bd3211c23d253f0 100644
--- a/plugins/CustomVariables/Columns/CustomVariablevalue.php
+++ b/plugins/CustomVariables/Columns/CustomVariablevalue.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\CustomVariables\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class CustomVariablevalue extends VisitDimension
+class CustomVariableValue extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/CustomVariables/Reports/GetCustomVariables.php b/plugins/CustomVariables/Reports/GetCustomVariables.php
index 930e28adc3362f948cb67a6247f8406f3ce85243..deac87c0a4fef3467fb7c0d1e88de49a366f88e0 100644
--- a/plugins/CustomVariables/Reports/GetCustomVariables.php
+++ b/plugins/CustomVariables/Reports/GetCustomVariables.php
@@ -10,14 +10,14 @@ namespace Piwik\Plugins\CustomVariables\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\CustomVariables\Columns\CustomVariablename;
+use Piwik\Plugins\CustomVariables\Columns\CustomVariableName;
 
 class GetCustomVariables extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new CustomVariablename();
+        $this->dimension     = new CustomVariableName();
         $this->name          = Piwik::translate('CustomVariables_CustomVariables');
         $this->documentation = Piwik::translate('CustomVariables_CustomVariablesReportDocumentation',
                                array('<br />', '<a href="http://piwik.org/docs/custom-variables/" target="_blank">', '</a>'));
diff --git a/plugins/CustomVariables/Reports/GetCustomVariablesValuesFromNameId.php b/plugins/CustomVariables/Reports/GetCustomVariablesValuesFromNameId.php
index 1c173270ebcbe50e4208c9389b0700a41e9d31bb..cee1bf1f885f4d088b7822b25f1ff0924e080a9a 100644
--- a/plugins/CustomVariables/Reports/GetCustomVariablesValuesFromNameId.php
+++ b/plugins/CustomVariables/Reports/GetCustomVariablesValuesFromNameId.php
@@ -10,14 +10,14 @@ namespace Piwik\Plugins\CustomVariables\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\CustomVariables\Columns\CustomVariablevalue;
+use Piwik\Plugins\CustomVariables\Columns\CustomVariableValue;
 
 class GetCustomVariablesValuesFromNameId extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new CustomVariablevalue();
+        $this->dimension     = new CustomVariableValue();
         $this->name          = Piwik::translate('CustomVariables_CustomVariables');
         $this->documentation = Piwik::translate('CustomVariables_CustomVariablesReportDocumentation',
             array('<br />', '<a href="http://piwik.org/docs/custom-variables/" target="_blank">', '</a>'));
diff --git a/plugins/DevicesDetection/Columns/BrowserName.php b/plugins/DevicesDetection/Columns/BrowserName.php
index 7545dd2d0bf1890a6c7c8f613187ae5452e2956a..f9d6cc552ed9a8d4378ed7aa460834b39b415e5d 100644
--- a/plugins/DevicesDetection/Columns/BrowserName.php
+++ b/plugins/DevicesDetection/Columns/BrowserName.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class BrowserName extends Base
 {
@@ -20,7 +22,13 @@ class BrowserName extends Base
         return Piwik::translate('UserSettings_BrowserFamilies');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/BrowserVersion.php b/plugins/DevicesDetection/Columns/BrowserVersion.php
index c9c557a2a00c149fce737bfea24d8b4914684d8f..ecceac377210fb61940e410225e44fa6b9b41a62 100644
--- a/plugins/DevicesDetection/Columns/BrowserVersion.php
+++ b/plugins/DevicesDetection/Columns/BrowserVersion.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class BrowserVersion extends Base
 {
@@ -20,7 +22,13 @@ class BrowserVersion extends Base
         return Piwik::translate('DevicesDetection_BrowserVersions');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/DeviceBrand.php b/plugins/DevicesDetection/Columns/DeviceBrand.php
index 5a37a53718cd232a0dbf18172fc7770f41d60652..dddaa681850370bee111ae54d8aa17bd5c420f4a 100644
--- a/plugins/DevicesDetection/Columns/DeviceBrand.php
+++ b/plugins/DevicesDetection/Columns/DeviceBrand.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class DeviceBrand extends Base
 {
@@ -21,7 +23,13 @@ class DeviceBrand extends Base
         return Piwik::translate('DevicesDetection_DeviceBrand');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/DeviceModel.php b/plugins/DevicesDetection/Columns/DeviceModel.php
index a340503af3525315ff167ee53f7d752fb4d23e9e..078ddb3b1ab67d02d021890d1ac52ba34130293e 100644
--- a/plugins/DevicesDetection/Columns/DeviceModel.php
+++ b/plugins/DevicesDetection/Columns/DeviceModel.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class DeviceModel extends Base
 {
@@ -21,7 +23,13 @@ class DeviceModel extends Base
         return Piwik::translate('DevicesDetection_DeviceModel');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/DeviceType.php b/plugins/DevicesDetection/Columns/DeviceType.php
index 5d8d892a27ba3f0c885f05e53e82b6f087298162..00c242c381b4d8022701763d72dd107d91e1c4e2 100644
--- a/plugins/DevicesDetection/Columns/DeviceType.php
+++ b/plugins/DevicesDetection/Columns/DeviceType.php
@@ -13,6 +13,8 @@ use Piwik\Plugin\Segment;
 use Piwik\Tracker\Request;
 use DeviceDetector;
 use Exception;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class DeviceType extends Base
 {
@@ -27,7 +29,7 @@ class DeviceType extends Base
         $segment->setCategory('General_Visit');
         $segment->setSegment('deviceType');
         $segment->setName('DevicesDetection_DeviceType');
-        $segment->setAcceptValues($deviceTypeList);
+        $segment->setAcceptedValues($deviceTypeList);
         $segment->setSqlFilter(function ($type) use ($deviceTypeList) {
             $index = array_search(strtolower(trim(urldecode($type))), DeviceDetector::$deviceTypes);
             if ($index === false) {
@@ -44,7 +46,13 @@ class DeviceType extends Base
         return Piwik::translate('DevicesDetection_DeviceType');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/Os.php b/plugins/DevicesDetection/Columns/Os.php
index 089b0741a0bb6e7bbcc48582a3272381ce5ffa2f..4c2f3bcc65b5ee82ec3f20a8847137284ab4d272 100644
--- a/plugins/DevicesDetection/Columns/Os.php
+++ b/plugins/DevicesDetection/Columns/Os.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class Os extends Base
 {
@@ -20,7 +22,13 @@ class Os extends Base
         return Piwik::translate('DevicesDetection_OperatingSystemFamilies');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Columns/OsVersion.php b/plugins/DevicesDetection/Columns/OsVersion.php
index 088ca5857265a0fd4dddc857580db2260be2229c..c92c89ff4275b56e3baa2dd96815bf2296e8f4ef 100644
--- a/plugins/DevicesDetection/Columns/OsVersion.php
+++ b/plugins/DevicesDetection/Columns/OsVersion.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\DevicesDetection\Columns;
 
 use Piwik\Piwik;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class OsVersion extends Base
 {
@@ -21,7 +23,13 @@ class OsVersion extends Base
         return Piwik::translate('DevicesDetection_OperatingSystemVersions');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $userAgent = $request->getUserAgent();
         $parser    = $this->getUAParser($userAgent);
diff --git a/plugins/DevicesDetection/Reports/Base.php b/plugins/DevicesDetection/Reports/Base.php
index 9a178bb62c489aa066fb9637ffd44abfd85bf549..75222221b963e608b96a958b667f06fa3facf421 100644
--- a/plugins/DevicesDetection/Reports/Base.php
+++ b/plugins/DevicesDetection/Reports/Base.php
@@ -16,20 +16,4 @@ abstract class Base extends \Piwik\Plugin\Report
     {
         $this->category = 'DevicesDetection_DevicesDetection';
     }
-
-    protected function getOsRelatedReports()
-    {
-        return array(
-            'DevicesDetection.getOsFamilies' => Piwik::translate('DevicesDetection_OperatingSystemFamilies'),
-            'DevicesDetection.getOsVersions' => Piwik::translate('DevicesDetection_OperatingSystemVersions')
-        );
-    }
-
-    protected function getBrowserRelatedReports()
-    {
-        return array(
-            'DevicesDetection.getBrowserFamilies' => Piwik::translate('UserSettings_BrowserFamilies'),
-            'DevicesDetection.getBrowserVersions' => Piwik::translate('DevicesDetection_BrowserVersions')
-        );
-    }
 }
diff --git a/plugins/DevicesDetection/Reports/GetBrowserFamilies.php b/plugins/DevicesDetection/Reports/GetBrowserFamilies.php
index 1543b5a472ef1c412f821c7596e1228d4f6e1b12..b997f585117d6935bedee30903f4df8fb887dc98 100644
--- a/plugins/DevicesDetection/Reports/GetBrowserFamilies.php
+++ b/plugins/DevicesDetection/Reports/GetBrowserFamilies.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugins\DevicesDetection\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\DevicesDetection\Columns\Browserfamilies;
 use Piwik\Plugins\DevicesDetection\Columns\BrowserName;
 
 class GetBrowserFamilies extends Base
@@ -31,7 +30,12 @@ class GetBrowserFamilies extends Base
         $view->config->show_search = false;
         $view->config->show_exclude_low_population = false;
         $view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelBrowserFamily"));
-        $view->config->addRelatedReports($this->getBrowserRelatedReports());
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetBrowserVersions()
+        );
+    }
 }
diff --git a/plugins/DevicesDetection/Reports/GetBrowserVersions.php b/plugins/DevicesDetection/Reports/GetBrowserVersions.php
index cf1a00d3c60894792666daa7964cf86eca3fa330..12089da7071e61da701beed1c14523070d77c24e 100644
--- a/plugins/DevicesDetection/Reports/GetBrowserVersions.php
+++ b/plugins/DevicesDetection/Reports/GetBrowserVersions.php
@@ -29,7 +29,12 @@ class GetBrowserVersions extends Base
         $view->config->show_search = false;
         $view->config->show_exclude_low_population = false;
         $view->config->addTranslation('label', Piwik::translate("UserSettings_ColumnBrowserVersion"));
-        $view->config->addRelatedReports($this->getBrowserRelatedReports());
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetBrowserFamilies()
+        );
+    }
 }
diff --git a/plugins/DevicesDetection/Reports/GetOsFamilies.php b/plugins/DevicesDetection/Reports/GetOsFamilies.php
index 7ca9af3aa675b9f897404d41baac88c320e2ddef..e78b666b2a050e89bcc14c296be2f872fa98b98a 100644
--- a/plugins/DevicesDetection/Reports/GetOsFamilies.php
+++ b/plugins/DevicesDetection/Reports/GetOsFamilies.php
@@ -10,7 +10,6 @@ namespace Piwik\Plugins\DevicesDetection\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\DevicesDetection\Columns\OperatingSystemfamilies;
 use Piwik\Plugins\DevicesDetection\Columns\Os;
 
 class GetOsFamilies extends Base
@@ -31,7 +30,13 @@ class GetOsFamilies extends Base
         $view->config->show_search = false;
         $view->config->show_exclude_low_population = false;
         $view->config->addTranslation('label', Piwik::translate("UserSettings_OperatingSystemFamily"));
-        $view->config->addRelatedReports($this->getOsRelatedReports());
+    }
+
+    public function getRelatedReports()
+    {
+        return array(
+            new GetOsVersions()
+        );
     }
 
 }
diff --git a/plugins/DevicesDetection/Reports/GetOsVersions.php b/plugins/DevicesDetection/Reports/GetOsVersions.php
index 05f70b0770a5a22e78a6b29d7d2d53a28ecfb457..6dd5cc0ef1aff0229166774b4894e636ebe4f50c 100644
--- a/plugins/DevicesDetection/Reports/GetOsVersions.php
+++ b/plugins/DevicesDetection/Reports/GetOsVersions.php
@@ -30,7 +30,12 @@ class GetOsVersions extends Base
         $view->config->show_search = false;
         $view->config->show_exclude_low_population = false;
         $view->config->addTranslation('label', Piwik::translate("DevicesDetection_dataTableLabelSystemVersion"));
-        $view->config->addRelatedReports($this->getOsRelatedReports());
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetOsFamilies()
+        );
+    }
 }
diff --git a/plugins/Events/Columns/TotalEvents.php b/plugins/Events/Columns/TotalEvents.php
index 3d6ac9f33b630f8e59b803ee4c47d567813ad364..d94717ea411771c496767c420bd9d574b5327018 100644
--- a/plugins/Events/Columns/TotalEvents.php
+++ b/plugins/Events/Columns/TotalEvents.php
@@ -13,6 +13,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Plugin\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class TotalEvents extends VisitDimension
 {
@@ -24,7 +25,7 @@ class TotalEvents extends VisitDimension
         $segment = new Segment();
         $segment->setSegment('events');
         $segment->setName('Events_TotalEvents');
-        $segment->setAcceptValues('To select all visits who triggered an Event, use: &segment=events>0');
+        $segment->setAcceptedValues('To select all visits who triggered an Event, use: &segment=events>0');
         $segment->setCategory('General_Visit');
         $segment->setType(Segment::TYPE_METRIC);
         $this->addSegment($segment);
@@ -37,11 +38,11 @@ class TotalEvents extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         if ($this->isEventAction($action)) {
             return 1;
@@ -52,11 +53,11 @@ class TotalEvents extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
      * @return int
      */
-    public function onExistingVisit(Request $request, $visit, $action)
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
     {
         if ($this->isEventAction($action)) {
             return 'visit_total_events + 1';
diff --git a/plugins/Goals/Goals.php b/plugins/Goals/Goals.php
index 8a1cd63d16225efa423b1784547e91ed7a7d4496..6d6ffbc7f39231e6159d8dd24afab9caffd9b2ad 100644
--- a/plugins/Goals/Goals.php
+++ b/plugins/Goals/Goals.php
@@ -12,6 +12,7 @@ use Piwik\ArchiveProcessor;
 use Piwik\Common;
 use Piwik\Db;
 use Piwik\Piwik;
+use Piwik\Plugin\Report;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Site;
 use Piwik\Tracker\GoalManager;
@@ -387,6 +388,17 @@ class Goals extends \Piwik\Plugin
     {
         $reportsWithGoals = array();
 
+        foreach (Report::getAllReports() as $report) {
+            if ($report->hasGoalMetrics()) {
+                $reportsWithGoals[] = array(
+                    'category' => $report->getCategory(),
+                    'name'     => $report->getName(),
+                    'module'   => $report->getModule(),
+                    'action'   => $report->getAction(),
+                );
+            }
+        }
+
         /**
          * Triggered when gathering all reports that contain Goal metrics. The list of reports
          * will be displayed on the left column of the bottom of every _Goals_ page.
@@ -414,6 +426,7 @@ class Goals extends \Piwik\Plugin
          *                                 - **name**: The report's translated name.
          *                                 - **module**: The plugin the report is in, eg, `'UserCountry'`.
          *                                 - **action**: The API method of the report, eg, `'getCountry'`.
+         * @ignore
          */
         Piwik::postEvent('Goals.getReportsWithGoalMetrics', array(&$reportsWithGoals));
 
diff --git a/plugins/Live/Visitor.php b/plugins/Live/Visitor.php
index c52f8dc0f3a145e7109f9f01b35b61c820ffea25..b0adb4a08d034b96ee72844f30d52aa0778cbe2f 100644
--- a/plugins/Live/Visitor.php
+++ b/plugins/Live/Visitor.php
@@ -16,6 +16,7 @@ use Piwik\Db;
 use Piwik\IP;
 use Piwik\Piwik;
 use Piwik\Plugins\API\API as APIMetadata;
+use Piwik\Plugins\CoreHome\Columns\VisitGoalBuyer;
 use Piwik\Plugins\CustomVariables\CustomVariables;
 use Piwik\Plugins\Referrers\API as APIReferrers;
 use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
@@ -589,7 +590,7 @@ class Visitor
 
     function getVisitEcommerceStatus()
     {
-        return APIMetadata::getVisitEcommerceStatusFromId($this->details['visit_goal_buyer']);
+        return VisitGoalBuyer::getVisitEcommerceStatusFromId($this->details['visit_goal_buyer']);
     }
 
     function getVisitorGoalConvertedIcon()
diff --git a/plugins/Provider/Columns/Provider.php b/plugins/Provider/Columns/Provider.php
index ae07639dade9f350d3ce97b4c6002247228cf978..93792b1d469c3a64f531ed77f91a26f195fc6547 100644
--- a/plugins/Provider/Columns/Provider.php
+++ b/plugins/Provider/Columns/Provider.php
@@ -8,9 +8,16 @@
  */
 namespace Piwik\Plugins\Provider\Columns;
 
+use Piwik\Common;
+use Piwik\IP;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Plugin\Segment;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
+use Piwik\Plugins\Provider\Provider as ProviderPlugin;
 
 class Provider extends VisitDimension
 {    
@@ -22,10 +29,64 @@ class Provider extends VisitDimension
         $segment->setSegment('provider');
         $segment->setCategory('Visit Location');
         $segment->setName('Provider_ColumnProvider');
-        $segment->setAcceptValues('comcast.net, proxad.net, etc.');
+        $segment->setAcceptedValues('comcast.net, proxad.net, etc.');
         $this->addSegment($segment);
     }
 
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        // if provider info has already been set, abort
+        $locationValue = $visitor->getVisitorColumn('location_provider');
+        if (!empty($locationValue)) {
+            return false;
+        }
+
+        $ip = $visitor->getVisitorColumn('location_ip');
+
+        $privacyConfig = new PrivacyManagerConfig();
+        if (!$privacyConfig->useAnonymizedIpForVisitEnrichment) {
+            $ip = $request->getIp();
+        }
+
+        $ip = IP::N2P($ip);
+
+        // In case the IP was anonymized, we should not continue since the DNS reverse lookup will fail and this will slow down tracking
+        if (substr($ip, -2, 2) == '.0') {
+            Common::printDebug("IP Was anonymized so we skip the Provider DNS reverse lookup...");
+            return false;
+        }
+
+        $hostname = $this->getHost($ip);
+        $hostnameExtension = ProviderPlugin::getCleanHostname($hostname);
+
+        // add the provider value in the table log_visit
+        $locationProvider = substr($hostnameExtension, 0, 100);
+
+        return $locationProvider;
+    }
+
+    public function getRequiredVisitFields()
+    {
+        return array('location_ip');
+    }
+
+    /**
+     * Returns the hostname given the IP address string
+     *
+     * @param string $ip IP Address
+     * @return string hostname (or human-readable IP address)
+     */
+    private function getHost($ip)
+    {
+        return trim(strtolower(@IP::getHostByAddr($ip)));
+    }
+
     public function getName()
     {
         return Piwik::translate('Provider_ColumnProvider');
diff --git a/plugins/Provider/Provider.php b/plugins/Provider/Provider.php
index 75c7d8686d30c32c9c9f5a25173a5e64ac06d5e6..b0d70e0a161b9995ffdaca6d7d7d7bf6934f549f 100644
--- a/plugins/Provider/Provider.php
+++ b/plugins/Provider/Provider.php
@@ -13,25 +13,10 @@ use Piwik\ArchiveProcessor;
 use Piwik\Common;
 use Piwik\Db;
 use Piwik\FrontController;
-use Piwik\IP;
 use Piwik\Piwik;
-use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
 
-/**
- *
- */
 class Provider extends \Piwik\Plugin
 {
-    /**
-     * @see Piwik\Plugin::getListHooksRegistered
-     */
-    public function getListHooksRegistered()
-    {
-        return array(
-            'Tracker.newVisitorInformation' => 'enrichVisitWithProviderInfo',
-        );
-    }
-
     public function install()
     {
         // add column hostname / hostname ext in the visit table
@@ -59,40 +44,12 @@ class Provider extends \Piwik\Plugin
         Piwik::addAction('Template.footerUserCountry', array('Piwik\Plugins\Provider\Provider', 'footerUserCountry'));
     }
 
-    /**
-     * Logs the provider in the log_visit table
-     */
-    public function enrichVisitWithProviderInfo(&$visitorInfo, \Piwik\Tracker\Request $request)
+    static public function footerUserCountry(&$out)
     {
-        // if provider info has already been set, abort
-        if (!empty($visitorInfo['location_provider'])) {
-            return;
-        }
-
-        $privacyConfig = new PrivacyManagerConfig();
-        $ip = IP::N2P($privacyConfig->useAnonymizedIpForVisitEnrichment ? $visitorInfo['location_ip'] : $request->getIp());
-
-        // In case the IP was anonymized, we should not continue since the DNS reverse lookup will fail and this will slow down tracking
-        if (substr($ip, -2, 2) == '.0') {
-            Common::printDebug("IP Was anonymized so we skip the Provider DNS reverse lookup...");
-            return;
-        }
-
-        $hostname = $this->getHost($ip);
-        $hostnameExtension = $this->getCleanHostname($hostname);
-
-        // add the provider value in the table log_visit
-        $visitorInfo['location_provider'] = $hostnameExtension;
-        $visitorInfo['location_provider'] = substr($visitorInfo['location_provider'], 0, 100);
-
-        // improve the country using the provider extension if valid
-        $hostnameDomain = substr($hostnameExtension, 1 + strrpos($hostnameExtension, '.'));
-        if ($hostnameDomain == 'uk') {
-            $hostnameDomain = 'gb';
-        }
-        if (array_key_exists($hostnameDomain, Common::getCountriesList())) {
-            $visitorInfo['location_country'] = $hostnameDomain;
-        }
+        $out = '<div>
+			<h2>' . Piwik::translate('Provider_WidgetProviders') . '</h2>';
+        $out .= FrontController::getInstance()->fetchDispatch('Provider', 'getProvider');
+        $out .= '</div>';
     }
 
     /**
@@ -103,7 +60,7 @@ class Provider extends \Piwik\Plugin
      *
      * @return string
      */
-    private function getCleanHostname($hostname)
+    public static function getCleanHostname($hostname)
     {
         $extToExclude = array(
             'com', 'net', 'org', 'co'
@@ -119,19 +76,19 @@ class Provider extends \Piwik\Plugin
 
             /**
              * Triggered when prettifying a hostname string.
-             * 
-             * This event can be used to customize the way a hostname is displayed in the 
+             *
+             * This event can be used to customize the way a hostname is displayed in the
              * Providers report.
              *
              * **Example**
-             * 
+             *
              *     public function getCleanHostname(&$cleanHostname, $hostname)
              *     {
              *         if ('fvae.VARG.ceaga.site.co.jp' == $hostname) {
              *             $cleanHostname = 'site.co.jp';
              *         }
              *     }
-             * 
+             *
              * @param string &$cleanHostname The hostname string to display. Set by the event
              *                               handler.
              * @param string $hostname The full hostname.
@@ -153,23 +110,4 @@ class Provider extends \Piwik\Plugin
         }
     }
 
-    /**
-     * Returns the hostname given the IP address string
-     *
-     * @param string $ip IP Address
-     * @return string hostname (or human-readable IP address)
-     */
-    private function getHost($ip)
-    {
-        return trim(strtolower(@IP::getHostByAddr($ip)));
-    }
-
-    static public function footerUserCountry(&$out)
-    {
-        $out = '<div>
-			<h2>' . Piwik::translate('Provider_WidgetProviders') . '</h2>';
-        $out .= FrontController::getInstance()->fetchDispatch('Provider', 'getProvider');
-        $out .= '</div>';
-    }
-
 }
diff --git a/plugins/Referrers/Columns/Keyword.php b/plugins/Referrers/Columns/Keyword.php
index 9cdfabcaf1776d16a42734c8987e5cc453c9a923..31e495e96e2828d95604b48c76789c03508d5513 100644
--- a/plugins/Referrers/Columns/Keyword.php
+++ b/plugins/Referrers/Columns/Keyword.php
@@ -11,6 +11,8 @@ namespace Piwik\Plugins\Referrers\Columns;
 use Piwik\Piwik;
 use Piwik\Plugins\Referrers\Segment;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class Keyword extends Base
 {
@@ -22,7 +24,7 @@ class Keyword extends Base
         $segment = new Segment();
         $segment->setSegment('referrerKeyword');
         $segment->setName('General_ColumnKeyword');
-        $segment->setAcceptValues('Encoded%20Keyword, keyword');
+        $segment->setAcceptedValues('Encoded%20Keyword, keyword');
         $this->addSegment($segment);
     }
 
@@ -31,7 +33,13 @@ class Keyword extends Base
         return Piwik::translate('General_ColumnKeyword');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $referrerUrl = $request->getParam('urlref');
         $currentUrl  = $request->getParam('url');
@@ -42,6 +50,6 @@ class Keyword extends Base
             return substr($information['referer_keyword'], 0, 255);
         }
 
-        return $information['referer_keyword'];;
+        return $information['referer_keyword'];
     }
 }
diff --git a/plugins/Referrers/Columns/ReferrerName.php b/plugins/Referrers/Columns/ReferrerName.php
index 7952229d34be483fc4e2cde228e4be68b732c2ea..38e1ec9bb18edd3d95c7c7362f6844dad0b6581d 100644
--- a/plugins/Referrers/Columns/ReferrerName.php
+++ b/plugins/Referrers/Columns/ReferrerName.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\Referrers\Columns;
 
 use Piwik\Plugins\Referrers\Segment;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class ReferrerName extends Base
 {
@@ -21,7 +23,7 @@ class ReferrerName extends Base
         $segment = new Segment();
         $segment->setSegment('referrerName');
         $segment->setName('Referrers_ReferrerName');
-        $segment->setAcceptValues('twitter.com, www.facebook.com, Bing, Google, Yahoo, CampaignName');
+        $segment->setAcceptedValues('twitter.com, www.facebook.com, Bing, Google, Yahoo, CampaignName');
         $this->addSegment($segment);
     }
 
@@ -30,7 +32,13 @@ class ReferrerName extends Base
         return '';
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $referrerUrl = $request->getParam('urlref');
         $currentUrl  = $request->getParam('url');
diff --git a/plugins/Referrers/Columns/ReferrerType.php b/plugins/Referrers/Columns/ReferrerType.php
index 2709f609deaf6c9ac816d1c886069203099310a6..93df8e406d4f4d5fdf47c61bbfdd36943e3aa3cc 100644
--- a/plugins/Referrers/Columns/ReferrerType.php
+++ b/plugins/Referrers/Columns/ReferrerType.php
@@ -11,6 +11,8 @@ namespace Piwik\Plugins\Referrers\Columns;
 use Piwik\Piwik;
 use Piwik\Plugins\Referrers\Segment;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class ReferrerType extends Base
 {
@@ -23,7 +25,7 @@ class ReferrerType extends Base
         $segment->setSegment('referrerType');
         $segment->setName('Referrers_Type');
         $segment->setSqlFilterValue('Piwik\Plugins\Referrers\getReferrerTypeFromShortName');
-        $segment->setAcceptValues('direct, search, website, campaign');
+        $segment->setAcceptedValues('direct, search, website, campaign');
         $this->addSegment($segment);
     }
 
@@ -32,7 +34,13 @@ class ReferrerType extends Base
         return Piwik::translate('Referrers_Type');
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $referrerUrl = $request->getParam('urlref');
         $currentUrl  = $request->getParam('url');
diff --git a/plugins/Referrers/Columns/ReferrerUrl.php b/plugins/Referrers/Columns/ReferrerUrl.php
index 849a9529757d2d71e38c482faad079ea19a15c38..b2e50ecfe3a230ef7af365ab5cdbfb7d78ba80ea 100644
--- a/plugins/Referrers/Columns/ReferrerUrl.php
+++ b/plugins/Referrers/Columns/ReferrerUrl.php
@@ -10,6 +10,8 @@ namespace Piwik\Plugins\Referrers\Columns;
 
 use Piwik\Plugins\Referrers\Segment;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
 class ReferrerUrl extends Base
 {
@@ -21,7 +23,7 @@ class ReferrerUrl extends Base
         $segment = new Segment();
         $segment->setSegment('referrerUrl');
         $segment->setName('Live_Referrer_URL');
-        $segment->setAcceptValues('http%3A%2F%2Fwww.example.org%2Freferer-page.htm');
+        $segment->setAcceptedValues('http%3A%2F%2Fwww.example.org%2Freferer-page.htm');
         $this->addSegment($segment);
     }
 
@@ -30,7 +32,13 @@ class ReferrerUrl extends Base
         return '';
     }
 
-    public function onNewVisit(Request $request, $visit)
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $referrerUrl = $request->getParam('urlref');
         $currentUrl  = $request->getParam('url');
diff --git a/plugins/Referrers/Columns/Socialnetwork.php b/plugins/Referrers/Columns/Socialnetwork.php
index 9fa210819d88cfddccc35d72482bbb07f17b7e33..e5c0f22b3d77135fad8d5762626b97781d4f9468 100644
--- a/plugins/Referrers/Columns/Socialnetwork.php
+++ b/plugins/Referrers/Columns/Socialnetwork.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\Referrers\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Socialnetwork extends VisitDimension
+class SocialNetwork extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/Referrers/Referrers.php b/plugins/Referrers/Referrers.php
index dcc9133da69f68e5f3157bbccbb3523a87ce8db1..3097cfceb20c7216306d1dbc04e1a03e43167d11 100644
--- a/plugins/Referrers/Referrers.php
+++ b/plugins/Referrers/Referrers.php
@@ -27,11 +27,9 @@ class Referrers extends \Piwik\Plugin
      */
     public function getListHooksRegistered()
     {
-        $hooks = array(
-            'Goals.getReportsWithGoalMetrics' => 'getReportsWithGoalMetrics',
+        return array(
             'Insights.addReportToOverview'    => 'addReportToInsightsOverview'
         );
-        return $hooks;
     }
 
     public function addReportToInsightsOverview(&$reports)
@@ -42,40 +40,6 @@ class Referrers extends \Piwik\Plugin
         $reports['Referrers_getSearchEngines'] = array();
     }
 
-    /**
-     * Adds Goal dimensions, so that the dimensions are displayed in the UI Goal Overview page
-     */
-    public function getReportsWithGoalMetrics(&$dimensions)
-    {
-        $dimensions = array_merge($dimensions, array(
-            array('category' => Piwik::translate('Referrers_Referrers'),
-                  'name'     => Piwik::translate('Referrers_Type'),
-                  'module'   => 'Referrers',
-                  'action'   => 'getReferrerType',
-            ),
-            array('category' => Piwik::translate('Referrers_Referrers'),
-                  'name'     => Piwik::translate('Referrers_Keywords'),
-                  'module'   => 'Referrers',
-                  'action'   => 'getKeywords',
-            ),
-            array('category' => Piwik::translate('Referrers_Referrers'),
-                  'name'     => Piwik::translate('Referrers_SearchEngines'),
-                  'module'   => 'Referrers',
-                  'action'   => 'getSearchEngines',
-            ),
-            array('category' => Piwik::translate('Referrers_Referrers'),
-                  'name'     => Piwik::translate('Referrers_Websites'),
-                  'module'   => 'Referrers',
-                  'action'   => 'getWebsites',
-            ),
-            array('category' => Piwik::translate('Referrers_Referrers'),
-                  'name'     => Piwik::translate('Referrers_Campaigns'),
-                  'module'   => 'Referrers',
-                  'action'   => 'getCampaigns',
-            ),
-        ));
-    }
-
     /**
      * DataTable filter callback that returns the HTML prefix for a label in the
      * 'getAll' report based on the row's referrer type.
diff --git a/plugins/Referrers/Reports/GetCampaigns.php b/plugins/Referrers/Reports/GetCampaigns.php
index 8db3b0a2faefc98256d89fe8adf1eecd6a08093f..53282f6c3840afeb41bb1c4f9077a0445a1d547a 100644
--- a/plugins/Referrers/Reports/GetCampaigns.php
+++ b/plugins/Referrers/Reports/GetCampaigns.php
@@ -22,6 +22,7 @@ class GetCampaigns extends Base
         $this->documentation = Piwik::translate('Referrers_CampaignsReportDocumentation',
                                array('<br />', '<a href="http://piwik.org/docs/tracking-campaigns/" target="_blank">', '</a>'));
         $this->actionToLoadSubTables = 'getKeywordsFromCampaignId';
+        $this->hasGoalMetrics = true;
         $this->order = 9;
         $this->widgetTitle  = 'Referrers_Campaigns';
     }
diff --git a/plugins/Referrers/Reports/GetKeywords.php b/plugins/Referrers/Reports/GetKeywords.php
index 9d0680aa140694ca53eac49eedadc0dcd6103d23..b6949f9f01c4e440ead8b432c700ad4a87a91238 100644
--- a/plugins/Referrers/Reports/GetKeywords.php
+++ b/plugins/Referrers/Reports/GetKeywords.php
@@ -22,6 +22,7 @@ class GetKeywords extends Base
         $this->name          = Piwik::translate('Referrers_Keywords');
         $this->documentation = Piwik::translate('Referrers_KeywordsReportDocumentation', '<br />');
         $this->actionToLoadSubTables = 'getSearchEnginesFromKeywordId';
+        $this->hasGoalMetrics = true;
         $this->order = 3;
         $this->widgetTitle  = 'Referrers_WidgetKeywords';
     }
diff --git a/plugins/Referrers/Reports/GetReferrerType.php b/plugins/Referrers/Reports/GetReferrerType.php
index e856a61367c405b3206cab0b94e9261bbf481341..b53734b038640372ffecdfd8c600a69c5fb7ffe9 100644
--- a/plugins/Referrers/Reports/GetReferrerType.php
+++ b/plugins/Referrers/Reports/GetReferrerType.php
@@ -30,6 +30,7 @@ class GetReferrerType extends Base
                              . '<b>' . Piwik::translate('Referrers_Campaigns') . ':</b> ' . Piwik::translate('Referrers_CampaignsDocumentation',
                                  array('<br />', '&quot;' . Piwik::translate('Referrers_Campaigns') . '&quot;'));
         $this->constantRowsCount = true;
+        $this->hasGoalMetrics = true;
         $this->order = 1;
         $this->widgetTitle  = 'General_Overview';
     }
diff --git a/plugins/Referrers/Reports/GetSearchEngines.php b/plugins/Referrers/Reports/GetSearchEngines.php
index fc89e14de06bad11c6684751bbb3a5db8974f3fa..a85e0d1977d45d3e62c8ec45faff22bb27d557a4 100644
--- a/plugins/Referrers/Reports/GetSearchEngines.php
+++ b/plugins/Referrers/Reports/GetSearchEngines.php
@@ -22,6 +22,7 @@ class GetSearchEngines extends Base
         $this->name          = Piwik::translate('Referrers_SearchEngines');
         $this->documentation = Piwik::translate('Referrers_SearchEnginesReportDocumentation', '<br />');
         $this->actionToLoadSubTables = 'getKeywordsFromSearchEngineId';
+        $this->hasGoalMetrics = true;
         $this->order = 7;
         $this->widgetTitle  = 'Referrers_SearchEngines';
     }
diff --git a/plugins/Referrers/Reports/GetSocials.php b/plugins/Referrers/Reports/GetSocials.php
index fd3475f226f5056979a8a55eeea29588ac5759b7..e59ae4469031a0a93890ca2f390471686f0a88db 100644
--- a/plugins/Referrers/Reports/GetSocials.php
+++ b/plugins/Referrers/Reports/GetSocials.php
@@ -13,14 +13,14 @@ use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\HtmlTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Pie;
-use Piwik\Plugins\Referrers\Columns\Socialnetwork;
+use Piwik\Plugins\Referrers\Columns\SocialNetwork;
 
 class GetSocials extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Socialnetwork();
+        $this->dimension     = new SocialNetwork();
         $this->name          = Piwik::translate('Referrers_Socials');
         $this->documentation = Piwik::translate('Referrers_WebsitesReportDocumentation', '<br />');
         $this->actionToLoadSubTables = 'getUrlsForSocial';
diff --git a/plugins/Referrers/Reports/GetWebsites.php b/plugins/Referrers/Reports/GetWebsites.php
index 7f6b507e10cf210a7499fa867de446df86cd205c..0c0a5212c6892fad0cd7570a64585b3a810e3c7d 100644
--- a/plugins/Referrers/Reports/GetWebsites.php
+++ b/plugins/Referrers/Reports/GetWebsites.php
@@ -22,6 +22,7 @@ class GetWebsites extends Base
         $this->name          = Piwik::translate('CorePluginsAdmin_Websites');
         $this->documentation = Piwik::translate('Referrers_WebsitesReportDocumentation', '<br />');
         $this->actionToLoadSubTables = 'getUrlsFromWebsiteId';
+        $this->hasGoalMetrics = true;
         $this->order = 5;
         $this->widgetTitle  = 'Referrers_WidgetExternalWebsites';
     }
diff --git a/plugins/UserCountry/Columns/Base.php b/plugins/UserCountry/Columns/Base.php
new file mode 100644
index 0000000000000000000000000000000000000000..48d5fc897ad1c06ffd6f2b37a617134b9d1c3f72
--- /dev/null
+++ b/plugins/UserCountry/Columns/Base.php
@@ -0,0 +1,164 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserCountry\Columns;
+
+use Piwik\Common;
+use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
+use Piwik\Plugins\UserCountry\LocationProvider;
+use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
+use Piwik\Plugins\UserCountry\LocationProvider\DefaultProvider;
+use Piwik\IP;
+use Piwik\Plugin\Manager;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Visit;
+use Piwik\Tracker\Request;
+
+abstract class Base extends VisitDimension
+{
+    private $cachedLocations = array();
+
+    protected function getUrlOverrideValueIfAllowed($urlParamToOverride, Request $request)
+    {
+        if (empty($this->urlParamToOverride)) {
+            return false;
+        }
+
+        if (!$request->isAuthenticated()) {
+            return false;
+        }
+
+        $value = Common::getRequestVar($urlParamToOverride, false, 'string', $request->getParams());
+        if (!empty($value)) {
+            return $value;
+        }
+
+        return false;
+    }
+
+    public function getRequiredVisitFields()
+    {
+        return array('location_ip', 'location_browser_lang');
+    }
+
+    protected function getLocationDetail($userInfo, $locationKey)
+    {
+        $location = $this->getCachedLocation($userInfo);
+
+        if (!empty($location[$locationKey])) {
+            return $location[$locationKey];
+        }
+
+        return false;
+    }
+
+    protected function getUserInfo(Request $request, Visitor $visitor)
+    {
+        $ipAddress = $this->getIpAddress($visitor->getVisitorColumn('location_ip'), $request);
+        $language  = $visitor->getVisitorColumn('location_browser_lang');
+        $userInfo  = array('lang' => $language, 'ip' => $ipAddress);
+
+        return $userInfo;
+    }
+
+    protected function getCachedLocation($userInfo)
+    {
+        require_once PIWIK_INCLUDE_PATH . "/plugins/UserCountry/LocationProvider.php";
+
+        $key = md5(implode(',', $userInfo));
+
+        if (array_key_exists($key, $this->cachedLocations)) {
+            return $this->cachedLocations[$key];
+        }
+
+        $provider = $this->getProvider();
+        $location = $this->getLocation($provider, $userInfo);
+
+        if (empty($location)) {
+            $providerId = $provider->getId();
+            Common::printDebug("GEO: couldn't find a location with Geo Module '$providerId'");
+
+            if (!$this->isDefaultProvider($provider)) {
+                Common::printDebug("Using default provider as fallback...");
+                $provider = $this->getDefaultProvider();
+                $location = $this->getLocation($provider, $userInfo);
+            }
+        }
+
+        if (empty($location['country_code'])) { // sanity check
+            $location['country_code'] = Visit::UNKNOWN_CODE;
+        }
+
+        $this->cachedLocations[$key] = $location;
+
+        return $location;
+    }
+
+    private function getIpAddress($anonymizedIp, \Piwik\Tracker\Request $request)
+    {
+        $privacyConfig = new PrivacyManagerConfig();
+
+        $ip = $request->getIp();
+
+        if ($privacyConfig->useAnonymizedIpForVisitEnrichment) {
+            $ip = $anonymizedIp;
+        }
+
+        $ipAddress = IP::N2P($ip);
+
+        return $ipAddress;
+    }
+
+    /**
+     * @param \Piwik\Plugins\UserCountry\LocationProvider $provider
+     * @param array $userInfo
+     * @return array|null
+     */
+    private function getLocation($provider, $userInfo)
+    {
+        $location   = $provider->getLocation($userInfo);
+        $providerId = $provider->getId();
+        $ipAddress  = $userInfo['ip'];
+
+        if ($location === false) {
+            return false;
+        }
+
+        Common::printDebug("GEO: Found IP $ipAddress location (provider '" . $providerId . "'): " . var_export($location, true));
+
+        return $location;
+    }
+
+    private function getDefaultProvider()
+    {
+        $id       = DefaultProvider::ID;
+        $provider = LocationProvider::getProviderById($id);
+
+        return $provider;
+    }
+
+    private function isDefaultProvider($provider)
+    {
+        return !empty($provider) && DefaultProvider::ID == $provider->getId();
+    }
+
+    private function getProvider()
+    {
+        $id       = Common::getCurrentLocationProviderId();
+        $provider = LocationProvider::getProviderById($id);
+
+        if ($provider === false) {
+            $provider = $this->getDefaultProvider();
+            Common::printDebug("GEO: no current location provider sent, falling back to default '$id' one.");
+        }
+
+        return $provider;
+    }
+
+}
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/City.php b/plugins/UserCountry/Columns/City.php
index 400c313db4c275f10b111142446f1f7df7a11166..929dae92f2192fd8ce4af7711ba92ec38d310d58 100644
--- a/plugins/UserCountry/Columns/City.php
+++ b/plugins/UserCountry/Columns/City.php
@@ -9,19 +9,23 @@
 namespace Piwik\Plugins\UserCountry\Columns;
 
 use Piwik\Piwik;
-use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\UserCountry\LocationProvider;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 use Piwik\Plugins\UserCountry\Segment;
 
-class City extends VisitDimension
+class City extends Base
 {    
     protected $fieldName = 'location_city';
+    protected $fieldType = 'varchar(255) DEFAULT NULL';
 
     protected function init()
     {
         $segment = new Segment();
         $segment->setSegment('city');
         $segment->setName('UserCountry_City');
-        $segment->setAcceptValues('Sydney, Sao Paolo, Rome, etc.');
+        $segment->setAcceptedValues('Sydney, Sao Paolo, Rome, etc.');
         $this->addSegment($segment);
     }
 
@@ -29,4 +33,34 @@ class City extends VisitDimension
     {
         return Piwik::translate('UserCountry_City');
     }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $value = $this->getUrlOverrideValueIfAllowed('city', $request);
+
+        if ($value !== false) {
+            return $value;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+
+        return $this->getLocationDetail($userInfo, LocationProvider::CITY_NAME_KEY);
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $this->getUrlOverrideValueIfAllowed('city', $request);
+    }
 }
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Country.php b/plugins/UserCountry/Columns/Country.php
index a84106ecd670714e67f281d3516786958f9af2c3..a9feced9f69975072433e1c17a202e8702a73df5 100644
--- a/plugins/UserCountry/Columns/Country.php
+++ b/plugins/UserCountry/Columns/Country.php
@@ -8,27 +8,35 @@
  */
 namespace Piwik\Plugins\UserCountry\Columns;
 
+use Piwik\Common;
+use Piwik\IP;
 use Piwik\Piwik;
-use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\Provider\Provider;
+use Piwik\Plugins\UserCountry\LocationProvider;
 use Piwik\Plugins\UserCountry\Segment;
+use Piwik\Tracker\Visit;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
 
-class Country extends VisitDimension
+class Country extends Base
 {    
     protected $fieldName = 'location_country';
+    protected $fieldType = 'CHAR(3) NOT NULL';
 
     protected function init()
     {
         $segment = new Segment();
         $segment->setSegment('countryCode');
         $segment->setName('UserCountry_Country');
-        $segment->setAcceptValues('de, us, fr, in, es, etc.');
+        $segment->setAcceptedValues('de, us, fr, in, es, etc.');
         $this->addSegment($segment);
 
         $segment = new Segment();
         $segment->setSegment('continentCode');
         $segment->setName('UserCountry_Continent');
         $segment->setSqlFilter('Piwik\Plugins\UserCountry\UserCountry::getCountriesForContinent');
-        $segment->setAcceptValues('eur, asi, amc, amn, ams, afr, ant, oce');
+        $segment->setAcceptedValues('eur, asi, amc, amn, ams, afr, ant, oce');
         $this->addSegment($segment);
     }
 
@@ -36,4 +44,74 @@ class Country extends VisitDimension
     {
         return Piwik::translate('UserCountry_Country');
     }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $value = $this->getUrlOverrideValueIfAllowed('country', $request);
+
+        if ($value !== false) {
+            return $value;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+        $country  = $this->getLocationDetail($userInfo, LocationProvider::COUNTRY_CODE_KEY);
+
+        if (!empty($country) && $country != Visit::UNKNOWN_CODE) {
+
+            return strtolower($country);
+        }
+
+        $country = $this->getCountryUsingProviderExtensionIfValid($userInfo['ip']);
+
+        if (!empty($country)) {
+            return $country;
+        }
+
+        return Visit::UNKNOWN_CODE;
+    }
+
+    private function getCountryUsingProviderExtensionIfValid($ipAddress)
+    {
+        $hostname = $this->getHost($ipAddress);
+        $hostnameExtension = Provider::getCleanHostname($hostname);
+
+        $hostnameDomain = substr($hostnameExtension, 1 + strrpos($hostnameExtension, '.'));
+        if ($hostnameDomain == 'uk') {
+            $hostnameDomain = 'gb';
+        }
+
+        if (array_key_exists($hostnameDomain, Common::getCountriesList())) {
+            return $hostnameDomain;
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns the hostname given the IP address string
+     *
+     * @param string $ip IP Address
+     * @return string hostname (or human-readable IP address)
+     */
+    private function getHost($ip)
+    {
+        return trim(strtolower(@IP::getHostByAddr($ip)));
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $this->getUrlOverrideValueIfAllowed('country', $request);
+    }
 }
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Latitude.php b/plugins/UserCountry/Columns/Latitude.php
index 64713c70f16abfff4dfcc1eaf0d46d9798c5cc3a..afadffee9db68b79480e4312dffb52ab8aea2baa 100644
--- a/plugins/UserCountry/Columns/Latitude.php
+++ b/plugins/UserCountry/Columns/Latitude.php
@@ -9,19 +9,23 @@
 namespace Piwik\Plugins\UserCountry\Columns;
 
 use Piwik\Piwik;
-use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\UserCountry\LocationProvider;
 use Piwik\Plugins\UserCountry\Segment;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
-class Latitude extends VisitDimension
+class Latitude extends Base
 {
     protected $fieldName = 'location_latitude';
+    protected $fieldType = 'float(10, 6) DEFAULT NULL';
 
     protected function init()
     {
         $segment = new Segment();
         $segment->setSegment('latitude');
         $segment->setName('UserCountry_Latitude');
-        $segment->setAcceptValues('-33.578, 40.830, etc.<br/>You can select visitors within a lat/long range using &segment=lat&gt;X;lat&lt;Y;long&gt;M;long&lt;N.');
+        $segment->setAcceptedValues('-33.578, 40.830, etc.<br/>You can select visitors within a lat/long range using &segment=lat&gt;X;lat&lt;Y;long&gt;M;long&lt;N.');
         $this->addSegment($segment);
     }
 
@@ -29,4 +33,34 @@ class Latitude extends VisitDimension
     {
         return Piwik::translate('UserCountry_Latitude');
     }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $value = $this->getUrlOverrideValueIfAllowed('lat', $request);
+
+        if ($value !== false) {
+            return $value;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+
+        return $this->getLocationDetail($userInfo, LocationProvider::LATITUDE_KEY);
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $this->getUrlOverrideValueIfAllowed('lat', $request);
+    }
 }
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Longitude.php b/plugins/UserCountry/Columns/Longitude.php
index bf4f63869bc55daf8dc07cbc88c1ef5b5095e48d..d5971321c3fc4d3350f88db7344b5f1c57c9b94a 100644
--- a/plugins/UserCountry/Columns/Longitude.php
+++ b/plugins/UserCountry/Columns/Longitude.php
@@ -9,19 +9,23 @@
 namespace Piwik\Plugins\UserCountry\Columns;
 
 use Piwik\Piwik;
-use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\UserCountry\LocationProvider;
 use Piwik\Plugins\UserCountry\Segment;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
-class Longitude extends VisitDimension
+class Longitude extends Base
 {
     protected $fieldName = 'location_longitude';
+    protected $fieldType = 'float(10, 6) DEFAULT NULL';
 
     protected function init()
     {
         $segment = new Segment();
         $segment->setSegment('longitude');
         $segment->setName('UserCountry_Longitude');
-        $segment->setAcceptValues('-70.664, 14.326, etc.');
+        $segment->setAcceptedValues('-70.664, 14.326, etc.');
         $this->addSegment($segment);
     }
 
@@ -29,4 +33,34 @@ class Longitude extends VisitDimension
     {
         return Piwik::translate('UserCountry_Latitude');
     }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $value = $this->getUrlOverrideValueIfAllowed('long', $request);
+
+        if ($value !== false) {
+            return $value;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+
+        return $this->getLocationDetail($userInfo, LocationProvider::LONGITUDE_KEY);
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $this->getUrlOverrideValueIfAllowed('long', $request);
+    }
 }
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Provider.php b/plugins/UserCountry/Columns/Provider.php
new file mode 100644
index 0000000000000000000000000000000000000000..8eb7761db1ad66b7d15989f3a4b03be538bd5bc3
--- /dev/null
+++ b/plugins/UserCountry/Columns/Provider.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\UserCountry\Columns;
+
+use Piwik\Plugin\Manager;
+use Piwik\Plugins\UserCountry\LocationProvider;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
+use Piwik\Tracker\Request;
+
+class Provider extends Base
+{    
+    protected $fieldName = 'location_provider';
+
+    public function getName()
+    {
+        return '';
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        if (!Manager::getInstance()->isPluginInstalled('Provider')) {
+            return false;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+
+        $isp = $this->getLocationDetail($userInfo, LocationProvider::ISP_KEY);
+        $org = $this->getLocationDetail($userInfo, LocationProvider::ORG_KEY);
+
+        // if the location has provider/organization info, set it
+        if (!empty($isp)) {
+            $providerValue = $isp;
+
+            // if the org is set and not the same as the isp, add it to the provider value
+            if (!empty($org) && $org != $providerValue) {
+                $providerValue .= ' - ' . $org;
+            }
+
+            return $providerValue;
+        }
+
+        if (!empty($org)) {
+            return $org;
+        }
+
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/plugins/UserCountry/Columns/Region.php b/plugins/UserCountry/Columns/Region.php
index fd8ffc19a2fe2d1a41aaf56728c97cb9a2c19b50..6010a7de5f6178f4cf1af8cead55457d7ca77538 100644
--- a/plugins/UserCountry/Columns/Region.php
+++ b/plugins/UserCountry/Columns/Region.php
@@ -9,19 +9,23 @@
 namespace Piwik\Plugins\UserCountry\Columns;
 
 use Piwik\Piwik;
-use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\UserCountry\LocationProvider;
 use Piwik\Plugins\UserCountry\Segment;
+use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
+use Piwik\Tracker\Action;
 
-class Region extends VisitDimension
+class Region extends Base
 {    
     protected $fieldName = 'location_region';
+    protected $fieldType = 'char(2) DEFAULT NULL';
 
     protected function init()
     {
         $segment = new Segment();
         $segment->setSegment('regionCode');
         $segment->setName('UserCountry_Region');
-        $segment->setAcceptValues('01 02, OR, P8, etc.<br/>eg. region=A1;country=fr');
+        $segment->setAcceptedValues('01 02, OR, P8, etc.<br/>eg. region=A1;country=fr');
         $this->addSegment($segment);
     }
 
@@ -29,4 +33,34 @@ class Region extends VisitDimension
     {
         return Piwik::translate('UserCountry_Region');
     }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return mixed
+     */
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
+    {
+        $value = $this->getUrlOverrideValueIfAllowed('region', $request);
+
+        if ($value !== false) {
+            return $value;
+        }
+
+        $userInfo = $this->getUserInfo($request, $visitor);
+
+        return $this->getLocationDetail($userInfo, LocationProvider::REGION_CODE_KEY);
+    }
+
+    /**
+     * @param Request $request
+     * @param Visitor $visitor
+     * @param Action|null $action
+     * @return int
+     */
+    public function onExistingVisit(Request $request, Visitor $visitor, $action)
+    {
+        return $this->getUrlOverrideValueIfAllowed('region', $request);
+    }
 }
\ No newline at end of file
diff --git a/plugins/UserCountry/LocationProvider.php b/plugins/UserCountry/LocationProvider.php
index 20754a20b523a31c4c0085a600ebf42141c315f4..bd6569842464b3f04143e5e143ddd7f785881c97 100755
--- a/plugins/UserCountry/LocationProvider.php
+++ b/plugins/UserCountry/LocationProvider.php
@@ -307,14 +307,21 @@ abstract class LocationProvider
     public static function getProviderById($providerId)
     {
         foreach (self::getAvailableProviders() as $provider) {
-            $info = $provider->getInfo();
-            if ($info['id'] == $providerId) {
+            if ($provider->getId() == $providerId) {
                 return $provider;
             }
         }
+
         return false;
     }
 
+    public function getId()
+    {
+        $info = $this->getInfo();
+
+        return $info['id'];
+    }
+
     /**
      * Tries to fill in any missing information in a location result.
      *
diff --git a/plugins/UserCountry/Reports/GetCity.php b/plugins/UserCountry/Reports/GetCity.php
index 51f9a3baa352b76c987500bbe019a8f549d491c7..7619e427f64494534ad6106de9719922feea8d25 100644
--- a/plugins/UserCountry/Reports/GetCity.php
+++ b/plugins/UserCountry/Reports/GetCity.php
@@ -17,10 +17,11 @@ class GetCity extends Base
     protected function init()
     {
         parent::init();
-        $this->dimension     = new City();
-        $this->name          = Piwik::translate('UserCountry_City');
-        $this->documentation = Piwik::translate('UserCountry_getCityDocumentation') . '<br/>' . $this->getGeoIPReportDocSuffix();
-        $this->metrics       = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->dimension      = new City();
+        $this->name           = Piwik::translate('UserCountry_City');
+        $this->documentation  = Piwik::translate('UserCountry_getCityDocumentation') . '<br/>' . $this->getGeoIPReportDocSuffix();
+        $this->metrics        = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->hasGoalMetrics = true;
         $this->order = 8;
         $this->widgetTitle = Piwik::translate('UserCountry_WidgetLocation')
                            . ' (' . Piwik::translate('UserCountry_City') . ')';
diff --git a/plugins/UserCountry/Reports/GetContinent.php b/plugins/UserCountry/Reports/GetContinent.php
index 129c7405552987fbbfc8353a448fb0af9ad69348..1640dd9cc3df79336904ceec6981abe346c83286 100644
--- a/plugins/UserCountry/Reports/GetContinent.php
+++ b/plugins/UserCountry/Reports/GetContinent.php
@@ -17,10 +17,11 @@ class GetContinent extends Base
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Continent();
-        $this->name          = Piwik::translate('UserCountry_Continent');
-        $this->documentation = Piwik::translate('UserCountry_getContinentDocumentation');
-        $this->metrics       = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->dimension      = new Continent();
+        $this->name           = Piwik::translate('UserCountry_Continent');
+        $this->documentation  = Piwik::translate('UserCountry_getContinentDocumentation');
+        $this->metrics        = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->hasGoalMetrics = true;
         $this->order = 6;
         $this->widgetTitle = Piwik::translate('UserCountry_WidgetLocation')
                            . ' (' . Piwik::translate('UserCountry_Continent') . ')';
diff --git a/plugins/UserCountry/Reports/GetCountry.php b/plugins/UserCountry/Reports/GetCountry.php
index 0043c6a33cc71afba2bd4a8de7ac08495a9db7dd..4e1a0475f47e5ce606d1a0ba04674affed1d4790 100644
--- a/plugins/UserCountry/Reports/GetCountry.php
+++ b/plugins/UserCountry/Reports/GetCountry.php
@@ -18,10 +18,11 @@ class GetCountry extends Base
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Country();
-        $this->name          = Piwik::translate('UserCountry_Country');
-        $this->documentation = Piwik::translate('UserCountry_getCountryDocumentation');
-        $this->metrics       = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->dimension      = new Country();
+        $this->name           = Piwik::translate('UserCountry_Country');
+        $this->documentation  = Piwik::translate('UserCountry_getCountryDocumentation');
+        $this->metrics        = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->hasGoalMetrics = true;
         $this->order = 5;
         $this->widgetTitle = Piwik::translate('UserCountry_WidgetLocation')
                            . ' (' . Piwik::translate('UserCountry_Country') . ')';
diff --git a/plugins/UserCountry/Reports/GetRegion.php b/plugins/UserCountry/Reports/GetRegion.php
index 071f6ce326d134d7fcdf792aec6a4164f4e25786..dd038ce63f71147d794f64d462e70d775c89093f 100644
--- a/plugins/UserCountry/Reports/GetRegion.php
+++ b/plugins/UserCountry/Reports/GetRegion.php
@@ -17,10 +17,11 @@ class GetRegion extends Base
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Region();
-        $this->name          = Piwik::translate('UserCountry_Region');
-        $this->documentation = Piwik::translate('UserCountry_getRegionDocumentation') . '<br/>' . $this->getGeoIPReportDocSuffix();
-        $this->metrics       = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->dimension      = new Region();
+        $this->name           = Piwik::translate('UserCountry_Region');
+        $this->documentation  = Piwik::translate('UserCountry_getRegionDocumentation') . '<br/>' . $this->getGeoIPReportDocSuffix();
+        $this->metrics        = array('nb_visits', 'nb_uniq_visitors', 'nb_actions');
+        $this->hasGoalMetrics = true;
         $this->order = 7;
         $this->widgetTitle = Piwik::translate('UserCountry_WidgetLocation')
                            . ' (' . Piwik::translate('UserCountry_Region') . ')';
diff --git a/plugins/UserCountry/UserCountry.php b/plugins/UserCountry/UserCountry.php
index 8b75e579e1f32f85258ca97f95994e21ceb3da37..e8d9bdf9794928cb68ede18824ceee7cdc71a94a 100644
--- a/plugins/UserCountry/UserCountry.php
+++ b/plugins/UserCountry/UserCountry.php
@@ -11,13 +11,9 @@ namespace Piwik\Plugins\UserCountry;
 use Piwik\ArchiveProcessor;
 use Piwik\Common;
 use Piwik\Config;
-use Piwik\IP;
 use Piwik\Piwik;
-use Piwik\Plugin\Manager;
-use Piwik\Plugins\PrivacyManager\Config as PrivacyManagerConfig;
 use Piwik\Plugins\UserCountry\LocationProvider\GeoIp;
 use Piwik\Plugins\UserCountry\LocationProvider;
-use Piwik\Plugins\UserCountry\LocationProvider\DefaultProvider;
 use Piwik\Url;
 
 /**
@@ -35,16 +31,13 @@ class UserCountry extends \Piwik\Plugin
      */
     public function getListHooksRegistered()
     {
-        $hooks = array(
-            'Goals.getReportsWithGoalMetrics'        => 'getReportsWithGoalMetrics',
+        return array(
             'AssetManager.getStylesheetFiles'        => 'getStylesheetFiles',
             'AssetManager.getJavaScriptFiles'        => 'getJsFiles',
-            'Tracker.newVisitorInformation'          => 'enrichVisitWithLocation',
             'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys',
             'Tracker.setTrackerCacheGeneral'         => 'setTrackerCacheGeneral',
             'Insights.addReportToOverview'           => 'addReportToInsightsOverview'
         );
-        return $hooks;
     }
 
     public function addReportToInsightsOverview(&$reports)
@@ -67,121 +60,6 @@ class UserCountry extends \Piwik\Plugin
         $jsFiles[] = "plugins/UserCountry/javascripts/userCountry.js";
     }
 
-    public function enrichVisitWithLocation(&$visitorInfo, \Piwik\Tracker\Request $request)
-    {
-        require_once PIWIK_INCLUDE_PATH . "/plugins/UserCountry/LocationProvider.php";
-
-        $privacyConfig = new PrivacyManagerConfig();
-
-        $ipAddress = IP::N2P($privacyConfig->useAnonymizedIpForVisitEnrichment ? $visitorInfo['location_ip'] : $request->getIp());
-        $userInfo = array(
-            'lang' => $visitorInfo['location_browser_lang'],
-            'ip' => $ipAddress
-        );
-
-        $id = Common::getCurrentLocationProviderId();
-        $provider = LocationProvider::getProviderById($id);
-        if ($provider === false) {
-            $id = DefaultProvider::ID;
-            $provider = LocationProvider::getProviderById($id);
-            Common::printDebug("GEO: no current location provider sent, falling back to default '$id' one.");
-        }
-
-        $location = $provider->getLocation($userInfo);
-
-        // if we can't find a location, use default provider
-        if ($location === false) {
-            $defaultId = DefaultProvider::ID;
-            $provider = LocationProvider::getProviderById($defaultId);
-            $location = $provider->getLocation($userInfo);
-            Common::printDebug("GEO: couldn't find a location with Geo Module '$id', using Default '$defaultId' provider as fallback...");
-            $id = $defaultId;
-        }
-        Common::printDebug("GEO: Found IP $ipAddress location (provider '" . $id . "'): " . var_export($location, true));
-
-        if (empty($location['country_code'])) { // sanity check
-            $location['country_code'] = \Piwik\Tracker\Visit::UNKNOWN_CODE;
-        }
-
-        // add optional location components
-        $this->updateVisitInfoWithLocation($visitorInfo, $location);
-    }
-
-    /**
-     * Sets visitor info array with location info.
-     *
-     * @param array $visitorInfo
-     * @param array $location See LocationProvider::getLocation for more info.
-     */
-    private function updateVisitInfoWithLocation(&$visitorInfo, $location)
-    {
-        static $logVisitToLowerLocationMapping = array(
-            'location_country' => LocationProvider::COUNTRY_CODE_KEY,
-        );
-
-        static $logVisitToLocationMapping = array(
-            'location_region'    => LocationProvider::REGION_CODE_KEY,
-            'location_city'      => LocationProvider::CITY_NAME_KEY,
-            'location_latitude'  => LocationProvider::LATITUDE_KEY,
-            'location_longitude' => LocationProvider::LONGITUDE_KEY,
-        );
-
-        foreach ($logVisitToLowerLocationMapping as $column => $locationKey) {
-            if (!empty($location[$locationKey])) {
-                $visitorInfo[$column] = strtolower($location[$locationKey]);
-            }
-        }
-
-        foreach ($logVisitToLocationMapping as $column => $locationKey) {
-            if (!empty($location[$locationKey])) {
-                $visitorInfo[$column] = $location[$locationKey];
-            }
-        }
-
-        // if the location has provider/organization info, set it
-        if (!empty($location[LocationProvider::ISP_KEY])) {
-            $providerValue = $location[LocationProvider::ISP_KEY];
-
-            // if the org is set and not the same as the isp, add it to the provider value
-            if (!empty($location[LocationProvider::ORG_KEY])
-                && $location[LocationProvider::ORG_KEY] != $providerValue
-            ) {
-                $providerValue .= ' - ' . $location[LocationProvider::ORG_KEY];
-            }
-        } else if (!empty($location[LocationProvider::ORG_KEY])) {
-            $providerValue = $location[LocationProvider::ORG_KEY];
-        }
-
-        if (isset($providerValue)
-            && Manager::getInstance()->isPluginInstalled('Provider')) {
-            $visitorInfo['location_provider'] = $providerValue;
-        }
-    }
-
-    public function getReportsWithGoalMetrics(&$dimensions)
-    {
-        $dimensions = array_merge($dimensions, array(
-                                                    array('category' => Piwik::translate('General_Visit'),
-                                                          'name'     => Piwik::translate('UserCountry_Country'),
-                                                          'module'   => 'UserCountry',
-                                                          'action'   => 'getCountry',
-                                                    ),
-                                                    array('category' => Piwik::translate('General_Visit'),
-                                                          'name'     => Piwik::translate('UserCountry_Continent'),
-                                                          'module'   => 'UserCountry',
-                                                          'action'   => 'getContinent',
-                                                    ),
-                                                    array('category' => Piwik::translate('General_Visit'),
-                                                          'name'     => Piwik::translate('UserCountry_Region'),
-                                                          'module'   => 'UserCountry',
-                                                          'action'   => 'getRegion'),
-                                                    array('category' => Piwik::translate('General_Visit'),
-                                                          'name'     => Piwik::translate('UserCountry_City'),
-                                                          'module'   => 'UserCountry',
-                                                          'action'   => 'getCity'),
-                                               ));
-    }
-
     /**
      * Returns a list of country codes for a given continent code.
      *
diff --git a/plugins/UserSettings/Columns/Browser.php b/plugins/UserSettings/Columns/Browser.php
index 80055afd9186af5fbf0b40e71ecc914d3d780ef1..e3534b426eb5130d8e5d0d221df4b619786312ba 100644
--- a/plugins/UserSettings/Columns/Browser.php
+++ b/plugins/UserSettings/Columns/Browser.php
@@ -22,7 +22,7 @@ class Browser extends BrowserName
         $segment = new Segment();
         $segment->setSegment('browserCode');
         $segment->setName('UserSettings_ColumnBrowser');
-        $segment->setAcceptValues('FF, IE, CH, SF, OP, etc.');
+        $segment->setAcceptedValues('FF, IE, CH, SF, OP, etc.');
         $this->addSegment($segment);
     }
 
diff --git a/plugins/UserSettings/Columns/Browserfamily.php b/plugins/UserSettings/Columns/Browserfamily.php
index cdd40f67bf6874245a9a942e04633e1bce99d2c0..227a31dd4f7378f8c21a7f4161dc74ed151af057 100644
--- a/plugins/UserSettings/Columns/Browserfamily.php
+++ b/plugins/UserSettings/Columns/Browserfamily.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\UserSettings\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Browserfamily extends VisitDimension
+class BrowserFamily extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/UserSettings/Columns/Browserversion.php b/plugins/UserSettings/Columns/Browserversion.php
index e93e7f19f4c38eaedfe46930e95155bb176f32bc..4decf254506f9f2f4d1e050d8ecdf5d2475a61ea 100644
--- a/plugins/UserSettings/Columns/Browserversion.php
+++ b/plugins/UserSettings/Columns/Browserversion.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\UserSettings\Columns;
 use Piwik\Piwik;
 use Piwik\Plugins\UserSettings\Segment;
 
-class Browserversion extends \Piwik\Plugins\DevicesDetection\Columns\BrowserVersion
+class BrowserVersion extends \Piwik\Plugins\DevicesDetection\Columns\BrowserVersion
 {    
     protected $fieldName = 'config_browser_version';
     protected $fieldType = 'VARCHAR(20) NOT NULL';
@@ -21,7 +21,7 @@ class Browserversion extends \Piwik\Plugins\DevicesDetection\Columns\BrowserVers
         $segment = new Segment();
         $segment->setSegment('browserVersion');
         $segment->setName('UserSettings_ColumnBrowserVersion');
-        $segment->setAcceptValues('1.0, 8.0, etc.');
+        $segment->setAcceptedValues('1.0, 8.0, etc.');
         $this->addSegment($segment);
     }
 
diff --git a/plugins/UserSettings/Columns/Language.php b/plugins/UserSettings/Columns/Language.php
index 0345975639884aed30d26c59f4cf5b258c4329f0..a9997e806a4e364900f336e6b954c5ab17f534c9 100644
--- a/plugins/UserSettings/Columns/Language.php
+++ b/plugins/UserSettings/Columns/Language.php
@@ -12,6 +12,7 @@ use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class Language extends VisitDimension
 {
@@ -25,11 +26,11 @@ class Language extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return substr($request->getBrowserLanguage(), 0, 20);
     }
diff --git a/plugins/UserSettings/Columns/Operatingsystem.php b/plugins/UserSettings/Columns/Operatingsystem.php
index b65a0cbc9f30a1d0497fbe9d15bac4006814b9fd..0a6d6770cfca51bfe5e38baa8650d80b6e6c8d3d 100644
--- a/plugins/UserSettings/Columns/Operatingsystem.php
+++ b/plugins/UserSettings/Columns/Operatingsystem.php
@@ -22,7 +22,7 @@ class Operatingsystem extends Os
         $segment = new Segment();
         $segment->setSegment('operatingSystemCode');
         $segment->setName('UserSettings_ColumnOperatingSystem');
-        $segment->setAcceptValues('WXP, WI7, MAC, LIN, AND, IPD, etc.');
+        $segment->setAcceptedValues('WXP, WI7, MAC, LIN, AND, IPD, etc.');
         $this->addSegment($segment);
     }
 
diff --git a/plugins/UserSettings/Columns/Operatingsystemfamily.php b/plugins/UserSettings/Columns/Operatingsystemfamily.php
index 1b1f7411f9261c12360aac083fa848a994cccdb7..b4c2d6640d46f7d1cb6c898e402550417de2e213 100644
--- a/plugins/UserSettings/Columns/Operatingsystemfamily.php
+++ b/plugins/UserSettings/Columns/Operatingsystemfamily.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\UserSettings\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Operatingsystemfamily extends VisitDimension
+class OperatingsystemFamily extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/UserSettings/Columns/Resolution.php b/plugins/UserSettings/Columns/Resolution.php
index 407daf7db42c59cfcbdf49bd3f22eb4e698fd04a..19bf2a1ee5dc46d9912584103579b9ab9936a0ec 100644
--- a/plugins/UserSettings/Columns/Resolution.php
+++ b/plugins/UserSettings/Columns/Resolution.php
@@ -13,6 +13,7 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\UserSettings\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
 class Resolution extends VisitDimension
 {    
@@ -24,17 +25,17 @@ class Resolution extends VisitDimension
         $segment = new Segment();
         $segment->setSegment('resolution');
         $segment->setName('UserSettings_ColumnResolution');
-        $segment->setAcceptValues('1280x1024, 800x600, etc.');
+        $segment->setAcceptedValues('1280x1024, 800x600, etc.');
         $this->addSegment($segment);
     }
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         $resolution = $request->getParam('res');
 
diff --git a/plugins/UserSettings/Columns/Typeofscreen.php b/plugins/UserSettings/Columns/Typeofscreen.php
index 592076f136aee207a0d9908ba2f4810f7118afab..a042d2323d80a84a7f52863fbaf6ef762d7b0944 100644
--- a/plugins/UserSettings/Columns/Typeofscreen.php
+++ b/plugins/UserSettings/Columns/Typeofscreen.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\UserSettings\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Typeofscreen extends VisitDimension
+class TypeOfScreen extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/UserSettings/Reports/Base.php b/plugins/UserSettings/Reports/Base.php
index 4ed0ea7360b56fc8c1a8d1151b76f1e6958a5eaf..bfa11a78c3904faa7190e3a0d39b02f84395c855 100644
--- a/plugins/UserSettings/Reports/Base.php
+++ b/plugins/UserSettings/Reports/Base.php
@@ -8,7 +8,6 @@
  */
 namespace Piwik\Plugins\UserSettings\Reports;
 
-use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
 
@@ -30,28 +29,4 @@ abstract class Base extends \Piwik\Plugin\Report
             $view->config->max_graph_elements = 5;
         }
     }
-
-    protected function getBrowserRelatedReports()
-    {
-        return array(
-            'UserSettings.getBrowser'        => Piwik::translate('UserSettings_Browsers'),
-            'UserSettings.getBrowserVersion' => Piwik::translate('UserSettings_ColumnBrowserVersion')
-        );
-    }
-
-    protected function getOsRelatedReports()
-    {
-        return array(
-            'UserSettings.getOSFamily' => Piwik::translate('UserSettings_OperatingSystemFamily'),
-            'UserSettings.getOS'       => Piwik::translate('UserSettings_OperatingSystems')
-        );
-    }
-
-    protected function getWideScreenDeviceTypeRelatedReports()
-    {
-        return array(
-            'UserSettings.getMobileVsDesktop' => Piwik::translate('UserSettings_MobileVsDesktop'),
-            'UserSettings.getWideScreen'      => Piwik::translate('UserSettings_ColumnTypeOfScreen')
-        );
-    }
 }
diff --git a/plugins/UserSettings/Reports/GetBrowser.php b/plugins/UserSettings/Reports/GetBrowser.php
index c9c56ccfe9dcc2e23734bc75b91333109e36e586..b0a169bf9af55795e2167bd08b3f01f0b9e4fcd0 100644
--- a/plugins/UserSettings/Reports/GetBrowser.php
+++ b/plugins/UserSettings/Reports/GetBrowser.php
@@ -31,11 +31,16 @@ class GetBrowser extends Base
 
         $view->config->title = Piwik::translate('UserSettings_Browsers');
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getBrowserRelatedReports());
 
         if ($view->isViewDataTableId(Graph::ID)) {
             $view->config->max_graph_elements = 7;
         }
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetBrowserVersion()
+        );
+    }
 }
diff --git a/plugins/UserSettings/Reports/GetBrowserType.php b/plugins/UserSettings/Reports/GetBrowserType.php
index 34ab6aab327d524ba14fb2e6469b2353049bbc5d..063abab7cee8e20859e223887386e48d5b2a7fd9 100644
--- a/plugins/UserSettings/Reports/GetBrowserType.php
+++ b/plugins/UserSettings/Reports/GetBrowserType.php
@@ -11,14 +11,14 @@ namespace Piwik\Plugins\UserSettings\Reports;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Pie;
-use Piwik\Plugins\UserSettings\Columns\Browserfamily;
+use Piwik\Plugins\UserSettings\Columns\BrowserFamily;
 
 class GetBrowserType extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Browserfamily();
+        $this->dimension     = new BrowserFamily();
         $this->name          = Piwik::translate('UserSettings_WidgetBrowserFamilies');
         $this->documentation = Piwik::translate('UserSettings_WidgetBrowserFamiliesDocumentation', '<br />');
         $this->order = 3;
diff --git a/plugins/UserSettings/Reports/GetBrowserVersion.php b/plugins/UserSettings/Reports/GetBrowserVersion.php
index d04f02f2342fb43759fa319df7e9d6eaf20b1340..31cb0a74c7672fe0f22e3a7ca7febf0a3763b620 100644
--- a/plugins/UserSettings/Reports/GetBrowserVersion.php
+++ b/plugins/UserSettings/Reports/GetBrowserVersion.php
@@ -11,14 +11,14 @@ namespace Piwik\Plugins\UserSettings\Reports;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\UserSettings\Columns\Browserversion;
+use Piwik\Plugins\UserSettings\Columns\BrowserVersion;
 
 class GetBrowserVersion extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Browserversion();
+        $this->dimension     = new BrowserVersion();
         $this->name          = Piwik::translate('UserSettings_WidgetBrowserVersion');
         $this->documentation = ''; // TODO
         $this->order = 2;
@@ -31,11 +31,17 @@ class GetBrowserVersion extends Base
 
         $view->config->title = Piwik::translate('UserSettings_ColumnBrowserVersion');
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getBrowserRelatedReports());
 
         if ($view->isViewDataTableId(Graph::ID)) {
             $view->config->max_graph_elements = 7;
         }
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetBrowser()
+        );
+    }
+
 }
diff --git a/plugins/UserSettings/Reports/GetMobileVsDesktop.php b/plugins/UserSettings/Reports/GetMobileVsDesktop.php
index 20e1bcb3351ef2186d156252502ed6cdc2d920b2..4eb06d5b264a43ddcf3affebbd66b0fc1b80108a 100644
--- a/plugins/UserSettings/Reports/GetMobileVsDesktop.php
+++ b/plugins/UserSettings/Reports/GetMobileVsDesktop.php
@@ -31,7 +31,13 @@ class GetMobileVsDesktop extends Base
 
         $view->config->title = Piwik::translate('UserSettings_MobileVsDesktop');
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getWideScreenDeviceTypeRelatedReports());
+    }
+
+    public function getRelatedReports()
+    {
+        return array(
+            new GetWideScreen()
+        );
     }
 
 }
diff --git a/plugins/UserSettings/Reports/GetOS.php b/plugins/UserSettings/Reports/GetOS.php
index 040e69c4181e65eeca3844c3f880b77451d5301a..d42793630e0980d9711f845ad87f505f785a7fd2 100644
--- a/plugins/UserSettings/Reports/GetOS.php
+++ b/plugins/UserSettings/Reports/GetOS.php
@@ -30,7 +30,12 @@ class GetOS extends Base
 
         $view->config->title = Piwik::translate('UserSettings_OperatingSystems');
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getOsRelatedReports());
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetOSFamily()
+        );
+    }
 }
diff --git a/plugins/UserSettings/Reports/GetOSFamily.php b/plugins/UserSettings/Reports/GetOSFamily.php
index cb6451f03b8961c5fb0d4e2938879ff29d59c43b..c1c112d71c0a7bb7f42b972ee2dce6bd8aeee95a 100644
--- a/plugins/UserSettings/Reports/GetOSFamily.php
+++ b/plugins/UserSettings/Reports/GetOSFamily.php
@@ -10,14 +10,14 @@ namespace Piwik\Plugins\UserSettings\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\UserSettings\Columns\Operatingsystemfamily;
+use Piwik\Plugins\UserSettings\Columns\OperatingsystemFamily;
 
 class GetOSFamily extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Operatingsystemfamily();
+        $this->dimension     = new OperatingsystemFamily();
         $this->name          = Piwik::translate('UserSettings_OperatingSystemFamily');
         $this->documentation = ''; // TODO
         $this->order = 8;
@@ -30,7 +30,13 @@ class GetOSFamily extends Base
 
         $view->config->title = $this->name;
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getOsRelatedReports());
+    }
+
+    public function getRelatedReports()
+    {
+        return array(
+            new GetOS()
+        );
     }
 
 }
diff --git a/plugins/UserSettings/Reports/GetWideScreen.php b/plugins/UserSettings/Reports/GetWideScreen.php
index bfadd87a9e223adec19fd4cc79fc515b0f790afd..23b6547613126f31c5f808c45a2d81147f37cf42 100644
--- a/plugins/UserSettings/Reports/GetWideScreen.php
+++ b/plugins/UserSettings/Reports/GetWideScreen.php
@@ -10,14 +10,14 @@ namespace Piwik\Plugins\UserSettings\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\UserSettings\Columns\Typeofscreen;
+use Piwik\Plugins\UserSettings\Columns\TypeOfScreen;
 
 class GetWideScreen extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Typeofscreen();
+        $this->dimension     = new TypeOfScreen();
         $this->name          = Piwik::translate('UserSettings_WidgetWidescreen');
         $this->documentation = ''; // TODO
         $this->order = 5;
@@ -33,7 +33,12 @@ class GetWideScreen extends Base
         $view->config->show_pagination_control = false;
         $view->config->show_limit_control      = false;
         $view->config->addTranslation('label', $this->dimension->getName());
-        $view->config->addRelatedReports($this->getWideScreenDeviceTypeRelatedReports());
     }
 
+    public function getRelatedReports()
+    {
+        return array(
+            new GetMobileVsDesktop()
+        );
+    }
 }
diff --git a/plugins/VisitTime/Columns/Dayoftheweek.php b/plugins/VisitTime/Columns/Dayoftheweek.php
index 950f3f80a1042a0388134b465d19a5942fd0b51d..99b8f819d501c4f80f3737ddf899759e6a289956 100644
--- a/plugins/VisitTime/Columns/Dayoftheweek.php
+++ b/plugins/VisitTime/Columns/Dayoftheweek.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\VisitTime\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Dayoftheweek extends VisitDimension
+class DayOfTheWeek extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/VisitTime/Columns/Localtime.php b/plugins/VisitTime/Columns/Localtime.php
index 6f0cc5f7272dba48e4303366ca6532cae46c87bb..ea57eb3e683be5b151a2c37e4aa413a36c4cc04b 100644
--- a/plugins/VisitTime/Columns/Localtime.php
+++ b/plugins/VisitTime/Columns/Localtime.php
@@ -13,8 +13,9 @@ use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\VisitTime\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
-class Localtime extends VisitDimension
+class LocalTime extends VisitDimension
 {    
     protected $fieldName = 'visitor_localtime';
     protected $fieldType = 'TIME NOT NULL';
@@ -25,7 +26,7 @@ class Localtime extends VisitDimension
         $segment->setSegment('visitLocalHour');
         $segment->setName('VisitTime_ColumnLocalTime');
         $segment->setSqlSegment('HOUR(log_visit.visitor_localtime)');
-        $segment->setAcceptValues('0, 1, 2, 3, ..., 20, 21, 22, 23');
+        $segment->setAcceptedValues('0, 1, 2, 3, ..., 20, 21, 22, 23');
         $this->addSegment($segment);
     }
 
@@ -36,11 +37,11 @@ class Localtime extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return $request->getLocalTime();
     }
diff --git a/plugins/VisitTime/Columns/Servertime.php b/plugins/VisitTime/Columns/Servertime.php
index 69cf2f54dc8284626bfcd0a5b0af4889c4f6b100..6e69670d93e548a957a9fca367e62a0c9f727394 100644
--- a/plugins/VisitTime/Columns/Servertime.php
+++ b/plugins/VisitTime/Columns/Servertime.php
@@ -12,7 +12,7 @@ use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 use Piwik\Plugins\VisitTime\Segment;
 
-class Servertime extends VisitDimension
+class ServerTime extends VisitDimension
 {    
     protected $fieldName = 'visit_last_action_time';
 
@@ -22,7 +22,7 @@ class Servertime extends VisitDimension
         $segment->setSegment('visitServerHour');
         $segment->setName('VisitTime_ColumnServerTime');
         $segment->setSqlSegment('HOUR(log_visit.visit_last_action_time)');
-        $segment->setAcceptValues('0, 1, 2, 3, ..., 20, 21, 22, 23');
+        $segment->setAcceptedValues('0, 1, 2, 3, ..., 20, 21, 22, 23');
         $this->addSegment($segment);
     }
 
diff --git a/plugins/VisitTime/Reports/GetByDayOfWeek.php b/plugins/VisitTime/Reports/GetByDayOfWeek.php
index 3905beaac2ffb441d8a588571a2e89f63a289890..a01d0ed8cec69ee7caa1270e08b1c87d9e1a3c78 100644
--- a/plugins/VisitTime/Reports/GetByDayOfWeek.php
+++ b/plugins/VisitTime/Reports/GetByDayOfWeek.php
@@ -12,7 +12,7 @@ use Piwik\Common;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\VisitTime\Columns\Dayoftheweek;
+use Piwik\Plugins\VisitTime\Columns\DayOfTheWeek;
 use Piwik\Period;
 use Piwik\Site;
 
@@ -21,7 +21,7 @@ class GetByDayOfWeek extends Base
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Dayoftheweek();
+        $this->dimension     = new DayOfTheWeek();
         $this->name          = Piwik::translate('VisitTime_VisitsByDayOfWeek');
         $this->documentation = Piwik::translate('VisitTime_WidgetByDayOfWeekDocumentation');
         $this->constantRowsCount = true;
diff --git a/plugins/VisitTime/Reports/GetVisitInformationPerLocalTime.php b/plugins/VisitTime/Reports/GetVisitInformationPerLocalTime.php
index 330aaaf3aa88293144f4988e28b417bdd77149c6..7700cc67d55c5be6ae344078b16a00959b4ef6d5 100644
--- a/plugins/VisitTime/Reports/GetVisitInformationPerLocalTime.php
+++ b/plugins/VisitTime/Reports/GetVisitInformationPerLocalTime.php
@@ -12,14 +12,14 @@ use Piwik\Common;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\VisitTime\Columns\Localtime;
+use Piwik\Plugins\VisitTime\Columns\LocalTime;
 
 class GetVisitInformationPerLocalTime extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Localtime();
+        $this->dimension     = new LocalTime();
         $this->name          = Piwik::translate('VisitTime_WidgetLocalTime');
         $this->documentation = Piwik::translate('VisitTime_WidgetLocalTimeDocumentation', array('<strong>', '</strong>'));
         $this->constantRowsCount = true;
diff --git a/plugins/VisitTime/Reports/GetVisitInformationPerServerTime.php b/plugins/VisitTime/Reports/GetVisitInformationPerServerTime.php
index 68fd602aee261392dee5b4ec46cf12a4482095d7..87901a97ac4ebb87f23d4c35f728596b2043b303 100644
--- a/plugins/VisitTime/Reports/GetVisitInformationPerServerTime.php
+++ b/plugins/VisitTime/Reports/GetVisitInformationPerServerTime.php
@@ -11,17 +11,18 @@ namespace Piwik\Plugins\VisitTime\Reports;
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\VisitTime\Columns\Servertime;
+use Piwik\Plugins\VisitTime\Columns\ServerTime;
 
 class GetVisitInformationPerServerTime extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Servertime();
+        $this->dimension     = new ServerTime();
         $this->name          = Piwik::translate('VisitTime_WidgetServerTime');
         $this->documentation = Piwik::translate('VisitTime_WidgetServerTimeDocumentation', array('<strong>', '</strong>'));
         $this->constantRowsCount = true;
+        $this->hasGoalMetrics = true;
         $this->order = 15;
         $this->widgetTitle  = 'VisitTime_WidgetServerTime';
     }
diff --git a/plugins/VisitTime/VisitTime.php b/plugins/VisitTime/VisitTime.php
index 3a4d3b7685ddad91dc74ca7849a3c080ee50546c..bbec17926825dce0a4372662e8d6880e54d54b2a 100644
--- a/plugins/VisitTime/VisitTime.php
+++ b/plugins/VisitTime/VisitTime.php
@@ -8,39 +8,7 @@
  */
 namespace Piwik\Plugins\VisitTime;
 
-use Exception;
-use Piwik\ArchiveProcessor;
-use Piwik\Common;
-use Piwik\Period;
-use Piwik\Piwik;
-use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Bar;
-use Piwik\Site;
-
-/**
- *
- */
+// empty plugin definition, otherwise plugin won't be installed during test run
 class VisitTime extends \Piwik\Plugin
 {
-    /**
-     * @see Piwik\Plugin::getListHooksRegistered
-     */
-    public function getListHooksRegistered()
-    {
-        return array(
-            'Goals.getReportsWithGoalMetrics' => 'getReportsWithGoalMetrics'
-        );
-    }
-
-    public function getReportsWithGoalMetrics(&$dimensions)
-    {
-        $dimensions[] = array('category' => Piwik::translate('VisitTime_ColumnServerTime'),
-                              'name'     => Piwik::translate('VisitTime_ColumnServerTime'),
-                              'module'   => 'VisitTime',
-                              'action'   => 'getVisitInformationPerServerTime',
-        );
-    }
-
-
 }
diff --git a/plugins/VisitorInterest/Columns/Pagespervisit.php b/plugins/VisitorInterest/Columns/Pagespervisit.php
index d16beb449b96700e66a80f2df1a4d74bb97c8ddf..a85b8bf71ef86b6a10c4a5f27512fcb59a4850e3 100644
--- a/plugins/VisitorInterest/Columns/Pagespervisit.php
+++ b/plugins/VisitorInterest/Columns/Pagespervisit.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\VisitorInterest\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Pagespervisit extends VisitDimension
+class PagesPerVisit extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/VisitorInterest/Columns/Visitduration.php b/plugins/VisitorInterest/Columns/Visitduration.php
index 69553678921457190a30e3f74196ec78d4889075..e483bc7c3ab6f907c91711866a0d19f7b3db3934 100644
--- a/plugins/VisitorInterest/Columns/Visitduration.php
+++ b/plugins/VisitorInterest/Columns/Visitduration.php
@@ -11,7 +11,7 @@ namespace Piwik\Plugins\VisitorInterest\Columns;
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
 
-class Visitduration extends VisitDimension
+class VisitDuration extends VisitDimension
 {    
     public function getName()
     {
diff --git a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
index 075c6e7aaeae560e248dd81b2883f075a4ce3136..e64515181d2da3ca46b78a0f5f7a22f25db04152 100644
--- a/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
+++ b/plugins/VisitorInterest/Columns/Visitsbydayssincelastvisit.php
@@ -10,14 +10,26 @@ namespace Piwik\Plugins\VisitorInterest\Columns;
 
 use Piwik\Piwik;
 use Piwik\Plugin\VisitDimension;
+use Piwik\Plugins\CoreHome\Segment;
 use Piwik\Tracker\Action;
 use Piwik\Tracker\Request;
+use Piwik\Tracker\Visitor;
 
-class Visitsbydayssincelastvisit extends VisitDimension
+class VisitsByDaysSinceLastVisit extends VisitDimension
 {
     protected $fieldName = 'visitor_days_since_last';
     protected $fieldType = 'SMALLINT(5) UNSIGNED NOT NULL';
 
+    protected function init()
+    {
+        $segment = new Segment();
+        $segment->setSegment('daysSinceLastVisit');
+        $segment->setName('General_DaysSinceLastVisit');
+        $segment->setType(Segment::TYPE_METRIC);
+
+        $this->addSegment($segment);
+    }
+
     public function getName()
     {
         return Piwik::translate('VisitorInterest_VisitsByDaysSinceLast');
@@ -25,11 +37,11 @@ class Visitsbydayssincelastvisit extends VisitDimension
 
     /**
      * @param Request $request
-     * @param array   $visit
+     * @param Visitor $visitor
      * @param Action|null $action
-     * @return int
+     * @return mixed
      */
-    public function onNewVisit(Request $request, $visit, $action)
+    public function onNewVisit(Request $request, Visitor $visitor, $action)
     {
         return $request->getDaysSinceLastVisit();
     }
diff --git a/plugins/VisitorInterest/Reports/GetNumberOfVisitsByDaysSinceLast.php b/plugins/VisitorInterest/Reports/GetNumberOfVisitsByDaysSinceLast.php
index cd5ca482dff222bd10fe76f9d00eb6febb4c75bd..679917fdcca23b218b042ac71c86fd549c58f0c6 100644
--- a/plugins/VisitorInterest/Reports/GetNumberOfVisitsByDaysSinceLast.php
+++ b/plugins/VisitorInterest/Reports/GetNumberOfVisitsByDaysSinceLast.php
@@ -10,14 +10,14 @@ namespace Piwik\Plugins\VisitorInterest\Reports;
 
 use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
-use Piwik\Plugins\VisitorInterest\Columns\Visitsbydayssincelastvisit;
+use Piwik\Plugins\VisitorInterest\Columns\VisitsByDaysSinceLastVisit;
 
 class GetNumberOfVisitsByDaysSinceLast extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Visitsbydayssincelastvisit();
+        $this->dimension     = new VisitsByDaysSinceLastVisit();
         $this->name          = Piwik::translate('VisitorInterest_VisitsByDaysSinceLast');
         $this->documentation = Piwik::translate('VisitorInterest_WidgetVisitsByDaysSinceLastDocumentation');
         $this->metrics       = array('nb_visits');
diff --git a/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerPage.php b/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerPage.php
index c805195e93e5e21c8f3832d3042b647dd3204e26..3efc243ccc7f78ec919951e7a7e4df1b2c1a82ca 100644
--- a/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerPage.php
+++ b/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerPage.php
@@ -12,14 +12,14 @@ use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Cloud;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\VisitorInterest\Columns\Pagespervisit;
+use Piwik\Plugins\VisitorInterest\Columns\PagesPerVisit;
 
 class GetNumberOfVisitsPerPage extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Pagespervisit();
+        $this->dimension     = new PagesPerVisit();
         $this->name          = Piwik::translate('VisitorInterest_WidgetPages');
         $this->documentation = Piwik::translate('VisitorInterest_WidgetPagesDocumentation')
                              . '<br />' . Piwik::translate('General_ChangeTagCloudView');
diff --git a/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerVisitDuration.php b/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerVisitDuration.php
index 7b79dd92edcdcd86090a1623d058cce35d39e372..a447ea22fe76192f679946d569b0ed971ac2907b 100644
--- a/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerVisitDuration.php
+++ b/plugins/VisitorInterest/Reports/GetNumberOfVisitsPerVisitDuration.php
@@ -12,14 +12,14 @@ use Piwik\Piwik;
 use Piwik\Plugin\ViewDataTable;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Cloud;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Graph;
-use Piwik\Plugins\VisitorInterest\Columns\Visitduration;
+use Piwik\Plugins\VisitorInterest\Columns\VisitDuration;
 
 class GetNumberOfVisitsPerVisitDuration extends Base
 {
     protected function init()
     {
         parent::init();
-        $this->dimension     = new Visitduration();
+        $this->dimension     = new VisitDuration();
         $this->name          = Piwik::translate('VisitorInterest_WidgetLengths');
         $this->documentation = Piwik::translate('VisitorInterest_WidgetLengthsDocumentation')
                              . '<br />' . Piwik::translate('General_ChangeTagCloudView');
diff --git a/plugins/VisitsSummary/Reports/Get.php b/plugins/VisitsSummary/Reports/Get.php
index b3dfe1ff1ac00d2213bfb97a6929337b09016654..433eb85ab72f9cf5c0616ee6824f94a29223461b 100644
--- a/plugins/VisitsSummary/Reports/Get.php
+++ b/plugins/VisitsSummary/Reports/Get.php
@@ -34,7 +34,7 @@ class Get extends \Piwik\Plugin\Report
         $this->order = 1;
     }
 
-    protected function getMetrics()
+    public function getMetrics()
     {
         $metrics = parent::getMetrics();