diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php
index 99d5a9668d2e89aca25e5891e6a35cada78101f5..be1ccd4d409b0d29018c4001edd1169487fe0683 100644
--- a/core/Plugin/Controller.php
+++ b/core/Plugin/Controller.php
@@ -32,7 +32,7 @@ use Piwik\SettingsPiwik;
 use Piwik\Site;
 use Piwik\Url;
 use Piwik\View;
-use Piwik\ViewDataTable;
+use Piwik\ViewDataTable as ViewDataTableBuilder;
 
 /**
  * Parent class of all plugins Controllers (located in /plugins/PluginName/Controller.php
@@ -179,7 +179,7 @@ abstract class Controller
      */
     protected function getLastUnitGraph($currentModuleName, $currentControllerAction, $apiMethod)
     {
-        $view = ViewDataTable::factory(
+        $view = ViewDataTableBuilder::factory(
             'graphEvolution', $apiMethod, $currentModuleName . '.' . $currentControllerAction, $forceDefault = true);
         $view->show_goals = false;
         return $view;
diff --git a/core/Plugin/ViewDataTable.php b/core/Plugin/ViewDataTable.php
index 676256279ff147cfe49ec998af9d3bc7ef3fed7f..3d2e1cc6943bbc03a858d1752ac83f907477f3cb 100644
--- a/core/Plugin/ViewDataTable.php
+++ b/core/Plugin/ViewDataTable.php
@@ -22,7 +22,6 @@ use Piwik\Piwik;
 use Piwik\Plugins\API\API;
 use Piwik\Plugins\PrivacyManager\PrivacyManager;
 use Piwik\Site;
-use Piwik\ViewDataTable\Visualization;
 use Piwik\ViewDataTable\VisualizationPropertiesProxy;
 use Piwik\Visualization\Config as VizConfig;
 use Piwik\Visualization\Request as VizRequest;
@@ -116,6 +115,9 @@ abstract class ViewDataTable
         $this->config        = new VizConfig($currentControllerName, $currentControllerAction);
         $this->config->subtable_controller_action = $currentControllerAction;
 
+        // TODO remove me
+        $this->config->visualization_properties = new VisualizationPropertiesProxy(get_class($this));
+
         $this->request = new \Piwik\ViewDataTable\Request($this->requestConfig);
 
         $this->setViewProperties($defaultReportProperties);
@@ -251,6 +253,7 @@ abstract class ViewDataTable
             return null;
         }
 
+        // TODO parent class should not know anything about children
         $visualizationIds = Visualization::getVisualizationIdsWithInheritance(get_class($this));
         foreach ($visualizationIds as $visualizationId) {
             if (empty($properties[$visualizationId])) {
@@ -423,7 +426,7 @@ abstract class ViewDataTable
             }
 
             if ($this->config->show_non_core_visualizations) {
-                $nonCoreVisualizations = Visualization::getNonCoreVisualizations();
+                $nonCoreVisualizations = \Piwik\ViewDataTable::getNonCoreVisualizations();
                 $nonCoreVisualizationInfo = Visualization::getVisualizationInfoFor($nonCoreVisualizations);
 
                 foreach ($nonCoreVisualizationInfo as $format => $info) {
@@ -484,6 +487,22 @@ abstract class ViewDataTable
         }
     }
 
+    /**
+     * Returns an array mapping visualization IDs with information necessary for adding the
+     * visualizations to the footer of DataTable views.
+     *
+     * @param array $visualizations An array mapping visualization IDs w/ their associated classes.
+     * @return array
+     */
+    public static function getVisualizationInfoFor($visualizations)
+    {
+        $result = array();
+        foreach ($visualizations as $vizId => $vizClass) {
+            $result[$vizId] = array('table_icon' => $vizClass::FOOTER_ICON, 'title' => $vizClass::FOOTER_ICON_TITLE);
+        }
+        return $result;
+    }
+
     public static function getDefaultPropertyValues()
     {
         return array();
@@ -501,9 +520,7 @@ abstract class ViewDataTable
      */
     public function getOverridableProperties()
     {
-        $params = array_merge(VizConfig::$overridableProperties, VizRequest::$overridableProperties);
-
-        return $this->getPropertyNameListWithMetaProperty($params, __FUNCTION__);
+        return array_merge(VizConfig::$overridableProperties, VizRequest::$overridableProperties);
     }
 
     private function overrideViewPropertiesWithQueryParams()
@@ -534,14 +551,4 @@ abstract class ViewDataTable
         $type = is_numeric($defaultValue) ? 'int' : null;
         return Common::getRequestVar($name, $defaultValue, $type);
     }
-
-    /**
-     * Helper function for getCliendSiteProperties/getClientSideParameters/etc.
-     */
-    protected function getPropertyNameListWithMetaProperty($propertyNames, $getPropertiesFunctionName)
-    {
-        $klass = get_class($this);
-        $propertyNames = array_merge($propertyNames, $klass::$getPropertiesFunctionName());
-        return $propertyNames;
-    }
 }
\ No newline at end of file
diff --git a/core/Plugin/Visualization.php b/core/Plugin/Visualization.php
index 9604fcb25921fe6b731a95c101ec128ae2f27f17..a41282248871a1322f5050c060535ed159aa3c1b 100644
--- a/core/Plugin/Visualization.php
+++ b/core/Plugin/Visualization.php
@@ -27,7 +27,6 @@ use Piwik\Plugins\API\API;
 use Piwik\Plugins\PrivacyManager\PrivacyManager;
 use Piwik\Site;
 use Piwik\View;
-use Piwik\ViewDataTable\VisualizationPropertiesProxy;
 use Piwik\Visualization\Config as VizConfig;
 use Piwik\Visualization\Request as VizRequest;
 
@@ -100,8 +99,8 @@ class Visualization extends ViewDataTable
         }
 
         $vizView = new View(static::TEMPLATE_FILE);
-        // TODO there used to be the Visualization class
-        $vizView->assign(array_merge($this->requestConfig->getProperties(), $this->config->getProperties()));
+        $vizView->assign(array_merge(get_class_vars(get_class($this)), $this->requestConfig->getProperties(), $this->config->getProperties()));
+        $vizView->dataTable = $this->dataTable;
         $view->visualization = $vizView;
 
         $view->visualizationCssClass = $this->getDefaultDataTableCssClass();
@@ -531,7 +530,7 @@ class Visualization extends ViewDataTable
     {
         $klasses = array_merge(array($klass), array_values(class_parents($klass, $autoload = false)));
 
-        $idx = array_search('Piwik\\ViewDataTable\\Visualization', $klasses);
+        $idx = array_search('Piwik\\Plugin\\Visualization', $klasses);
         if ($idx !== false) {
             $klasses = array_slice($klasses, 0, $idx);
         }
@@ -559,59 +558,11 @@ class Visualization extends ViewDataTable
         return $result;
     }
 
-    /**
-     * Returns all available visualizations that are not part of the CoreVisualizations plugin.
-     *
-     * @return array Array mapping visualization IDs with their associated visualization classes.
-     */
-    public static function getNonCoreVisualizations()
-    {
-        $result = array();
-        foreach (self::getAvailableVisualizations() as $vizId => $vizClass) {
-            if (strpos($vizClass, 'Piwik\\Plugins\\CoreVisualizations') === false) {
-                $result[$vizId] = $vizClass;
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Returns an array mapping visualization IDs with information necessary for adding the
-     * visualizations to the footer of DataTable views.
-     *
-     * @param array $visualizations An array mapping visualization IDs w/ their associated classes.
-     * @return array
-     */
-    public static function getVisualizationInfoFor($visualizations)
-    {
-        $result = array();
-        foreach ($visualizations as $vizId => $vizClass) {
-            $result[$vizId] = array('table_icon' => $vizClass::FOOTER_ICON, 'title' => $vizClass::FOOTER_ICON_TITLE);
-        }
-        return $result;
-    }
-
-    /**
-     * Returns the visualization class by it's viewDataTable ID.
-     *
-     * @param string $id The visualization ID.
-     * @return string The visualization class name. If $id is not a valid ID, the HtmlTable visualization
-     *                is returned.
-     */
-    public static function getClassFromId($id)
-    {
-        $visualizationClasses = self::getAvailableVisualizations();
-        if (!isset($visualizationClasses[$id])) {
-            return $visualizationClasses['table'];
-        }
-        return $visualizationClasses[$id];
-    }
-
     /**
      * Helper function that merges the static field values of every class in this
      * classes inheritance hierarchy. Uses late-static binding.
      */
-    protected function getPropertyNameListWithMetaProperty($staticFieldName)
+    protected function getPropertyNameListWithMetaProperty($baseProperties, $staticFieldName)
     {
         if (isset(static::$$staticFieldName)) {
             $result = array();
@@ -623,10 +574,12 @@ class Visualization extends ViewDataTable
                 }
             }
 
+            $result = array_merge($baseProperties, $result);
+
             return array_unique($result);
         }
 
-        return array();
+        return $baseProperties;
     }
 
     private function getFiltersToRun()
diff --git a/core/ViewDataTable.php b/core/ViewDataTable.php
index aefef18577dfa2bfdf6a629bf7a0d9c0c2850001..128135a801da20b140d3f8061c2e0179ac9fdd6b 100644
--- a/core/ViewDataTable.php
+++ b/core/ViewDataTable.php
@@ -131,7 +131,7 @@ class ViewDataTable
                 throw new \Exception("Visualization class '$viz' does not extend Plugin/ViewDataTable");
             }
 
-            $vizId = $viz->getViewDataTableId();
+            $vizId = $viz::getViewDataTableId();
 
             if (isset($result[$vizId])) {
                 throw new \Exception("Visualization ID '$vizId' is already in use!");
@@ -143,6 +143,22 @@ class ViewDataTable
         return $result;
     }
 
+    /**
+     * Returns all available visualizations that are not part of the CoreVisualizations plugin.
+     *
+     * @return array Array mapping visualization IDs with their associated visualization classes.
+     */
+    public static function getNonCoreVisualizations()
+    {
+        $result = array();
+        foreach (\Piwik\ViewDataTable::getAvailableVisualizations() as $vizId => $vizClass) {
+            if (strpos($vizClass, 'Piwik\\Plugins\\CoreVisualizations') === false) {
+                $result[$vizId] = $vizClass;
+            }
+        }
+        return $result;
+    }
+
     /**
      * Convenience method that creates and renders a ViewDataTable for a API method.
      *
diff --git a/core/ViewDataTable/Graph.php b/core/ViewDataTable/Graph.php
index 00404f5c055830540856d0012010805ddfb8243b..38ff4db9fb7a8cb8c53b8bbe0d56f2fe0dd527b7 100644
--- a/core/ViewDataTable/Graph.php
+++ b/core/ViewDataTable/Graph.php
@@ -14,6 +14,7 @@ use Piwik\DataTable\Row;
 use Piwik\DataTable;
 use Piwik\DataTable\DataTableInterface;
 use Piwik\Piwik;
+use Piwik\Plugin\Visualization;
 use Piwik\Visualization\Config;
 use Piwik\Visualization\Request;
 
@@ -128,11 +129,11 @@ abstract class Graph extends Visualization
 
     public $selectableRows = array();
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        if ($properties->show_goals) {
-            $properties->translations['nb_conversions'] = Piwik::translate('Goals_ColumnConversions');
-            $properties->translations['revenue'] = Piwik::translate('General_TotalRevenue');
+        if ($this->config->show_goals) {
+            $this->config->translations['nb_conversions'] = Piwik::translate('Goals_ColumnConversions');
+            $this->config->translations['revenue'] = Piwik::translate('General_TotalRevenue');
         }
     }
 
@@ -161,22 +162,22 @@ abstract class Graph extends Visualization
      * Defaults the selectable_columns property if it has not been set and then transforms
      * it into something the SeriesPicker JavaScript class can use.
      */
-    public function afterAllFilteresAreApplied(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function afterAllFilteresAreApplied()
     {
-        $properties->visualization_properties->selectable_rows = array_values($this->selectableRows);
+        $this->config->visualization_properties->selectable_rows = array_values($this->selectableRows);
 
-        $selectableColumns = $properties->visualization_properties->selectable_columns;
+        $selectableColumns = $this->config->visualization_properties->selectable_columns;
 
         // set default selectable columns, if none specified
         if ($selectableColumns === false) {
             $selectableColumns = array('nb_visits', 'nb_actions');
 
-            if (in_array('nb_uniq_visitors', $dataTable->getColumns())) {
+            if (in_array('nb_uniq_visitors', $this->dataTable->getColumns())) {
                 $selectableColumns[] = 'nb_uniq_visitors';
             }
         }
 
-        if ($properties->show_goals) {
+        if ($this->config->show_goals) {
             $goalMetrics = array('nb_conversions', 'revenue');
             $selectableColumns = array_merge($selectableColumns, $goalMetrics);
         }
@@ -185,38 +186,39 @@ abstract class Graph extends Visualization
         foreach ($selectableColumns as $column) {
             $transformed[] = array(
                 'column'      => $column,
-                'translation' => @$properties->translations[$column],
-                'displayed'   => in_array($column, $properties->columns_to_display)
+                'translation' => @$this->config->translations[$column],
+                'displayed'   => in_array($column, $this->config->columns_to_display)
             );
         }
-        $properties->visualization_properties->selectable_columns = $transformed;
+        $this->config->visualization_properties->selectable_columns = $transformed;
     }
 
     /**
      * Determines what rows are selectable and stores them in the selectable_rows property in
      * a format the SeriesPicker JavaScript class can use.
      */
-    public function beforeLoadDataTable(Request $request, Config $properties)
+    public function beforeLoadDataTable()
     {
         // TODO: this should not be required here. filter_limit should not be a view property, instead HtmlTable should use 'limit' or something,
         //       and manually set request_parameters_to_modify['filter_limit'] based on that. (same for filter_offset).
-        $request->request_parameters_to_modify['filter_limit'] = false;
+        $this->config->request_parameters_to_modify['filter_limit'] = false;
 
-        if ($properties->visualization_properties->max_graph_elements) {
-            $request->request_parameters_to_modify['filter_truncate'] = $properties->visualization_properties->max_graph_elements - 1;
+        if ($this->config->visualization_properties->max_graph_elements) {
+            $this->requestConfig->request_parameters_to_modify['filter_truncate'] = $this->config->visualization_properties->max_graph_elements - 1;
         }
 
-        if ($properties->visualization_properties->row_picker_match_rows_by === false) {
+        if ($this->config->visualization_properties->row_picker_match_rows_by === false) {
             return;
         }
     }
 
-    public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function beforeGenericFiltersAreAppliedToLoadedDataTable()
     {
         // collect all selectable rows
         $self = $this;
+        $properties = $this->config;
 
-        $dataTable->filter(function ($dataTable) use ($self, $properties) {
+        $this->dataTable->filter(function ($dataTable) use ($self, $properties) {
             foreach ($dataTable->getRows() as $row) {
                 $rowLabel = $row->getColumn('label');
                 if ($rowLabel === false) {
diff --git a/core/ViewDataTable/Request.php b/core/ViewDataTable/Request.php
index 1ce92ad444a2b50f3648b9e2cd733e859220a70d..4e6df3ad2775c8ca54b81cd891ff2a78b73aecdc 100644
--- a/core/ViewDataTable/Request.php
+++ b/core/ViewDataTable/Request.php
@@ -53,7 +53,7 @@ class Request
     }
 
     /**
-     * @return string URL to call the API, eg. "method=Referrers.getKeywords&period=day&date=yesterday"...
+     * @return array  URL to call the API, eg. "method=Referrers.getKeywords&period=day&date=yesterday"...
      */
     public function getRequestArray()
     {
@@ -148,8 +148,8 @@ class Request
         // if filter_column_recursive & filter_pattern_recursive are supplied, and flat isn't supplied
         // we have to load all the child subtables.
         return Common::getRequestVar('filter_column_recursive', false) !== false
-        && Common::getRequestVar('filter_pattern_recursive', false) !== false
-        && Common::getRequestVar('flat', false) === false;
+                && Common::getRequestVar('filter_pattern_recursive', false) !== false
+                && Common::getRequestVar('flat', false) === false;
     }
 
 }
\ No newline at end of file
diff --git a/core/ViewDataTable/Visualization.php b/core/ViewDataTable/Visualization.php
deleted file mode 100644
index 2562bbae37b3c309ec73a9f7e4c7afc77266d4c9..0000000000000000000000000000000000000000
--- a/core/ViewDataTable/Visualization.php
+++ /dev/null
@@ -1,310 +0,0 @@
-<?php
-/**
- * Piwik - Open source web analytics
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- *
- * @category Piwik
- * @package Piwik
- */
-
-namespace Piwik\ViewDataTable;
-
-use Piwik\DataTable;
-use Piwik\DataTable\DataTableInterface;
-use Piwik\Piwik;
-use Piwik\View;
-use Piwik\ViewDataTable;
-use Piwik\Visualization\Config;
-use Piwik\Visualization\Request;
-
-/**
- * Base class for all DataTable visualizations. Different visualizations are used to
- * handle different values of the viewDataTable query parameter. Each one will display
- * DataTable data in a different way.
- *
- * TODO: must be more in depth
- */
-abstract class Visualization extends View
-{
-    const GET_AVAILABLE_EVENT = 'Visualization.addVisualizations';
-    const TEMPLATE_FILE = '';
-
-    /**
-     * The view data table
-     * @var ViewDataTable
-     */
-    protected $viewDataTable;
-
-    final public function __construct($view)
-    {
-        $templateFile = static::TEMPLATE_FILE;
-
-        if (empty($templateFile)) {
-            throw new \Exception('You have not defined a constant named TEMPLATE_FILE in your visualization class.');
-        }
-
-        parent::__construct($templateFile);
-
-        $this->viewDataTable = $view;
-        $this->init();
-    }
-
-    protected function init()
-    {
-        // do your init stuff here, do not overwrite constructor
-        // maybe setting my view properties $this->vizTitle
-    }
-
-    public function configureVisualization(Config $properties)
-    {
-        // our stuff goes in here
-        // like $properties->showFooterColumns = true;
-    }
-
-    public function beforeLoadDataTable(Request $request, Config $properties)
-    {
-        // change request --> $requestProperties...
-        // like defining filter_column
-        // $requestProperties->filterColumn = 54;
-        // $requestProperties->setFilterColumn();
-    }
-
-    public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
-    {
-
-    }
-
-    public function afterGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
-    {
-
-    }
-
-    public function afterAllFilteresAreApplied(DataTableInterface $dataTable, Config $properties, Request $request)
-    {
-        // filter and format requested data here
-        // $dataTable ...f
-
-        // $this->generator = new GeneratorFoo($dataTable);
-    }
-
-    /**
-     * Default implementation of getDefaultPropertyValues static function.
-     *
-     * @return array
-     */
-    public static function getDefaultPropertyValues()
-    {
-        return array();
-    }
-
-    /**
-     * Returns the array of view properties that a DataTable visualization will require
-     * to be both visible to client side JavaScript, and passed along as query parameters
-     * in every AJAX request.
-     *
-     * Derived Visualizations can specify client side parameters by declaring
-     * a static $clientSideParameters field that contains a list of view property
-     * names.
-     *
-     * @return array
-     */
-    public static function getClientSideRequestParameters()
-    {
-        return self::getPropertyNameListWithMetaProperty('clientSideRequestParameters');
-    }
-
-    /**
-     * Returns an array of view property names that a DataTable visualization will
-     * require to be visible to client side JavaScript. Unlike 'client side parameters',
-     * these will not be passed with AJAX requests as query parameters.
-     *
-     * Derived Visualizations can specify client side properties by declaring
-     * a static $clientSideProperties field that contains a list of view property
-     * names.
-     *
-     * @return array
-     */
-    public static function getClientSideConfigProperties()
-    {
-        return self::getPropertyNameListWithMetaProperty('clientSideConfigProperties');
-    }
-
-    /**
-     * Returns an array of view property names that can be overriden by query parameters.
-     * If a query parameter is sent with the same name as a view property, the view
-     * property will be set to the value of the query parameter.
-     *
-     * Derived Visualizations can specify overridable properties by declaring
-     * a static $overridableProperties field that contains a list of view property
-     * names.
-     */
-    public static function getOverridableProperties()
-    {
-        return self::getPropertyNameListWithMetaProperty('overridableProperties');
-    }
-
-    /**
-     * Returns the viewDataTable ID for this DataTable visualization. Derived classes
-     * should declare a const ID field with the viewDataTable ID.
-     *
-     * @return string
-     */
-    public static function getViewDataTableId()
-    {
-        if (defined('static::ID')) {
-            return static::ID;
-        } else {
-            return get_called_class();
-        }
-    }
-
-    /**
-     * Returns the list of parents for a Visualization class excluding the
-     * Visualization class and above.
-     *
-     * @param string $klass The class name of the Visualization.
-     * @return Visualization[]  The list of parent classes in order from highest
-     *                                   ancestor to the descended class.
-     */
-    public static function getVisualizationClassLineage($klass)
-    {
-        $klasses = array_merge(array($klass), array_values(class_parents($klass, $autoload = false)));
-
-        $idx = array_search('Piwik\\ViewDataTable\\Visualization', $klasses);
-        if ($idx !== false) {
-            $klasses = array_slice($klasses, 0, $idx);
-        }
-
-        return array_reverse($klasses);
-    }
-
-    /**
-     * Returns the viewDataTable IDs of a visualization's class lineage.
-     *
-     * @see self::getVisualizationClassLineage
-     *
-     * @param string $klass The visualization class.
-     *
-     * @return array
-     */
-    public static function getVisualizationIdsWithInheritance($klass)
-    {
-        $klasses = self::getVisualizationClassLineage($klass);
-
-        $result = array();
-        foreach ($klasses as $klass) {
-            $result[] = $klass::getViewDataTableId();
-        }
-        return $result;
-    }
-
-    /**
-     * Returns all registered visualization classes. Uses the 'Visualization.getAvailable'
-     * event to retrieve visualizations.
-     *
-     * @return array Array mapping visualization IDs with their associated visualization classes.
-     * @throws \Exception If a visualization class does not exist or if a duplicate visualization ID
-     *                   is found.
-     */
-    public static function getAvailableVisualizations()
-    {
-        /** @var self[] $visualizations */
-        $visualizations = array();
-
-        /**
-         * This event is used to gather all available DataTable visualizations. Callbacks should add visualization
-         * class names to the incoming array.
-         */
-        Piwik::postEvent(self::GET_AVAILABLE_EVENT, array(&$visualizations));
-
-        $result = array();
-        foreach ($visualizations as $viz) {
-            if (!class_exists($viz)) {
-                throw new \Exception(
-                    "Invalid visualization class '$viz' found in Visualization.getAvailableVisualizations.");
-            }
-
-            if (is_subclass_of($viz, __CLASS__)) {
-                $vizId = $viz::getViewDataTableId();
-                if (isset($result[$vizId])) {
-                    throw new \Exception("Visualization ID '$vizId' is already in use!");
-                }
-
-                $result[$vizId] = $viz;
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Returns all available visualizations that are not part of the CoreVisualizations plugin.
-     *
-     * @return array Array mapping visualization IDs with their associated visualization classes.
-     */
-    public static function getNonCoreVisualizations()
-    {
-        $result = array();
-        foreach (self::getAvailableVisualizations() as $vizId => $vizClass) {
-            if (strpos($vizClass, 'Piwik\\Plugins\\CoreVisualizations') === false) {
-                $result[$vizId] = $vizClass;
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Returns an array mapping visualization IDs with information necessary for adding the
-     * visualizations to the footer of DataTable views.
-     *
-     * @param array $visualizations An array mapping visualization IDs w/ their associated classes.
-     * @return array
-     */
-    public static function getVisualizationInfoFor($visualizations)
-    {
-        $result = array();
-        foreach ($visualizations as $vizId => $vizClass) {
-            $result[$vizId] = array('table_icon' => $vizClass::FOOTER_ICON, 'title' => $vizClass::FOOTER_ICON_TITLE);
-        }
-        return $result;
-    }
-
-    /**
-     * Returns the visualization class by it's viewDataTable ID.
-     *
-     * @param string $id The visualization ID.
-     * @return string The visualization class name. If $id is not a valid ID, the HtmlTable visualization
-     *                is returned.
-     */
-    public static function getClassFromId($id)
-    {
-        $visualizationClasses = self::getAvailableVisualizations();
-        if (!isset($visualizationClasses[$id])) {
-            return $visualizationClasses['table'];
-        }
-        return $visualizationClasses[$id];
-    }
-
-    /**
-     * Helper function that merges the static field values of every class in this
-     * classes inheritance hierarchy. Uses late-static binding.
-     */
-    private static function getPropertyNameListWithMetaProperty($staticFieldName)
-    {
-        if (isset(static::$$staticFieldName)) {
-            $result = array();
-
-            $lineage = static::getVisualizationClassLineage(get_called_class());
-            foreach ($lineage as $klass) {
-                if (isset($klass::$$staticFieldName)) {
-                    $result = array_merge($result, $klass::$$staticFieldName);
-                }
-            }
-
-            return array_unique($result);
-        } else {
-            return array();
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/ViewDataTable/VisualizationPropertiesProxy.php b/core/ViewDataTable/VisualizationPropertiesProxy.php
index b100cd5c9298f592c95d99e083e6d9e46372e33f..673b45bfa4b0b9cb396115e3e1d72a3ba95561d1 100644
--- a/core/ViewDataTable/VisualizationPropertiesProxy.php
+++ b/core/ViewDataTable/VisualizationPropertiesProxy.php
@@ -59,11 +59,13 @@ class VisualizationPropertiesProxy
      */
     public function &__get($name)
     {
-        if ($this->visualizationClass !== null) {
-            static::checkValidVisualizationProperty($this->visualizationClass, $name);
+        if (array_key_exists($name, $this->visualizationProperties)) {
+            return $this->visualizationProperties[$name];
         }
 
-        return $this->visualizationProperties[$name];
+        $null = null;
+
+        return $null;
     }
 
     /**
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index 030a7fe6b9e4e1d17f4352f82aa11c286b271b21..83167eb89ea512cb733966c6957d3df82a468170 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -673,7 +673,7 @@ class Actions extends \Piwik\Plugin
         // so users can see that they can set it to 1 (see #3365)
         $result['custom_parameters'] = array('flat' => 0);
 
-        if (ViewDataTable::shouldLoadExpanded()) {
+        if (ViewDataTable\Request::shouldLoadExpanded()) {
             $result['visualization_properties']['table']['show_expanded'] = true;
 
             $result['filters'][] = function ($dataTable) {
diff --git a/plugins/CoreVisualizations/Visualizations/Cloud.php b/plugins/CoreVisualizations/Visualizations/Cloud.php
index 53e6e6b936bfaadf4629e29917da0996b9a76336..b6fe403da3902001223ef3722689ad2d4c1634b1 100644
--- a/plugins/CoreVisualizations/Visualizations/Cloud.php
+++ b/plugins/CoreVisualizations/Visualizations/Cloud.php
@@ -12,10 +12,9 @@ namespace Piwik\Plugins\CoreVisualizations\Visualizations;
 
 use Piwik\Common;
 use Piwik\DataTable;
-use Piwik\DataTable\DataTableInterface;
 use Piwik\Log;
 use Piwik\View;
-use Piwik\ViewDataTable\Visualization;
+use Piwik\Plugin\Visualization;
 use Piwik\Visualization\Config;
 use Piwik\Visualization\Request;
 
@@ -49,18 +48,18 @@ class Cloud extends Visualization
     protected $wordsArray = array();
     public $truncatingLimit = 50;
 
-    public function afterAllFilteresAreApplied(DataTable $dataTable, Config $properties, Request $request)
+    public function afterAllFilteresAreApplied()
     {
-        if ($dataTable->getRowsCount() == 0) {
+        if ($this->dataTable->getRowsCount() == 0) {
             return;
         }
 
-        $columnToDisplay = isset($properties->columns_to_display[1]) ? $properties->columns_to_display[1] : 'nb_visits';
+        $columnToDisplay = isset($this->config->columns_to_display[1]) ? $this->config->columns_to_display[1] : 'nb_visits';
 
         $labelMetadata = array();
-        foreach ($dataTable->getRows() as $row) {
+        foreach ($this->dataTable->getRows() as $row) {
             $logo = false;
-            if ($properties->visualization_properties->display_logo_instead_of_label) {
+            if ($this->config->visualization_properties->display_logo_instead_of_label) {
                 $logo = $row->getMetadata('logo');
             }
 
@@ -82,11 +81,11 @@ class Cloud extends Visualization
         $this->cloudValues   = $cloudValues;
     }
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        $properties->show_exclude_low_population = false;
-        $properties->show_offset_information     = false;
-        $properties->show_limit_control          = false;
+        $this->config->show_exclude_low_population = false;
+        $this->config->show_offset_information     = false;
+        $this->config->show_limit_control          = false;
     }
 
     public static function getDefaultPropertyValues()
diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable.php b/plugins/CoreVisualizations/Visualizations/HtmlTable.php
index 84085cf7ff440771b910aedffb2626c1b1e1ffce..a74f28f7b7efb6407bbdd8490fa8b89ba6f745a2 100644
--- a/plugins/CoreVisualizations/Visualizations/HtmlTable.php
+++ b/plugins/CoreVisualizations/Visualizations/HtmlTable.php
@@ -18,7 +18,7 @@ use Piwik\Piwik;
 use Piwik\Plugins\Goals\API as APIGoals;
 use Piwik\Site;
 use Piwik\View;
-use Piwik\ViewDataTable\Visualization;
+use Piwik\Plugin\Visualization;
 use Piwik\Visualization\Config as VizConfig;
 
 require_once PIWIK_INCLUDE_PATH . '/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php';
@@ -149,12 +149,12 @@ class HtmlTable extends Visualization
         'highlight_summary_row',
     );
 
-    public function configureVisualization(VizConfig $properties)
+    public function configureVisualization()
     {
         if (Common::getRequestVar('idSubtable', false)
-            && $properties->visualization_properties->show_embedded_subtable
+            && $this->config->visualization_properties->show_embedded_subtable
         ) {
-            $properties->show_visualization_only = true;
+            $this->config->show_visualization_only = true;
         }
     }
 
diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
index d03ba2c05c0060ede852916c65f2c4f0f6d66ce2..2dc5ee43cc62322fbc734a5c6d20473184d4a97b 100644
--- a/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
+++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/AllColumns.php
@@ -31,21 +31,22 @@ class AllColumns extends HtmlTable
 {
     const ID = 'tableAllColumns';
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        $properties->visualization_properties->show_extra_columns = true;
+        $this->config->visualization_properties->show_extra_columns = true;
 
-        $properties->show_exclude_low_population = true;
-        $properties->datatable_css_class = 'dataTableVizAllColumns';
+        $this->config->show_exclude_low_population = true;
+        $this->config->datatable_css_class = 'dataTableVizAllColumns';
 
-        parent::configureVisualization($properties);
+        parent::configureVisualization();
     }
 
-    public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function beforeGenericFiltersAreAppliedToLoadedDataTable()
     {
-        $dataTable->filter('AddColumnsProcessedMetrics');
+        $this->dataTable->filter('AddColumnsProcessedMetrics');
+        $properties = $this->config;
 
-        $dataTable->filter(function ($dataTable) use ($properties) {
+        $this->dataTable->filter(function ($dataTable) use ($properties) {
             $columnsToDisplay = array('label', 'nb_visits');
 
             if (in_array('nb_uniq_visitors', $dataTable->getColumns())) {
@@ -67,7 +68,7 @@ class AllColumns extends HtmlTable
 
         $prettifyTime = array('\Piwik\MetricsFormatter', 'getPrettyTimeFromSeconds');
 
-        $dataTable->filter('ColumnCallbackReplace', array('avg_time_on_site', $prettifyTime));
+        $this->dataTable->filter('ColumnCallbackReplace', array('avg_time_on_site', $prettifyTime));
     }
 
 }
\ No newline at end of file
diff --git a/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php b/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php
index 71aec3fe2fd2b7775f7bdd9a9a83fffa222f0621..d63230107adcd951f927eaec3d6fc73d689043b0 100644
--- a/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php
+++ b/plugins/CoreVisualizations/Visualizations/HtmlTable/Goals.php
@@ -29,63 +29,61 @@ class Goals extends HtmlTable
 {
     const ID = 'tableGoals';
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        $properties->visualization_properties->show_goals_columns = true;
+        $this->config->visualization_properties->show_goals_columns = true;
 
-        $properties->datatable_css_class = 'dataTableVizGoals';
-        $properties->show_exclude_low_population = true;
-        $properties->show_goals = true;
+        $this->config->datatable_css_class = 'dataTableVizGoals';
+        $this->config->show_exclude_low_population = true;
+        $this->config->show_goals = true;
 
-        $properties->translations += array(
+        $this->config->translations += array(
             'nb_conversions'    => Piwik::translate('Goals_ColumnConversions'),
             'conversion_rate'   => Piwik::translate('General_ColumnConversionRate'),
             'revenue'           => Piwik::translate('General_ColumnRevenue'),
             'revenue_per_visit' => Piwik::translate('General_ColumnValuePerVisit'),
         );
-        $properties->metrics_documentation['nb_visits'] = Piwik::translate('Goals_ColumnVisits');
+        $this->config->metrics_documentation['nb_visits'] = Piwik::translate('Goals_ColumnVisits');
 
         if (Common::getRequestVar('documentationForGoalsPage', 0, 'int') == 1) { // TODO: should not use query parameter
-            $properties->documentation = Piwik::translate('Goals_ConversionByTypeReportDocumentation',
+            $this->config->documentation = Piwik::translate('Goals_ConversionByTypeReportDocumentation',
                 array('<br />', '<br />', '<a href="http://piwik.org/docs/tracking-goals-web-analytics/" target="_blank">', '</a>'));
         }
 
-        if (!$properties->visualization_properties->disable_subtable_when_show_goals) {
-            $properties->subtable_controller_action = null;
+        if (!$this->config->visualization_properties->disable_subtable_when_show_goals) {
+            $this->config->subtable_controller_action = null;
         }
 
         $this->setShowGoalsColumnsProperties();
 
-        parent::configureVisualization($properties);
+        parent::configureVisualization();
     }
 
     private function setShowGoalsColumnsProperties()
     {
-        $view = $this->viewDataTable;
-
         // set view properties based on goal requested
         $idSite = Common::getRequestVar('idSite', null, 'int');
         $idGoal = Common::getRequestVar('idGoal', AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW, 'string');
         if ($idGoal == Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER) {
-            $this->setPropertiesForEcommerceView($view);
+            $this->setPropertiesForEcommerceView();
         } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_FULL_TABLE) {
-            $this->setPropertiesForGoals($view, $idSite, 'all');
+            $this->setPropertiesForGoals($idSite, 'all');
         } else if ($idGoal == AddColumnsProcessedMetricsGoal::GOALS_OVERVIEW) {
-            $this->setPropertiesForGoalsOverview($view, $idSite);
+            $this->setPropertiesForGoalsOverview($idSite);
         } else {
-            $this->setPropertiesForGoals($view, $idSite, array($idGoal));
+            $this->setPropertiesForGoals($idSite, array($idGoal));
         }
 
         // add goals columns
-        $view->filters[] = array('AddColumnsProcessedMetricsGoal', array($ignore = true, $idGoal), $priority = true);
+        $this->config->filters[] = array('AddColumnsProcessedMetricsGoal', array($ignore = true, $idGoal), $priority = true);
 
         // prettify columns
         $setRatePercent = function ($rate, $thang = false) {
             return $rate == 0 ? "0%" : $rate;
         };
-        foreach ($view->columns_to_display as $columnName) {
+        foreach ($this->config->columns_to_display as $columnName) {
             if (strpos($columnName, 'conversion_rate') !== false) {
-                $view->filters[] = array('ColumnCallbackReplace', array($columnName, $setRatePercent));
+                $this->config->filters[] = array('ColumnCallbackReplace', array($columnName, $setRatePercent));
             }
         }
 
@@ -93,9 +91,9 @@ class Goals extends HtmlTable
             return MetricsFormatter::getPrettyMoney(sprintf("%.1f", $value), $idSite);
         };
 
-        foreach ($view->columns_to_display as $columnName) {
+        foreach ($this->config->columns_to_display as $columnName) {
             if ($this->isRevenueColumn($columnName)) {
-                $view->filters[] = array('ColumnCallbackReplace', array($columnName, $formatPercent));
+                $this->config->filters[] = array('ColumnCallbackReplace', array($columnName, $formatPercent));
             }
         }
 
@@ -103,25 +101,25 @@ class Goals extends HtmlTable
         $identityFunction = function ($value) {
             return $value;
         };
-        foreach ($view->columns_to_display as $columnName) {
+        foreach ($this->config->columns_to_display as $columnName) {
             if (!$this->isRevenueColumn($columnName)) {
-                $view->filters[] = array('ColumnCallbackReplace', array($columnName, $identityFunction));
+                $this->config->filters[] = array('ColumnCallbackReplace', array($columnName, $identityFunction));
             }
         }
     }
 
-    private function setPropertiesForEcommerceView($view)
+    private function setPropertiesForEcommerceView()
     {
-        $view->filter_sort_column = 'goal_ecommerceOrder_revenue';
-        $view->filter_sort_order = 'desc';
+        $this->requestConfig->filter_sort_column = 'goal_ecommerceOrder_revenue';
+        $this->requestConfig->filter_sort_order = 'desc';
 
-        $view->columns_to_display = array(
+        $this->config->columns_to_display = array(
             'label', 'nb_visits', 'goal_ecommerceOrder_nb_conversions', 'goal_ecommerceOrder_revenue',
             'goal_ecommerceOrder_conversion_rate', 'goal_ecommerceOrder_avg_order_revenue', 'goal_ecommerceOrder_items',
             'goal_ecommerceOrder_revenue_per_visit'
         );
 
-        $view->translations += array(
+        $this->config->translations += array(
             'goal_ecommerceOrder_conversion_rate'   => Piwik::translate('Goals_ConversionRate', Piwik::translate('Goals_EcommerceOrder')),
             'goal_ecommerceOrder_nb_conversions'    => Piwik::translate('General_EcommerceOrders'),
             'goal_ecommerceOrder_revenue'           => Piwik::translate('General_TotalRevenue'),
@@ -131,7 +129,7 @@ class Goals extends HtmlTable
         );
 
         $goalName = Piwik::translate('General_EcommerceOrders');
-        $view->metrics_documentation += array(
+        $this->config->metrics_documentation += array(
             'goal_ecommerceOrder_conversion_rate'   => Piwik::translate('Goals_ColumnConversionRateDocumentation', $goalName),
             'goal_ecommerceOrder_nb_conversions'    => Piwik::translate('Goals_ColumnConversionsDocumentation', $goalName),
             'goal_ecommerceOrder_revenue'           => Piwik::translate('Goals_ColumnRevenueDocumentation', $goalName),
@@ -142,28 +140,28 @@ class Goals extends HtmlTable
         );
     }
 
-    private function setPropertiesForGoalsOverview($view, $idSite)
+    private function setPropertiesForGoalsOverview($idSite)
     {
         $allGoals = $this->getGoals($idSite);
 
         // set view properties
-        $view->columns_to_display = array('label', 'nb_visits');
+        $this->config->columns_to_display = array('label', 'nb_visits');
 
         foreach ($allGoals as $goal) {
             $column = "goal_{$goal['idgoal']}_conversion_rate";
 
-            $view->columns_to_display[] = $column;
-            $view->translations[$column] = Piwik::translate('Goals_ConversionRate', $goal['name']);
-            $view->metrics_documentation[$column]
+            $this->config->columns_to_display[] = $column;
+            $this->config->translations[$column] = Piwik::translate('Goals_ConversionRate', $goal['name']);
+            $this->config->metrics_documentation[$column]
                 = Piwik::translate('Goals_ColumnConversionRateDocumentation', $goal['quoted_name'] ? : $goal['name']);
         }
 
-        $view->columns_to_display[] = 'revenue_per_visit';
-        $view->metrics_documentation['revenue_per_visit'] =
+        $this->config->columns_to_display[] = 'revenue_per_visit';
+        $this->config->metrics_documentation['revenue_per_visit'] =
             Piwik::translate('Goals_ColumnRevenuePerVisitDocumentation', Piwik::translate('Goals_EcommerceAndGoalsMenu'));
     }
 
-    private function setPropertiesForGoals($view, $idSite, $idGoals)
+    private function setPropertiesForGoals($idSite, $idGoals)
     {
         $allGoals = $this->getGoals($idSite);
 
@@ -171,11 +169,11 @@ class Goals extends HtmlTable
             $idGoals = array_keys($allGoals);
         } else {
             // only sort by a goal's conversions if not showing all goals (for FULL_REPORT)
-            $view->filter_sort_column = 'goal_' . reset($idGoals) . '_nb_conversions';
-            $view->filter_sort_order = 'desc';
+            $this->requestConfig->filter_sort_column = 'goal_' . reset($idGoals) . '_nb_conversions';
+            $this->requestConfig->filter_sort_order = 'desc';
         }
 
-        $view->columns_to_display = array('label', 'nb_visits');
+        $this->config->columns_to_display = array('label', 'nb_visits');
 
         $goalColumnTemplates = array(
             'goal_%s_nb_conversions',
@@ -189,7 +187,7 @@ class Goals extends HtmlTable
         foreach ($goalColumnTemplates as $idx => $columnTemplate) {
             foreach ($idGoals as $idGoal) {
                 $column = sprintf($columnTemplate, $idGoal);
-                $view->columns_to_display[] = $column;
+                $this->config->columns_to_display[] = $column;
             }
         }
 
@@ -198,7 +196,7 @@ class Goals extends HtmlTable
             $goalName = $allGoals[$idGoal]['name'];
             $quotedGoalName = $allGoals[$idGoal]['quoted_name'] ? : $goalName;
 
-            $view->translations += array(
+            $this->config->translations += array(
                 'goal_' . $idGoal . '_nb_conversions'    => Piwik::translate('Goals_Conversions', $goalName),
                 'goal_' . $idGoal . '_conversion_rate'   => Piwik::translate('Goals_ConversionRate', $goalName),
                 'goal_' . $idGoal . '_revenue'           =>
@@ -207,7 +205,7 @@ class Goals extends HtmlTable
                 Piwik::translate('%s ' . Piwik::translate('General_ColumnValuePerVisit'), $goalName),
             );
 
-            $view->metrics_documentation += array(
+            $this->config->metrics_documentation += array(
                 'goal_' . $idGoal . '_nb_conversions'    => Piwik::translate('Goals_ColumnConversionsDocumentation', $quotedGoalName),
                 'goal_' . $idGoal . '_conversion_rate'   => Piwik::translate('Goals_ColumnConversionRateDocumentation', $quotedGoalName),
                 'goal_' . $idGoal . '_revenue'           => Piwik::translate('Goals_ColumnRevenueDocumentation', $quotedGoalName),
@@ -216,7 +214,7 @@ class Goals extends HtmlTable
             );
         }
 
-        $view->columns_to_display[] = 'revenue_per_visit';
+        $this->config->columns_to_display[] = 'revenue_per_visit';
     }
 
     private function getGoals($idSite)
diff --git a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
index bb364e5f761d9c171e740ea101ebdea8be520ce4..33478c97b0a122af4f0cda2a2f69254ccbbecc39 100644
--- a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
+++ b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Bar.php
@@ -22,11 +22,11 @@ class Bar extends JqplotGraph
 {
     const ID = 'graphVerticalBar';
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        parent::configureVisualization($properties);
+        parent::configureVisualization();
 
-        $properties->datatable_js_type = 'JqplotBarGraphDataTable';
+        $this->config->datatable_js_type = 'JqplotBarGraphDataTable';
     }
 
     public static function getDefaultPropertyValues()
diff --git a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Evolution.php b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Evolution.php
index 75f07864270cb937e847ec218651317f93e95c70..0501174ea876b02abb1b794a1ce540e0c2051125 100644
--- a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Evolution.php
+++ b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Evolution.php
@@ -41,35 +41,35 @@ class Evolution extends JqplotGraph
 
     public static $overridableProperties = array('show_line_graph');
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        $this->calculateEvolutionDateRange($properties);
+        $this->calculateEvolutionDateRange();
 
-        parent::configureVisualization($properties);
+        parent::configureVisualization();
 
-        $properties->datatable_js_type = 'JqplotEvolutionGraphDataTable';
+        $this->config->datatable_js_type = 'JqplotEvolutionGraphDataTable';
     }
 
-    public function beforeLoadDataTable(Request $request, Config $properties)
+    public function beforeLoadDataTable()
     {
-        parent::beforeLoadDataTable($request, $properties);
+        parent::beforeLoadDataTable();
 
         // period will be overridden when 'range' is requested in the UI
         // but the graph will display for each day of the range.
         // Default 'range' behavior is to return the 'sum' for the range
         if (Common::getRequestVar('period', false) == 'range') {
-            $request->request_parameters_to_modify['period'] = 'day';
+            $this->requestConfig->request_parameters_to_modify['period'] = 'day';
         }
     }
 
-    public function afterAllFilteresAreApplied(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function afterAllFilteresAreApplied()
     {
-        parent::afterAllFilteresAreApplied($dataTable, $properties, $request);
+        parent::afterAllFilteresAreApplied();
 
-        if ($properties->visualization_properties->x_axis_step_size === false) {
+        if ($this->config->visualization_properties->x_axis_step_size === false) {
 
-            $size = $this->getDefaultXAxisStepSize($dataTable->getRowsCount());
-            $properties->visualization_properties->x_axis_step_size = $size;
+            $size = $this->getDefaultXAxisStepSize($this->dataTable->getRowsCount());
+            $this->config->visualization_properties->x_axis_step_size = $size;
         }
     }
 
@@ -94,16 +94,15 @@ class Evolution extends JqplotGraph
      * Based on the period, date and evolution_{$period}_last_n query parameters,
      * calculates the date range this evolution chart will display data for.
      */
-    private function calculateEvolutionDateRange(Config $properties)
+    private function calculateEvolutionDateRange()
     {
-        $view = $this->viewDataTable;
         $period = Common::getRequestVar('period');
 
         $defaultLastN = self::getDefaultLastN($period);
         $originalDate = Common::getRequestVar('date', 'last' . $defaultLastN, 'string');
 
         if ($period != 'range') { // show evolution limit if the period is not a range
-            $properties->show_limit_control = true;
+            $this->config->show_limit_control = true;
 
             // set the evolution_{$period}_last_n query param
             if (Range::parseDateRange($originalDate)) { // if a multiple period
@@ -112,11 +111,11 @@ class Evolution extends JqplotGraph
                 $lastN = count($oPeriod->getSubperiods());
             } else { // if not a multiple period
                 list($newDate, $lastN) = self::getDateRangeAndLastN($period, $originalDate, $defaultLastN);
-                $view->request_parameters_to_modify['date'] = $newDate;
-                $properties->custom_parameters['dateUsedInGraph'] = $newDate;
+                $this->requestConfig->request_parameters_to_modify['date'] = $newDate;
+                $this->config->custom_parameters['dateUsedInGraph'] = $newDate;
             }
             $lastNParamName = self::getLastNParamName($period);
-            $properties->custom_parameters[$lastNParamName] = $lastN;
+            $this->config->custom_parameters[$lastNParamName] = $lastN;
         }
     }
 
diff --git a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Pie.php b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Pie.php
index e6db071c9ff9787b64ca372cb69b79657572a7c1..593e3768a3b4c0b18f5f0d301f08d35267b64cb4 100644
--- a/plugins/CoreVisualizations/Visualizations/JqplotGraph/Pie.php
+++ b/plugins/CoreVisualizations/Visualizations/JqplotGraph/Pie.php
@@ -24,25 +24,25 @@ class Pie extends JqplotGraph
 {
     const ID = 'graphPie';
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        parent::configureVisualization($properties);
+        parent::configureVisualization();
 
-        $properties->visualization_properties->show_all_ticks = true;
-        $properties->datatable_js_type = 'JqplotPieGraphDataTable';
+        $this->config->visualization_properties->show_all_ticks = true;
+        $this->config->datatable_js_type = 'JqplotPieGraphDataTable';
     }
 
-    public function afterAllFilteresAreApplied(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function afterAllFilteresAreApplied()
     {
-        parent::afterAllFilteresAreApplied($dataTable, $properties, $request);
+        parent::afterAllFilteresAreApplied();
 
-        $metricColumn = reset($properties->columns_to_display);
+        $metricColumn = reset($this->config->columns_to_display);
 
         if ($metricColumn == 'label') {
-            $metricColumn = next($properties->columns_to_display);
+            $metricColumn = next($this->config->columns_to_display);
         }
 
-        $properties->columns_to_display = array($metricColumn ? : 'nb_visits');
+        $this->config->columns_to_display = array($metricColumn ? : 'nb_visits');
     }
 
     public static function getDefaultPropertyValues()
diff --git a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
index f18a7afa99c09f75fce0eae127ee8c5e9cf10d58..0cfd21266b1fddcf41f6548f2d6786765d3d2b0b 100644
--- a/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
+++ b/plugins/CoreVisualizations/templates/_dataTableViz_htmlTable.twig
@@ -36,7 +36,7 @@
                     {% endfor %}
                 </tr>
                 {% endif %}
-                
+
                 {# display subtable if present and showing expanded datatable #}
                 {% if properties.visualization_properties.show_expanded|default(false) and rowHasSubtable %}
                     {% include "@CoreVisualizations/_dataTableViz_htmlTable.twig" with {'dataTable': row.getSubtable(), 'idSubtable': row.getIdSubDataTable()} %}
diff --git a/plugins/ExampleVisualization/SimpleTable.php b/plugins/ExampleVisualization/SimpleTable.php
index abd5c8aff2030d7fecbfd93bcbbadde64ada3807..07e686e8fddc52a3790a4a7d0d28ac4ea59359ef 100644
--- a/plugins/ExampleVisualization/SimpleTable.php
+++ b/plugins/ExampleVisualization/SimpleTable.php
@@ -13,7 +13,7 @@ namespace Piwik\Plugins\ExampleVisualization;
 
 use Piwik\DataTable;
 use Piwik\DataTable\DataTableInterface;
-use Piwik\ViewDataTable\Visualization;
+use Piwik\Plugin\Visualization;
 use Piwik\Visualization\Config;
 use Piwik\Visualization\Request;
 
@@ -34,33 +34,33 @@ class SimpleTable extends Visualization
         $this->vizTitle = 'MyAwesomeTitle';
     }
 
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
         // Configure how your visualization should look like, for instance you can disable search
-        // $properties->show_search = false
+        // $this->config->show_search = false
     }
 
-    public function beforeLoadDataTable(Request $request, Config $properties)
+    public function beforeLoadDataTable()
     {
         // Here you can change the request that is sent to the API, for instance
-        // $properties->filter_sort_order = 'desc';
+        // $this->requestConfig->filter_sort_order = 'desc';
     }
 
-    public function beforeGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function beforeGenericFiltersAreAppliedToLoadedDataTable()
     {
         // this hook is executed before generic filters like "filter_limit" and "filter_offset" are applied
         // Usage:
-        // $dateTable->filter($nameOrClosure);
+        // $this->dateTable->filter($nameOrClosure);
     }
 
-    public function afterGenericFiltersAreAppliedToLoadedDataTable(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function afterGenericFiltersAreAppliedToLoadedDataTable()
     {
         // this hook is executed after generic filters like "filter_limit" and "filter_offset" are applied
         // Usage:
-        // $dateTable->filter($nameOrClosure, $parameters);
+        // $this->dateTable->filter($nameOrClosure, $parameters);
     }
 
-    public function afterAllFilteresAreApplied(DataTableInterface $dataTable, Config $properties, Request $request)
+    public function afterAllFilteresAreApplied()
     {
         // this hook is executed after the data table is loaded and after all filteres are applied.
         // format your data here that you want to pass to the view
diff --git a/plugins/Live/VisitorLog.php b/plugins/Live/VisitorLog.php
index 88b7260bbe9eb8f3fd22ba1c635423a50b139754..6383a9b07c23a0d503af77ea589935fd80b0ffb5 100644
--- a/plugins/Live/VisitorLog.php
+++ b/plugins/Live/VisitorLog.php
@@ -11,7 +11,7 @@
 namespace Piwik\Plugins\Live;
 
 use Piwik\View;
-use Piwik\ViewDataTable\Visualization;
+use Piwik\Plugin\Visualization;
 use Piwik\Visualization\Config;
 
 /**
@@ -31,8 +31,8 @@ class VisitorLog extends Visualization
     /**
      * Configure visualization.
      */
-    public function configureVisualization(Config $properties)
+    public function configureVisualization()
     {
-        $properties->datatable_js_type = 'VisitorLog';
+        $this->config->datatable_js_type = 'VisitorLog';
     }
 }
\ No newline at end of file