diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7c6720e9fc5a5f167e1b07e57e09bc6f5a7ce5e3..06cd5f970c05e60bf7e58f964e04477f0b154413 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,18 @@
 
 This is a changelog for Piwik platform developers. All changes for our HTTP API's, Plugins, Themes, etc will be listed here.
 
+## Piwik 2.7.0
+
+### Deprecations
+* The `Piwik\Menu\MenuAbstract::add()` method is deprecated in favor of `addItem()`. Read more about this here: [#6140](https://github.com/piwik/piwik/issues/6140). We do not plan to remove the deprecated method before Piwik 3.0.
+
+### New APIs
+* It is now easier to generate the URL for a menu item see [#6140](https://github.com/piwik/piwik/issues/6140), [urlForDefaultAction()](http://developer.piwik.org/api-reference/Piwik/Plugin/Menu#urlfordefaultaction), [urlForAction()](http://developer.piwik.org/api-reference/Piwik/Plugin/Menu#urlforaction), [urlForModuleAction()](http://developer.piwik.org/api-reference/Piwik/Plugin/Menu#urlformoduleaction)
+
+### New commands
+* `core:clear-caches` Lets you easily delete all caches. This command can be useful for instance after updating Piwik files manually.
+
+
 ## Piwik 2.6.0
 
 ### New features
@@ -14,7 +26,7 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'
 * If an API returns an indexed array, it is now possible to use `filter_limit` and `filter_offset`. This was before only possible if an API returned a DataTable.
 * The Live API now returns only visitor information of activated plugins. So if for instance the Referrers plugin is deactivated a visitor won't contain any referrers related properties. This is a bugfix as the API was crashing before if some core plugins were deactivated. Affected methods are for instance `getLastVisitDetails` or `getVisitorProfile`. If all core plugins are enabled as by default there will be no change at all except the order of the properties within one visitor.
 
-### New commmands
+### New commands
 * `core:run-scheduled-tasks` Let's you run all scheduled tasks due to run at this time. Useful for instance when testing tasks.
 
 #### Internal change
@@ -66,7 +78,7 @@ We are using `@since` annotations in case we are introducing new API's to make i
   * [MenuUser](http://developer.piwik.org/api-reference/Piwik/Menu/MenuUser) to add or modify user menu items
 * [Tasks](http://developer.piwik.org/api-reference/Piwik/Plugin/Tasks) to add scheduled tasks
 
-### New commmands
+### New commands
 * `generate:theme` Let's you easily generate a new theme and customize colors, see the [Theming guide](http://developer.piwik.org/guides/theming)
 * `generate:update` Let's you generate an update file
 * `generate:report` Let's you generate a report
@@ -84,7 +96,7 @@ We are using `@since` annotations in case we are introducing new API's to make i
 ### Deprecations
 ### New features
 ### New APIs
-### New commmands
+### New commands
 ### New guides
 ### Internal change
  -->
diff --git a/composer.lock b/composer.lock
index 7a30ec861b6458872698f8e97f8dac4e48ba3599..e126a39a7f4169c50799e8cec5b9a1a0928a6f2e 100644
--- a/composer.lock
+++ b/composer.lock
@@ -96,16 +96,16 @@
         },
         {
             "name": "piwik/device-detector",
-            "version": "2.3.1",
+            "version": "2.4",
             "source": {
                 "type": "git",
                 "url": "https://github.com/piwik/device-detector.git",
-                "reference": "9cd0338be126aaf947f20fd08a6381c0c658dca5"
+                "reference": "64d91375aea2340b81e2cb46745dc3b2213d3231"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/piwik/device-detector/zipball/9cd0338be126aaf947f20fd08a6381c0c658dca5",
-                "reference": "9cd0338be126aaf947f20fd08a6381c0c658dca5",
+                "url": "https://api.github.com/repos/piwik/device-detector/zipball/64d91375aea2340b81e2cb46745dc3b2213d3231",
+                "reference": "64d91375aea2340b81e2cb46745dc3b2213d3231",
                 "shasum": ""
             },
             "require": {
@@ -139,21 +139,21 @@
                 "parser",
                 "useragent"
             ],
-            "time": "2014-08-11 20:21:18"
+            "time": "2014-08-29 18:24:04"
         },
         {
             "name": "symfony/console",
-            "version": "v2.5.3",
+            "version": "v2.5.4",
             "target-dir": "Symfony/Component/Console",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Console.git",
-                "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63"
+                "reference": "748beed2a1e73179c3f5154d33fe6ae100c1aeb1"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Console/zipball/cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
-                "reference": "cd2d1e4bac2206b337326b0140ff475fe9ad5f63",
+                "url": "https://api.github.com/repos/symfony/Console/zipball/748beed2a1e73179c3f5154d33fe6ae100c1aeb1",
+                "reference": "748beed2a1e73179c3f5154d33fe6ae100c1aeb1",
                 "shasum": ""
             },
             "require": {
@@ -194,7 +194,7 @@
             ],
             "description": "Symfony Console Component",
             "homepage": "http://symfony.com",
-            "time": "2014-08-05 09:00:40"
+            "time": "2014-08-14 16:10:54"
         },
         {
             "name": "tedivm/jshrink",
@@ -687,16 +687,16 @@
         },
         {
             "name": "phpunit/phpunit",
-            "version": "4.2.4",
+            "version": "4.2.5",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git",
-                "reference": "f0c2d374ad06ec1e56c721f4ed87c59ff35f440e"
+                "reference": "c3abe5953d1e60a0bf23012b1bc8c4d07f4832d7"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f0c2d374ad06ec1e56c721f4ed87c59ff35f440e",
-                "reference": "f0c2d374ad06ec1e56c721f4ed87c59ff35f440e",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c3abe5953d1e60a0bf23012b1bc8c4d07f4832d7",
+                "reference": "c3abe5953d1e60a0bf23012b1bc8c4d07f4832d7",
                 "shasum": ""
             },
             "require": {
@@ -757,20 +757,20 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2014-08-31 06:46:49"
+            "time": "2014-09-06 18:38:27"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
-            "version": "2.2.0",
+            "version": "2.2.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
-                "reference": "42e589e08bc86e3e9bdf20d385e948347788505b"
+                "reference": "b241b18d87a47093f20fae8b0ba40379b00bd53a"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/42e589e08bc86e3e9bdf20d385e948347788505b",
-                "reference": "42e589e08bc86e3e9bdf20d385e948347788505b",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/b241b18d87a47093f20fae8b0ba40379b00bd53a",
+                "reference": "b241b18d87a47093f20fae8b0ba40379b00bd53a",
                 "shasum": ""
             },
             "require": {
@@ -779,7 +779,7 @@
                 "phpunit/php-text-template": "~1.2"
             },
             "require-dev": {
-                "phpunit/phpunit": "4.2.*@dev"
+                "phpunit/phpunit": "~4.2"
             },
             "suggest": {
                 "ext-soap": "*"
@@ -796,9 +796,6 @@
                 ]
             },
             "notification-url": "https://packagist.org/downloads/",
-            "include-path": [
-                ""
-            ],
             "license": [
                 "BSD-3-Clause"
             ],
@@ -815,7 +812,7 @@
                 "mock",
                 "xunit"
             ],
-            "time": "2014-08-02 13:50:58"
+            "time": "2014-09-06 17:32:37"
         },
         {
             "name": "sebastian/comparator",
@@ -1086,17 +1083,17 @@
         },
         {
             "name": "symfony/yaml",
-            "version": "v2.5.3",
+            "version": "v2.5.4",
             "target-dir": "Symfony/Component/Yaml",
             "source": {
                 "type": "git",
                 "url": "https://github.com/symfony/Yaml.git",
-                "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f"
+                "reference": "01a7695bcfb013d0a15c6757e15aae120342986f"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Yaml/zipball/5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f",
-                "reference": "5a75366ae9ca8b4792cd0083e4ca4dff9fe96f1f",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/01a7695bcfb013d0a15c6757e15aae120342986f",
+                "reference": "01a7695bcfb013d0a15c6757e15aae120342986f",
                 "shasum": ""
             },
             "require": {
@@ -1129,12 +1126,10 @@
             ],
             "description": "Symfony Yaml Component",
             "homepage": "http://symfony.com",
-            "time": "2014-08-05 09:00:40"
+            "time": "2014-08-31 03:22:04"
         }
     ],
-    "aliases": [
-
-    ],
+    "aliases": [],
     "minimum-stability": "stable",
     "stability-flags": {
         "facebook/xhprof": 20
@@ -1143,7 +1138,5 @@
     "platform": {
         "php": ">=5.3.2"
     },
-    "platform-dev": [
-
-    ]
+    "platform-dev": []
 }
diff --git a/core/Factory.php b/core/BaseFactory.php
similarity index 96%
rename from core/Factory.php
rename to core/BaseFactory.php
index 480f9313c17c80ae035044eb1eb9f7f45ba449f1..e24b6dfc02f337f10b384b64ec4e4b713b7c51c5 100644
--- a/core/Factory.php
+++ b/core/BaseFactory.php
@@ -20,13 +20,13 @@ use Exception;
  * Derived classes should override the **getClassNameFromClassId** and **getInvalidClassIdExceptionMessage**
  * static methods. 
  */
-abstract class Factory
+abstract class BaseFactory
 {
     /**
      * Creates a new instance of a class using a string ID.
      *
      * @param string $classId The ID of the class.
-     * @return Factory
+     * @return BaseFactory
      * @throws Exception if $classId is invalid.
      */
     public static function factory($classId)
diff --git a/core/DataTable/Renderer.php b/core/DataTable/Renderer.php
index aea71e4da863ae42bd4f49912db0911cb9e8d8c9..e366cc2ec8534912d4da3da37ef4b0748d1ce96e 100644
--- a/core/DataTable/Renderer.php
+++ b/core/DataTable/Renderer.php
@@ -12,7 +12,7 @@ use Exception;
 use Piwik\DataTable;
 use Piwik\Metrics;
 use Piwik\Piwik;
-use Piwik\Factory;
+use Piwik\BaseFactory;
 
 /**
  * A DataTable Renderer can produce an output given a DataTable object.
@@ -22,7 +22,7 @@ use Piwik\Factory;
  *  $render->setTable($dataTable);
  *  echo $render;
  */
-abstract class Renderer extends Factory
+abstract class Renderer extends BaseFactory
 {
     protected $table;
 
diff --git a/core/Menu/MenuAbstract.php b/core/Menu/MenuAbstract.php
index 2ccf6fda289e6f9809f0b0622541d355e52bc3be..1fe1152c98e38ffca391eee2601919fcb1299cfd 100644
--- a/core/Menu/MenuAbstract.php
+++ b/core/Menu/MenuAbstract.php
@@ -77,16 +77,32 @@ abstract class MenuAbstract extends Singleton
      *                                         current user. If false, the entry will not be added.
      * @param int $order The order hint.
      * @param bool|string $tooltip An optional tooltip to display or false to display the tooltip.
-     * @api
+     *
+     * @deprecated since 2.7.0 Use {@link addItem() instead}. Method will be removed in Piwik 3.0
      */
     public function add($menuName, $subMenuName, $url, $displayedForCurrentUser = true, $order = 50, $tooltip = false)
     {
         if (!$displayedForCurrentUser) {
-            // TODO this parameter should be removed and instead menu items should be only added if it is supposed to be
-            // displayed. Won't do it now to stay backward compatible. For Piwik 3.0 we should do it.
             return;
         }
 
+        $this->addItem($menuName, $subMenuName, $url, $order, $tooltip);
+    }
+
+    /**
+     * Adds a new entry to the menu.
+     *
+     * @param string $menuName The menu's category name. Can be a translation token.
+     * @param string $subMenuName The menu item's name. Can be a translation token.
+     * @param string|array $url The URL the admin menu entry should link to, or an array of query parameters
+     *                          that can be used to build the URL.
+     * @param int $order The order hint.
+     * @param bool|string $tooltip An optional tooltip to display or false to display the tooltip.
+     * @since 2.7.0
+     * @api
+     */
+    public function addItem($menuName, $subMenuName, $url, $order = 50, $tooltip = false)
+    {
         // make sure the idSite value used is numeric (hack-y fix for #3426)
         if (!is_numeric(Common::getRequestVar('idSite', false))) {
             $idSites = API::getInstance()->getSitesIdWithAtLeastViewAccess();
diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php
index 7b6298dfe7b3663736e34a4d9d649e006388a126..3ebad0f1eda42ee437889b0a9f702b61e7c4d796 100644
--- a/core/Plugin/Controller.php
+++ b/core/Plugin/Controller.php
@@ -252,13 +252,13 @@ abstract class Controller
      * Assigns the given variables to the template and renders it.
      *
      * Example:
-     * ```
- public function myControllerAction () {
-    return $this->renderTemplate('index', array(
-        'answerToLife' => '42'
-    ));
- }
-     ```
+     *
+     *     public function myControllerAction () {
+     *        return $this->renderTemplate('index', array(
+     *            'answerToLife' => '42'
+     *        ));
+     *     }
+     *
      * This will render the 'index.twig' file within the plugin templates folder and assign the view variable
      * `answerToLife` to `42`.
      *
@@ -278,7 +278,17 @@ abstract class Controller
         }
 
         $view = new View($template);
-        $this->setBasicVariablesView($view);
+
+        // alternatively we could check whether the templates extends either admin.twig or dashboard.twig and based on
+        // that call the correct method. This will be needed once we unify Controller and ControllerAdmin see
+        // https://github.com/piwik/piwik/issues/6151
+        if ($this instanceof ControllerAdmin) {
+            $this->setBasicVariablesView($view);
+        } elseif (empty($this->site) || empty($this->idSite)) {
+            $this->setBasicVariablesView($view);
+        } else {
+            $this->setGeneralVariablesView($view);
+        }
 
         foreach ($variables as $key => $value) {
             $view->$key = $value;
diff --git a/core/Plugin/Menu.php b/core/Plugin/Menu.php
index 9f7240b1f30be30de921caad56b4405c5aac0648..6d2bdefccd28908042c9da8ed2c7a72b82a37deb 100644
--- a/core/Plugin/Menu.php
+++ b/core/Plugin/Menu.php
@@ -8,10 +8,12 @@
  */
 namespace Piwik\Plugin;
 
+use Piwik\Development;
 use Piwik\Menu\MenuAdmin;
 use Piwik\Menu\MenuReporting;
 use Piwik\Menu\MenuTop;
 use Piwik\Menu\MenuUser;
+use Piwik\Plugin\Manager as PluginManager;
 
 /**
  * Base class of all plugin menu providers. Plugins that define their own menu items can extend this class to easily
@@ -27,6 +29,106 @@ use Piwik\Menu\MenuUser;
  */
 class Menu
 {
+    protected $module = '';
+
+    /**
+     * @ignore
+     */
+    public function __construct()
+    {
+        $this->module = $this->getModule();
+    }
+
+    private function getModule()
+    {
+        $className = get_class($this);
+        $className = explode('\\', $className);
+
+        return $className[2];
+    }
+
+    /**
+     * Generates a URL for the default action of the plugin controller.
+     *
+     * Example:
+     * ```
+     * $menu->addItem('UI Framework', '', $this->urlForDefaultAction(), $orderId = 30);
+     * // will add a menu item that leads to the default action of the plugin controller when a user clicks on it.
+     * // The default action is usually the `index` action - meaning the `index()` method the controller -
+     * // but the default action can be customized within a controller
+     * ```
+     *
+     * @param  array $additionalParams  Optional URL parameters that will be appended to the URL
+     * @return array
+     *
+     * @since 2.7.0
+     * @api
+     */
+    protected function urlForDefaultAction($additionalParams = array())
+    {
+        $params = (array) $additionalParams;
+        $params['action'] = '';
+        $params['module'] = $this->module;
+
+        return $params;
+    }
+
+    /**
+     * Generates a URL for the given action. In your plugin controller you have to create a method with the same name
+     * as this method will be executed when a user clicks on the menu item. If you want to generate a URL for the
+     * action of another module, meaning not your plugin, you should use the method {@link urlForModuleAction()}.
+     *
+     * @param  string $controllerAction  The name of the action that should be executed within your controller
+     * @param  array  $additionalParams  Optional URL parameters that will be appended to the URL
+     * @return array
+     *
+     * @since 2.7.0
+     * @api
+     */
+    protected function urlForAction($controllerAction, $additionalParams = array())
+    {
+        $this->checkisValidCallable($this->module, $controllerAction);
+
+        $params = (array) $additionalParams;
+        $params['action'] = $controllerAction;
+        $params['module'] = $this->module;
+
+        return $params;
+    }
+
+    /**
+     * Generates a URL for the given action of the given module. We usually do not recommend to use this method as you
+     * should make sure the method of that module actually exists. If the plugin owner of that module changes the method
+     * in a future version your link might no longer work. If you want to link to an action of your controller use the
+     * method {@link urlForAction()}. Note: We will generate a link only if the given module is installed and activated.
+     *
+     * @param  string $module            The name of the module/plugin the action belongs to. The module name is case sensitive.
+     * @param  string $controllerAction  The name of the action that should be executed within your controller
+     * @param  array  $additionalParams  Optional URL parameters that will be appended to the URL
+     * @return array|null   Returns null if the given module is either not installed or not activated. Returns the URL
+     *                      to the given module action otherwise.
+     *
+     * @since 2.7.0
+     * // not API for now
+     */
+    protected function urlForModuleAction($module, $controllerAction, $additionalParams = array())
+    {
+        $this->checkisValidCallable($module, $controllerAction);
+
+        $pluginManager = PluginManager::getInstance();
+
+        if (!$pluginManager->isPluginLoaded($module) ||
+            !$pluginManager->isPluginActivated($module)) {
+            return null;
+        }
+
+        $params = (array) $additionalParams;
+        $params['action'] = $controllerAction;
+        $params['module'] = $module;
+
+        return $params;
+    }
+
     /**
      * Configures the reporting menu which should only contain links to reports of a specific site such as
      * "Search Engines", "Page Titles" or "Locations & Provider".
@@ -59,4 +161,32 @@ class Menu
     {
     }
 
+    private function checkisValidCallable($module, $action)
+    {
+        if (!Development::isEnabled()) {
+            return;
+        }
+
+        $prefix = 'Menu item added in ' . get_class($this) . ' will fail when being selected. ';
+
+        if (!is_string($action)) {
+            Development::error($prefix . 'No valid action is specified. Make sure the defined action that should be executed is a string.');
+        }
+
+        $reportAction = lcfirst(substr($action, 4));
+        if (Report::factory($module, $reportAction)) {
+            return;
+        }
+
+        $controllerClass = '\\Piwik\\Plugins\\' . $module . '\\Controller';
+
+        if (!Development::methodExists($controllerClass, $action)) {
+            Development::error($prefix . 'The defined action "' . $action . '" does not exist in ' . $controllerClass . '". Make sure to define such a method.');
+        }
+
+        if (!Development::isCallableMethod($controllerClass, $action)) {
+            Development::error($prefix . 'The defined action "' . $action . '" is not callable on "' . $controllerClass . '". Make sure the method is public.');
+        }
+    }
+
 }
diff --git a/core/ReportRenderer.php b/core/ReportRenderer.php
index e6ccc530ed818679f956d8eda91ddccbed0caa17..9cf58448f73163dfd03a04afa963896002d9deba 100644
--- a/core/ReportRenderer.php
+++ b/core/ReportRenderer.php
@@ -14,13 +14,13 @@ use Piwik\DataTable\Row;
 use Piwik\DataTable\Simple;
 use Piwik\DataTable;
 use Piwik\Plugins\ImageGraph\API;
-use Piwik\Factory;
+use Piwik\BaseFactory;
 
 /**
  * A Report Renderer produces user friendly renderings of any given Piwik report.
  * All new Renderers must be copied in ReportRenderer and added to the $availableReportRenderers.
  */
-abstract class ReportRenderer extends Factory
+abstract class ReportRenderer extends BaseFactory
 {
     const DEFAULT_REPORT_FONT = 'dejavusans';
     const REPORT_TEXT_COLOR = "68,68,68";
diff --git a/core/Version.php b/core/Version.php
index 7852698ba53629d5f317de465a5f289a44a62b35..a5effe147f9188d8a9b5fd85e7f6577756f6e2c9 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -21,5 +21,5 @@ final class Version
      * The current Piwik version.
      * @var string
      */
-    const VERSION = '2.6.1-b1';
+    const VERSION = '2.7.0-b1';
 }
diff --git a/core/View.php b/core/View.php
index fe6494c87ea67e0f7f606ecb929f3c4316657f73..c62c0eed78f3bbb4647bcba63887b9e6c13cfe90 100644
--- a/core/View.php
+++ b/core/View.php
@@ -232,6 +232,8 @@ class View implements ViewInterface
             $user = APIUsersManager::getInstance()->getUser($this->userLogin);
             $this->userAlias = $user['alias'];
         } catch (Exception $e) {
+            Log::verbose($e);
+
             // can fail, for example at installation (no plugin loaded yet)
         }
 
@@ -253,7 +255,16 @@ class View implements ViewInterface
 
     protected function renderTwigTemplate()
     {
-        $output = $this->twig->render($this->getTemplateFile(), $this->getTemplateVars());
+        try {
+            $output = $this->twig->render($this->getTemplateFile(), $this->getTemplateVars());
+        } catch (Exception $ex) {
+            // twig does not rethrow exceptions, it wraps them so we log the cause if we can find it
+            $cause = $ex->getPrevious();
+            Log::debug($cause === null ? $ex : $cause);
+
+            throw $ex;
+        }
+
         $output = $this->applyFilter_cacheBuster($output);
 
         $helper = new Theme;
diff --git a/lang/cs.json b/lang/cs.json
index 7fccf65c867de09e6585ce36b740ca1db68e8380..2aa35778cc55548ee7dfbaae44a033b1cdf6e788 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -10,12 +10,12 @@
         "Add": "Přidat",
         "AfterEntry": "Po vložení dne",
         "All": "VÅ¡e",
-        "AllowPiwikArchivingToTriggerBrowser": "Spouštět archovování když jsou hlášení prohlížena ve Web prohlížeči",
+        "AllowPiwikArchivingToTriggerBrowser": "Povolit spouštění archivování, když jsou hlášení prohlížena ve Webovém prohlížeči",
         "AllWebsitesDashboard": "Nástěnka pro všechny weby",
         "And": "a",
         "API": "API",
-        "ApplyDateRange": "Aplikovat vybraný rozsah",
-        "ArchivingInlineHelp": "Pro web stránky se střední, nebo vysokou návštěvností je doporučeno zakázat archivování Piwiku z web prohlížeče. Místo toho doporučujeme vytvoření úlohy pro cron",
+        "ApplyDateRange": "Použít vybraný rozsah",
+        "ArchivingInlineHelp": "Pro web stránky se střední nebo vysokou návštěvností je doporučeno zakázat archivování Piwiku z webového prohlížeče. Místo toho doporučujeme vytvoření úlohy pro cron",
         "ArchivingTriggerDescription": "Doporučeno pro větší instalace Piwiku, potřebujete %snastavit cron úlohu%s na automatické spracování hlášení.",
         "AuthenticationMethodSmtp": "Autentizační metoda SMTP",
         "AverageOrderValue": "Průměrná hodnota objednávky",
@@ -23,12 +23,12 @@
         "AverageQuantity": "Průměrné množství",
         "BackToPiwik": "Zpět do Piwiku",
         "Broken": "Rozbité",
-        "BrokenDownReportDocumentation": "Je členěn do různých hlášení, která jsou zobrazena dolní části stránky. Vybraný graf můžete zvětšit tak, že na něj kliknete.",
+        "BrokenDownReportDocumentation": "Je členěn do různých hlášení, která jsou zobrazena v dolní části stránky. Vybraný graf můžete zvětšit tak, že na něj kliknete.",
         "Cancel": "Zrušit",
         "CannotUnzipFile": "Nelze rozbalit soubor %1$s: %2$s",
         "ChangePassword": "Změnit heslo",
-        "ChangeTagCloudView": "Všimněte si, že můžete zobrazit hlášení jinak, než jako tag cloud. Pro změnu zobrazení použíjte ovládací prvky pod ním.",
-        "ChooseDate": "Vyber datum",
+        "ChangeTagCloudView": "Všimněte si, že můžete zobrazit hlášení jinak, než jako tag cloud. Pro změnu zobrazení použijte ovládací prvky pod ním.",
+        "ChooseDate": "Zvolte datum",
         "ChooseLanguage": "Zvolte jazyk",
         "ChoosePeriod": "Zvolte období",
         "ChooseWebsite": "Zvolte web",
@@ -37,51 +37,51 @@
         "ClickToChangePeriod": "Klikni znovu pro změnu období.",
         "Close": "Zavřít",
         "ColumnActionsPerVisit": "Akcí za návštěvu",
-        "ColumnActionsPerVisitDocumentation": "Průměrní počet akcí (zobrazení stránek, stažení nebo externích odkazů) za návštěvu.",
-        "ColumnAverageGenerationTime": "Průměrný generovaný čas",
+        "ColumnActionsPerVisitDocumentation": "Průměrný počet akcí (zobrazení stránek, stažení nebo externích odkazů) za návštěvu.",
+        "ColumnAverageGenerationTime": "Průměrný čas generování",
         "ColumnAverageGenerationTimeDocumentation": "Průměrný čas, za který byla stránka vygenerována. Toto měření zahrnuje čas, který potřeboval server k vygenerování stránky plus čas, který potřeboval klient k jejímu stažení. Kratší průměrný čas znamená rychlejší stránku.",
-        "ColumnAverageTimeOnPage": "Přůměrně času na stránce",
-        "ColumnAverageTimeOnPageDocumentation": "Průměrný celkový čas strávený na stránce (pouze konkrétní stránky),",
+        "ColumnAverageTimeOnPage": "Průměrný čas na stránce",
+        "ColumnAverageTimeOnPageDocumentation": "Průměrný celkový čas strávený na stránce (pouze konkrétní stránky, ne celý web).",
         "ColumnAvgTimeOnSite": "Průměrně času na stránkách",
         "ColumnAvgTimeOnSiteDocumentation": "Průměrná doba jedné návštěvy",
         "ColumnBounceRate": "Odchozí frekvence",
         "ColumnBounceRateDocumentation": "Procento návštěv, které měly jedno zobrazení. To znamená návštěvníci, kteří po zobrazení stránky okamžitě odešli.",
         "ColumnBounceRateForPageDocumentation": "Procento návštěv, které začaly a skončily touto stránkou",
         "ColumnBounces": "Ihned odchozí",
-        "ColumnBouncesDocumentation": "Počet návštěv, které začaly a skončily na touto stránkou. To znamená, kteří navštívily jen tuto stránku.",
+        "ColumnBouncesDocumentation": "Počet návštěv, které začaly a skončily na této stránce. To znamená, kteří navštívily jen tuto stránku.",
         "ColumnConversionRate": "Frekvence konverzí",
-        "ColumnConversionRateDocumentation": "Procento návštěv, které provedli konverzi Cíle,",
+        "ColumnConversionRateDocumentation": "Procento návštěv, které provedly konverzi Cíle.",
         "ColumnDestinationPage": "Cílová stránka",
         "ColumnEntrances": "Vstupy",
-        "ColumnEntrancesDocumentation": "Počet návštěvníků, kteří započali návštěvu touto stránkovu.",
+        "ColumnEntrancesDocumentation": "Počet návštěvníků, kteří započali návštěvu touto stránkou.",
         "ColumnExitRate": "Frekvence odchodů",
         "ColumnExitRateDocumentation": "Procentuální vyjádření těch, kteří opustili tuto stránku po jejím zobrazení.",
         "ColumnExits": "Odchody",
-        "ColumnExitsDocumentation": "Počet návštěv, které skončily touto stránkovu.",
+        "ColumnExitsDocumentation": "Počet návštěv, které skončily touto stránkou.",
         "ColumnGenerationTime": "Čas generování",
         "ColumnKeyword": "Klíčové slovo",
         "ColumnLabel": "Popisek",
         "ColumnMaxActions": "Maximální počet akcí při jedné návštěvě",
         "ColumnNbActions": "Akce",
-        "ColumnNbActionsDocumentation": "Počet akcí Vašich návstěvníků. Akcí se rozumí zobrazení stránky, stažení a kliknutí na externí odkazy.",
+        "ColumnNbActionsDocumentation": "Počet akcí Vašich návštěvníků. Akcí se rozumí zobrazení stránky, stažení a kliknutí na externí odkazy.",
         "ColumnNbUniqVisitors": "Jedineční návštěvníci",
         "ColumnNbUniqVisitorsDocumentation": "Počet neduplicitních návštěvníků, kteří navštívili vaše stránky. Každý návštěvník je počítán pouze jednou, ikdyž třeba přišel několikrát za den.",
         "ColumnNbVisits": "Návštěv",
-        "ColumnNbVisitsDocumentation": "Pokud návštěvník přijde na vaše stránky poprvé, nebo po třiceti minutách, je tato návštěva započítána jako nová.",
+        "ColumnNbVisitsDocumentation": "Pokud návštěvník přijde na vaše stránky poprvé nebo po třiceti minutách, je tato návštěva započítána jako nová.",
         "ColumnPageBounceRateDocumentation": "Procento návštěv, které začaly touto stránkou a ihned ji opustili.",
         "ColumnPageviews": "Zobrazení stránek",
-        "ColumnPageviewsDocumentation": "Počet navštívení této stránky.",
+        "ColumnPageviewsDocumentation": "Počet návštěv této stránky.",
         "ColumnPercentageVisits": "% návštěv",
         "ColumnRevenue": "Příjem",
         "ColumnSumVisitLength": "Celkový čas strávený návštěvníky (v sekundách)",
         "ColumnTotalPageviews": "Celkem zobrazených stránek",
-        "ColumnUniqueEntrances": "Unikátních navštívení stránky",
+        "ColumnUniqueEntrances": "Unikátních vstupů",
         "ColumnUniqueExits": "Unikátních opuštění stránky",
         "ColumnUniquePageviews": "Jedinečná zobrazení stránek",
         "ColumnUniquePageviewsDocumentation": "Počet návštěvníků, kteří navštívily tuto stránku. Pokud byla tato stránka navštívena několikrát, návštěva je započítána jen jednou.",
         "ColumnValuePerVisit": "Hodnota za návštěvu",
         "ColumnViewedAfterSearch": "Kliknuto ve výsledcích vyhledávání",
-        "ColumnViewedAfterSearchDocumentation": "ePočet návštěv této stránky poté, co návštěvník provedl vyhledávání a kliknul na tuto stránku.",
+        "ColumnViewedAfterSearchDocumentation": "Počet návštěv této stránky poté, co návštěvník provedl vyhledávání a kliknul na tuto stránku.",
         "ColumnVisitDuration": "Doba návštěvy (v sekundách)",
         "ColumnVisitsWithConversions": "Návštěvy s přechodem",
         "ConfigFileIsNotWritable": "Konfigurační soubor Piwiku %s není zapisovatelný, některé změny nebudou uloženy. %s Prosím upravte oprávnění ke konfiguračnímu souboru",
@@ -121,15 +121,15 @@
         "Desktop": "Desktop",
         "Details": "Detaily",
         "Discount": "Sleva",
-        "DisplaySimpleTable": "Zobrazit jednotuchou tabulku",
+        "DisplaySimpleTable": "Zobrazit jednoduchou tabulku",
         "DisplayTableWithGoalMetrics": "Zobrazit tabulku s měřením cílů",
         "DisplayTableWithMoreMetrics": "Zobrazit tabulku s více měřeními",
         "Documentation": "Dokumentace",
         "Donate": "Přispějte",
         "Done": "Hotovo",
         "Download": "Stáhnout",
-        "DownloadFail_FileExists": "Sobor %s již existuje!",
-        "DownloadFail_FileExistsContinue": "Pokus o pokračování stahování %s, ale celý stažený soubor už existuje!",
+        "DownloadFail_FileExists": "Soubor %s již existuje!",
+        "DownloadFail_FileExistsContinue": "Pokus o pokračování stahování %s, ale celý stažený soubor již existuje!",
         "DownloadFail_HttpRequestFail": "Nepodařilo se stáhnout soubor. Něco může být v nepořádku se stránkou, z níž byl soubor stahován. Můžete to zkusit později nebo můžete soubor stáhnout sami.",
         "DownloadFullVersion": "%1$sStáhnout%2$s plnou verzi! Podívejte se na %3$s",
         "DownloadPleaseRemoveExisting": "Pokud to chcete nahradit, odstraňte stávající soubor.",
@@ -138,7 +138,7 @@
         "EcommerceVisitStatusDesc": "Stav elektronického obchodu na konci návštěvy",
         "EcommerceVisitStatusEg": "Například pro výběr všech návštěv, které obsahují elektronickou objednávku, API požadavek by byl %s",
         "Edit": "Upravit",
-        "EncryptedSmtpTransport": "Zadejte šifrování transportvní vrsty vyžadované vaším SMTP serverem.",
+        "EncryptedSmtpTransport": "Zadejte šifrování transportní vrstvy vyžadované vaším SMTP serverem.",
         "EnglishLanguageName": "Czech",
         "Error": "Chyba",
         "ErrorRequest": "Ajaj! Při požadavku došlo k chybě. Na serveru mohlo dojít k dočasnému problému, nebo jste požádali o hlášení s příliš mnoha daty. Prosím, zkuste to znovu. Pokud se bude problém opakovat, %skontaktujte svého administrátora Piwiku%s.",
@@ -150,7 +150,7 @@
         "ExceptionFileIntegrity": "Test integrity selhal: %s",
         "ExceptionFilesizeMismatch": "Nesouhlasí velikost souboru: %1$s (očekávaná délka: %2$s, nalezeno: %3$s)",
         "ExceptionIncompatibleClientServerVersions": "Vaše %1$s verze klienta je %2$s tato je ale nekompatibilní se serverem %3$s.",
-        "ExceptionInvalidAggregateReportsFormat": "Agregovaný formát hlášený %s není platný. Zkuste místo toho nějaký z %s.",
+        "ExceptionInvalidAggregateReportsFormat": "Agregovaný formát hlášení %s není platný. Zkuste místo toho nějaký z %s.",
         "ExceptionInvalidArchiveTimeToLive": "Dnešní doba života archivu musí být číslo větší než nula",
         "ExceptionInvalidDateFormat": "Formát data musí být: %s nebo klíčové slovo podporované funkcí %s (více informací viz %s)",
         "ExceptionInvalidDateRange": "Datum '%s' není v platném rozmezí. Může mít následující formát: %s.",
@@ -233,7 +233,7 @@
         "LongMonth_7": "ÄŒervenec",
         "LongMonth_8": "Srpen",
         "LongMonth_9": "Září",
-        "MainMetrics": "Vlastní měření",
+        "MainMetrics": "Hlavní metriky",
         "Matches": "Shody",
         "MediumToHighTrafficItIsRecommendedTo": "Pro weby se středním, nebo velkým provozem doporučujeme zpracovat dnešní hlášení každou půlhodinu (%s vteřin), nebo každou hodinu (%s vteřin)",
         "Metadata": "Meta data",
@@ -314,14 +314,14 @@
         "Plugins": "Zásuvné moduly",
         "PoweredBy": "Běží na",
         "Previous": "Předchozí",
-        "PreviousDays": "předešlých %s dní (kromě dneška)",
+        "PreviousDays": "předešlých %s dnů (kromě dneška)",
         "PreviousDaysShort": "Předchozích %s dnů",
         "Price": "Cena",
         "ProductConversionRate": "Konverzní poměr",
         "ProductRevenue": "Hodnota produktu",
         "PurchasedProducts": "Zakoupené produkty",
         "Quantity": "Množství",
-        "RangeReports": "Upravit rozmezí dní",
+        "RangeReports": "Vlastní rozsahy dat",
         "ReadThisToLearnMore": "%1$sPokud se chcete dozvědět více, přečtěte si toto.%2$s",
         "Recommended": "(doporučuje se)",
         "RecordsToPlot": "Záznamy k vykreslení",
@@ -375,7 +375,7 @@
         "ShortMonth_8": "Srp",
         "ShortMonth_9": "Zář",
         "Show": "zobrazit",
-        "SingleWebsitesDashboard": "Nástěnka jedněch stránek",
+        "SingleWebsitesDashboard": "Nástěnka pro jedny stránek",
         "SmallTrafficYouCanLeaveDefault": "Pro weby s malým provozem můžete ponechat výchozích %s sekund a uvidíte všechna hlášení v reálném čase",
         "SmtpEncryption": "SMTP šifrování",
         "SmtpPassword": "Heslo SMTP",
@@ -411,9 +411,9 @@
         "View": "Zobrazit",
         "ViewDocumentationFor": "Zobrazit dokumentaci pro %1$s",
         "Visit": "Návštěva",
-        "VisitConvertedGoal": "Návštěva, která převedla alespoň jeden Cíl.",
-        "VisitConvertedGoalId": "Návštěva, která převedla konkrétní ID Cíl.",
-        "VisitConvertedNGoals": "Návstěva převedla %s Cílů.",
+        "VisitConvertedGoal": "Návštěva, která provedla alespoň jednu konverzi Cíle.",
+        "VisitConvertedGoalId": "Návštěva, která provedla konverzi konkrétního ID Cíle.",
+        "VisitConvertedNGoals": "Návštěva provedla %s konverzí Cílůb.",
         "VisitDuration": "Průměrná doba trvání návštěv (v sekundách)",
         "Visitor": "Návštěvník",
         "VisitorID": "ID návštěvníka",
@@ -421,7 +421,7 @@
         "Visitors": "Návštěvníci",
         "VisitsWith": "Návštěv s %s",
         "VisitType": "Typ návštěvníka",
-        "VisitTypeExample": "Například pro výběr všech návštěvníků, kteří se vrátili na stránky včetně těch, co si v předcchozích návštěvách něco koupili, API požadavek by obsahoval %s",
+        "VisitTypeExample": "Například pro výběr všech návštěvníků, kteří se vrátili na stránky včetně těch, co si v předcchozích návštěvách něco koupili, by API požadavek obsahoval %s",
         "Warning": "Varování",
         "WarningFileIntegrityNoManifest": "Test integrity nemůže být proveden z důvodů chybějícího souboru manifest.inc.php.",
         "WarningFileIntegrityNoManifestDeployingFromGit": "Pokud nasazujete Piwik z Gitu, pak je tato zpráva normální.",
diff --git a/misc/composer/build-xhprof.sh b/misc/composer/build-xhprof.sh
index 95057dc26e48382c1dc0cfff1859898a4c31e0fc..517d228d0bc3dfa2d54e8abedd99c5b061b95d98 100755
--- a/misc/composer/build-xhprof.sh
+++ b/misc/composer/build-xhprof.sh
@@ -11,6 +11,11 @@ if ! type make &> /dev/null; then
     exit
 fi
 
+if ! [ -d "vendor/facebook/xhprof/extension" ]; then
+    echo "xhprof missing, skipping build"
+    exit
+fi
+
 mkdir -p tmp/xhprof-logs
 
 cd vendor/facebook/xhprof/extension
diff --git a/misc/log-analytics/README.md b/misc/log-analytics/README.md
index 7842da798a4f8bd4a869afe429f7510e40a65905..6c4aadf675220451366615d31a3278da007280b5 100644
--- a/misc/log-analytics/README.md
+++ b/misc/log-analytics/README.md
@@ -249,5 +249,19 @@ exec python /path/to/misc/log-analytics/import_logs.py \
  --log-format-name=nginx_json -
 ```
 
+# regex example for syslog format (centralized logs)
+
+## log format exemple
+
+```
+Aug 31 23:59:59 tt-srv-name www.tt.com: 1.1.1.1 - - [31/Aug/2014:23:59:59 +0200] "GET /index.php HTTP/1.0" 200 3838 "http://www.tt.com/index.php" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0" 365020 www.tt.com
+```
+
+## Corresponding regex
+
+```
+--log-format-regex='.* ((?P<ip>\S+) \S+ \S+ \[(?P<date>.*?) (?P<timezone>.*?)\] "\S+ (?P<path>.*?) \S+" (?P<status>\S+) (?P<length>\S+) "(?P<referrer>.*?)" "(?P<user_agent>.*?)").*'
+```
+
 And that's all !
 
diff --git a/plugins/API/Menu.php b/plugins/API/Menu.php
index 0020ecf1c4cd897ab03371767b0ad57e771eea8c..b01c686ac0432ad6c5f142aaa553779ac2e70a9f 100644
--- a/plugins/API/Menu.php
+++ b/plugins/API/Menu.php
@@ -26,7 +26,7 @@ class Menu extends \Piwik\Plugin\Menu
 
     public function configureUserMenu(MenuUser $menu)
     {
-        $apiUrlParams = array('module' => 'API', 'action' => 'listAllAPI', 'segment' => false);
+        $apiUrlParams = $this->urlForAction('listAllAPI', array('segment' => false));
         $tooltip      = Piwik::translate('API_TopLinkTooltip');
 
         $menu->addPlatformItem('General_API', $apiUrlParams, 6, $tooltip);
@@ -45,8 +45,14 @@ class Menu extends \Piwik\Plugin\Menu
         $ua = new OperatingSystem($_SERVER['HTTP_USER_AGENT']);
         $ua->setCache(new DeviceDetectorCache('tracker', 86400));
         $parsedOS = $ua->parse();
+
         if (!empty($parsedOS['short_name']) && in_array($parsedOS['short_name'], array(self::DD_SHORT_NAME_ANDROID, self::DD_SHORT_NAME_IOS))) {
-            $menu->add('Piwik Mobile App', null, array('module' => 'Proxy', 'action' => 'redirect', 'url' => 'http://piwik.org/mobile/'), true, 4);
+
+            $url = $this->urlForModuleAction('Proxy', 'redirect', array('url' => 'http://piwik.org/mobile/'));
+
+            if ($url) {
+                $menu->addItem('Piwik Mobile App', null, $url, 4);
+            }
         }
     }
 
diff --git a/plugins/Actions/Menu.php b/plugins/Actions/Menu.php
index 8804fabe0d0d55de3931951f9c0a05a64d916354..e9ce436b75a4ecf978b907c6e8fb1a421b6447f0 100644
--- a/plugins/Actions/Menu.php
+++ b/plugins/Actions/Menu.php
@@ -14,16 +14,11 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $urlParams = array(
-            'module' => 'Actions',
-            'action' => 'menuGetPageUrls'
-        );
-
-        $menu->addActionsItem('', $urlParams, 15);
+        $menu->addActionsItem('', $this->urlForAction('menuGetPageUrls'), 15);
 
         $actions = new Actions();
         if ($actions->isSiteSearchEnabled()) {
-            $menu->addActionsItem('Actions_SubmenuSitesearch', array('module' => 'Actions', 'action' => 'indexSiteSearch'), 5);
+            $menu->addActionsItem('Actions_SubmenuSitesearch', $this->urlForAction('indexSiteSearch'), 5);
         }
     }
 
diff --git a/plugins/Actions/lang/cs.json b/plugins/Actions/lang/cs.json
index 49e5ab193d36c098ae8b52b2fbcf598e4b646282..4c07889cd43bfc9a31e57fe5299a4254501401d7 100644
--- a/plugins/Actions/lang/cs.json
+++ b/plugins/Actions/lang/cs.json
@@ -30,7 +30,7 @@
         "EntryPageTitles": "Titulky vstupních stránek",
         "EntryPageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích vstupních stránek, které byly použity v daném období.",
         "ExitPagesReportDocumentation": "Toto hlášení obsahuje informace o výstupních stránkách, které se vyskytly v daném období. Výstupní stránka je poslední stránkou, kterou uživatel zobrazí během své návštěvy. %s URL výstupních stránek jsou zobrazeny jako strom složek.",
-        "ExitPageTitles": "Výstupní titulky stránky",
+        "ExitPageTitles": "Titulky výstupních stránek",
         "ExitPageTitlesReportDocumentation": "Toto hlášení obsahuje informace o titulcích výstupních stránek za dané období.",
         "LearnMoreAboutSiteSearchLink": "Zjistěte více o sledování toho, jak návštěvníci používaí váš vyhledávač.",
         "OneSearch": "1 Vyhledávání",
diff --git a/plugins/CoreAdminHome/Controller.php b/plugins/CoreAdminHome/Controller.php
index cbf36ae0940cbbee883658fb5e75327a77b5e1a4..6886b0d336e64e37cd3bcc4887ab4cc19709bc35 100644
--- a/plugins/CoreAdminHome/Controller.php
+++ b/plugins/CoreAdminHome/Controller.php
@@ -259,11 +259,14 @@ class Controller extends \Piwik\Plugin\ControllerAdmin
             ? $language
             : LanguagesManager::getLanguageCodeForCurrentUser();
 
-        return $this->renderTemplate('optOut', array(
-            'trackVisits' => $trackVisits,
-            'nonce'       => Nonce::getNonce('Piwik_OptOut', 3600),
-            'language'    => $lang
-        ));
+        // should not use self::renderTemplate since that uses setBasicVariablesView. this will cause
+        // an error when setBasicVariablesAdminView is called, and MenuTop is requested (the idSite query
+        // parameter is required)
+        $view = new View("@CoreAdminHome/optOut");
+        $view->trackVisits = $trackVisits;
+        $view->nonce = Nonce::getNonce('Piwik_OptOut', 3600);
+        $view->language = $lang;
+        return $view->render();
     }
 
     public function uploadCustomLogo()
diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php
index 368a470fff5cd9e6ebc73214cacf9ed05fb162a3..7926ff9cf58dd1e91639153126d857c3d2f1209b 100644
--- a/plugins/CoreAdminHome/Menu.php
+++ b/plugins/CoreAdminHome/Menu.php
@@ -27,16 +27,16 @@ class Menu extends \Piwik\Plugin\Menu
             $menu->addDevelopmentItem(null, "", $order = 15);
 
             $menu->addSettingsItem('CoreAdminHome_MenuGeneralSettings',
-                                   array('module' => 'CoreAdminHome', 'action' => 'generalSettings'),
+                                   $this->urlForAction('generalSettings'),
                                    $order = 6);
             $menu->addManageItem('CoreAdminHome_TrackingCode',
-                                 array('module' => 'CoreAdminHome', 'action' => 'trackingCodeGenerator'),
+                                 $this->urlForAction('trackingCodeGenerator'),
                                  $order = 4);
         }
 
         if (SettingsManager::hasPluginsSettingsForCurrentUser()) {
             $menu->addSettingsItem('CoreAdminHome_PluginSettings',
-                                   array('module' => 'CoreAdminHome', 'action' => 'pluginSettings'),
+                                   $this->urlForAction('pluginSettings'),
                                    $order = 7);
         }
     }
diff --git a/plugins/CoreConsole/Commands/ClearCaches.php b/plugins/CoreConsole/Commands/ClearCaches.php
new file mode 100644
index 0000000000000000000000000000000000000000..35d96917066870442cb72e8cbc1e2952af41c741
--- /dev/null
+++ b/plugins/CoreConsole/Commands/ClearCaches.php
@@ -0,0 +1,37 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+
+namespace Piwik\Plugins\CoreConsole\Commands;
+
+use Piwik\Filesystem;
+use Piwik\Plugin\ConsoleCommand;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ */
+class ClearCaches extends ConsoleCommand
+{
+    protected function configure()
+    {
+        $this->setName('core:clear-caches');
+        $this->setDescription('Cleares all caches. This command can be useful for instance after updating Piwik files manually.');
+    }
+
+    /**
+     * Execute command like: ./console core:clear-caches
+     */
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        Filesystem::deleteAllCacheOnUpdate();
+
+        $this->writeSuccessMessage($output, array('Caches cleared'));
+    }
+}
diff --git a/plugins/CoreConsole/Commands/GeneratePlugin.php b/plugins/CoreConsole/Commands/GeneratePlugin.php
index 1dddca9b6545ef1f8854891c40d1f165e2a1ca85..2c78036be205a78dd67d86ce739f16e4a9c15435 100644
--- a/plugins/CoreConsole/Commands/GeneratePlugin.php
+++ b/plugins/CoreConsole/Commands/GeneratePlugin.php
@@ -10,6 +10,7 @@
 namespace Piwik\Plugins\CoreConsole\Commands;
 
 use Piwik\Filesystem;
+use Piwik\Version;
 use Symfony\Component\Console\Input\ArrayInput;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
@@ -45,7 +46,8 @@ class GeneratePlugin extends GeneratePluginBase
             $replace       = array(
                 'ExampleTheme'       => $pluginName,
                 'ExampleDescription' => $description,
-                '0.1.0'              => $version
+                '0.1.0'              => $version,
+                'PIWIK_VERSION'      => Version::VERSION
             );
             $whitelistFiles = array();
 
@@ -55,7 +57,8 @@ class GeneratePlugin extends GeneratePluginBase
             $replace       = array(
                 'ExamplePlugin'      => $pluginName,
                 'ExampleDescription' => $description,
-                '0.1.0'              => $version
+                '0.1.0'              => $version,
+                'PIWIK_VERSION'      => Version::VERSION
             );
             $whitelistFiles = array(
                 '/ExamplePlugin.php',
diff --git a/plugins/CorePluginsAdmin/Menu.php b/plugins/CorePluginsAdmin/Menu.php
index cd056720d5b3a59066b266bb06633563a72f6b1a..8279afcc73f7e5a9a22ef328bde94f3414c4b67c 100644
--- a/plugins/CorePluginsAdmin/Menu.php
+++ b/plugins/CorePluginsAdmin/Menu.php
@@ -46,16 +46,16 @@ class Menu extends \Piwik\Plugin\Menu
 
         if ($hasSuperUserAcess) {
             $menu->addPlatformItem(Piwik::translate('General_Plugins') . $pluginsUpdateMessage,
-                                   array('module' => 'CorePluginsAdmin', 'action' => 'plugins', 'activated' => ''),
+                                   $this->urlForAction('plugins', array('activated' => '')),
                                    $order = 1);
             $menu->addPlatformItem(Piwik::translate('CorePluginsAdmin_Themes') . $themesUpdateMessage,
-                                   array('module' => 'CorePluginsAdmin', 'action' => 'themes', 'activated' => ''),
+                                   $this->urlForAction('themes', array('activated' => '')),
                                    $order = 3);
         }
 
         if ($this->isAllowedToSeeMarketPlace()) {
             $menu->addPlatformItem('CorePluginsAdmin_Marketplace',
-                                   array('module' => 'CorePluginsAdmin', 'action' => 'extend', 'activated' => ''),
+                                   $this->urlForAction('extend', array('activated' => '')),
                                    $order = 5);
 
         }
@@ -73,8 +73,8 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if ($this->isAllowedToSeeMarketPlace()) {
             $menu->addPlatformItem('CorePluginsAdmin_Marketplace',
-                array('module' => 'CorePluginsAdmin', 'action' => 'browsePlugins', 'activated' => ''),
-                $order = 5);
+                                   $this->urlForAction('browsePlugins', array('activated' => '')),
+                                   $order = 5);
         }
     }
 }
diff --git a/plugins/CoreUpdater/lang/cs.json b/plugins/CoreUpdater/lang/cs.json
index 6a92dbd5117cf6e1165394a742f02536f27f4126..576d0cf93b83fafdb3c6768da48a0207a1800103 100644
--- a/plugins/CoreUpdater/lang/cs.json
+++ b/plugins/CoreUpdater/lang/cs.json
@@ -1,6 +1,6 @@
 {
     "CoreUpdater": {
-        "ClickHereToViewSqlQueries": "Klikněte zde, abyste viděli a zkopírovali SQL dotazy, které mají být spuštěny",
+        "ClickHereToViewSqlQueries": "Klikněte zde pro zobrazení SQL dotazů s možností je zkopírovat, které mají být spuštěny",
         "CreatingBackupOfConfigurationFile": "Vytvářím zálohu konfiguračního souboru v %s",
         "CriticalErrorDuringTheUpgradeProcess": "Při aktualizaci nastala kritická chyba:",
         "DatabaseUpgradeRequired": "Vyžadováno povýšení databáze",
@@ -20,13 +20,13 @@
         "ExceptionArchiveIncompatible": "Nekompatibilní archiv: %s",
         "ExceptionArchiveIncomplete": "Archiv je nekompletní: některé soubory chybí (např.: %s).",
         "FeedbackRequest": "Zde můžete s týmem Piwiku sdílet nápady a návrhy:",
-        "HelpMessageContent": "Zkontrolujte %1$s Piwik FAQ %2$s , který vysvětluje nejčastějsí chybi při aktualizaci. %3$s Požádejte vašeho systémového administrátora - může vám pomoct s chybou, která je nejčastěji způsobena nastavením serveru MySQL.",
+        "HelpMessageContent": "Zkontrolujte %1$s Piwik FAQ %2$s , kde jsou vysvětleny nejčastější chybi při aktualizaci. %3$s Požádejte vašeho systémového administrátora - může vám pomoct s chybou, která je nejčastěji způsobena nastavením serveru MySQL.",
         "HelpMessageIntroductionWhenError": "Níže je hlavní chybová hláška. Pomůže vám zjistit příčinu, ale pokud budete potřebovat další pomoc:",
         "HelpMessageIntroductionWhenWarning": "Aktualizace proběhla v pořádku, ale byly zaznamenány problémy. Prosím přečtěte si jejich popis výše. Pro další pomoc:",
         "HighTrafficPiwikServerEnableMaintenance": "Pokud provozujete Piwik server s velkým provozem, doporučujeme %sna chvíli zakázat sledování návštěvníků a přepnout uživatelské rozhraní do režimu údržby%s.",
         "IncompatbilePluginsWillBeDisabledInfo": "Poznámka: Některé zásuvné moduly nejsou kompatibilní s Piwikem %s. Budou zakázány při aktualizaci:",
         "InstallingTheLatestVersion": "Instaluji poslední verzi",
-        "MajorUpdateWarning1": "Toto je důležitá aktualizace! Zabere více času, než obvykle.",
+        "MajorUpdateWarning1": "Toto je velká aktualizace! Zabere více času, než obvykle.",
         "MajorUpdateWarning2": "Následující doporučení je především důležité pro velké instalace.",
         "NoteForLargePiwikInstances": "Důležitá poznámka pro rozsáhlé instalace Piwiku",
         "NoteItIsExpectedThatQueriesFail": "Poznámka: Pokud budete SQL dotazy spouštět ručně, některé z nich selžou. V tom případě chyby jednoduše ignorujte a spusťte další dotazy",
@@ -47,8 +47,8 @@
         "TheUpgradeProcessMayTakeAWhilePleaseBePatient": "Aktualizace databáze může chvíli trvat, buďte prosím trpěliví.",
         "UnpackingTheUpdate": "Rozbaluji aktualizaci",
         "UpdateAutomatically": "Aktualizovat automaticky",
-        "UpdateHasBeenCancelledExplanation": "One Click aktualizace Piwiku byla stornována. Pokud nemůžete opravit chybu je doporučeno Piwik aktualizovat manuálně. %1$s Prosím zkontrolujte pro začátek %2$sDokumentaci k aktualizaci%3$s!",
-        "UpdateTitle": "Piwik › Update",
+        "UpdateHasBeenCancelledExplanation": "One Click aktualizace Piwiku byla zrušena. Pokud nemůžete opravit chybu je doporučeno Piwik aktualizovat manuálně. %1$s Prosím zkontrolujte nejdříve %2$sdokumentaci k aktualizaci%3$s!",
+        "UpdateTitle": "Aktualizovat",
         "UpgradeComplete": "Aktualizace je kompletní!",
         "UpgradePiwik": "Aktualizovat Piwik",
         "VerifyingUnpackedFiles": "Ověřuji rozbalené soubory",
@@ -57,6 +57,6 @@
         "YouCanUpgradeAutomaticallyOrDownloadPackage": "Můžete aktualizovat na verzi %s automaticky, nebo si stáhněte balíček a nainstalujte jej manuálně:",
         "YouCouldManuallyExecuteSqlQueries": "Pokud nemůžete použít aktualizaci z příkazového řádku a Piwik nelze aktualizovat (díky vypršení časového limitu v databázi, prohlížeči, nebo z jakéhokoliv jiného důvodu), můžete spustit SQL dotazy ručně",
         "YouMustDownloadPackageOrFixPermissions": "Piwik nemůže přepsat Vaši stávající instalaci. Můžete buď opravit oprávnění k adresářům\/souborům, nebo stáhnout balíček a nainstalovat verzi %s ručně",
-        "YourDatabaseIsOutOfDate": "Vaše databáze Piwiku je zastaralá a musí být aktualizována než budete pokračovat."
+        "YourDatabaseIsOutOfDate": "Vaše databáze Piwiku je zastaralá a musí být aktualizována, než budete pokračovat."
     }
 }
\ No newline at end of file
diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts
index c467c059942e0c4331e79d547c4e3acb4bbd0fa1..825e948c4e3a7b5f8800639d3617998aea88e1e1 160000
--- a/plugins/CustomAlerts
+++ b/plugins/CustomAlerts
@@ -1 +1 @@
-Subproject commit c467c059942e0c4331e79d547c4e3acb4bbd0fa1
+Subproject commit 825e948c4e3a7b5f8800639d3617998aea88e1e1
diff --git a/plugins/DBStats/Menu.php b/plugins/DBStats/Menu.php
index 50f7b8a047a19d3ee0ca8f4ffaa7d25171aaba48..a52b9bd2fd6b843cfae192bfeeb637c9d6bfed53 100644
--- a/plugins/DBStats/Menu.php
+++ b/plugins/DBStats/Menu.php
@@ -19,7 +19,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Piwik::hasUserSuperUserAccess()) {
             $menu->addDiagnosticItem('DBStats_DatabaseUsage',
-                                     array('module' => 'DBStats', 'action' => 'index'),
+                                     $this->urlForAction('index'),
                                      $order = 6);
         }
     }
diff --git a/plugins/DBStats/lang/cs.json b/plugins/DBStats/lang/cs.json
index a74efdea5c75440af443ec5b669dad4fbd1b93d9..d6504b9f1fe9ea74e23d86eebc61f81ea9882460 100644
--- a/plugins/DBStats/lang/cs.json
+++ b/plugins/DBStats/lang/cs.json
@@ -7,9 +7,9 @@
         "IndexSize": "Velikost indexu",
         "LearnMore": "Abyste lépe zjistili, jak Piwik zpracovává data a jak jej nastavit pro weby se středním a velkým provozem, podívejte se do dokumentace %s.",
         "MainDescription": "Piwik ukládá všechny vaše data webové analýzy v MySQL databázi. Nyní tabulky Piwiku využívají %s.",
-        "MetricDataByYear": "Měření tabulek za rok",
-        "MetricTables": "Měřené tabulky",
-        "OtherTables": "Osttaní tabulky",
+        "MetricDataByYear": "Tabulky metrik za rok",
+        "MetricTables": "Tabulky metrik",
+        "OtherTables": "Ostatní tabulky",
         "PluginDescription": "Tento zásuvný modul hlásí využití databáze MySQL tabulkami Piwiku",
         "ReportDataByYear": "Hlášení tabulek za rok",
         "ReportTables": "Hlášení tabulek",
diff --git a/plugins/Dashboard/Menu.php b/plugins/Dashboard/Menu.php
index 2549021fc748a2ae5ca2334160404fb36e2cc6f0..2ee0521623026145354bf34dc2f47ac26be6545c 100644
--- a/plugins/Dashboard/Menu.php
+++ b/plugins/Dashboard/Menu.php
@@ -21,7 +21,7 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->add('Dashboard_Dashboard', '', array('module' => 'Dashboard', 'action' => 'embeddedIndex', 'idDashboard' => 1), true, 5);
+        $menu->addItem('Dashboard_Dashboard', '', $this->urlForAction('embeddedIndex', array('idDashboard' => 1)), 5);
 
         if (!Piwik::isUserIsAnonymous()) {
             $login = Piwik::getCurrentUserLogin();
@@ -31,7 +31,7 @@ class Menu extends \Piwik\Plugin\Menu
 
             $pos = 0;
             foreach ($dashboards as $dashboard) {
-                $menu->add('Dashboard_Dashboard', $dashboard['name'], array('module' => 'Dashboard', 'action' => 'embeddedIndex', 'idDashboard' => $dashboard['iddashboard']), true, $pos);
+                $menu->addItem('Dashboard_Dashboard', $dashboard['name'], $this->urlForAction('embeddedIndex', array('idDashboard' => $dashboard['iddashboard'])), $pos);
                 $pos++;
             }
         }
@@ -44,13 +44,9 @@ class Menu extends \Piwik\Plugin\Menu
 
         $tooltip = Piwik::translate('Dashboard_TopLinkTooltip', Site::getNameFor($idSite));
 
-        $urlParams = array(
-            'module' => 'CoreHome',
-            'action' => 'index',
-            'idSite' => $idSite,
-        );
+        $urlParams = $this->urlForModuleAction('CoreHome', 'index', array('idSite' => $idSite)) ;
 
-        $menu->add('Dashboard_Dashboard', null, $urlParams, true, 1, $tooltip);
+        $menu->addItem('Dashboard_Dashboard', null, $urlParams, 1, $tooltip);
     }
 }
 
diff --git a/plugins/Dashboard/lang/cs.json b/plugins/Dashboard/lang/cs.json
index deac55f05bae22dfd217064cc2b75a32017c1837..bbca664ea2c12d3adeec25d1e3bf8214923e7257 100644
--- a/plugins/Dashboard/lang/cs.json
+++ b/plugins/Dashboard/lang/cs.json
@@ -6,28 +6,28 @@
         "CopyDashboardToUser": "Zkopírovat přehled uživateli",
         "CreateNewDashboard": "Vytvořit novou nástěnku",
         "Dashboard": "Nástěnka",
-        "DashboardCopied": "Přehled byl úspěšně nakopírován vybranému uživateli.",
+        "DashboardCopied": "Přehled byl úspěšně zkopírován vybranému uživateli.",
         "DashboardEmptyNotification": "Vaše nástěnka neobsahuje žádné widgety. Nějaké přidejte, nebo obnovte výchozí výběr widgetů na nástěnce.",
         "DashboardName": "Jméno nástěnky:",
         "DashboardOf": "Nástěnka %s",
         "DefaultDashboard": "Výchozí nástěnka - používáte výchozí rozvržení nástěnky",
-        "DeleteWidgetConfirm": "Jste si jistí, že chcete odstranit tento widget z nástěnky?",
+        "DeleteWidgetConfirm": "Opravdu chcete odstranit tento widget z nástěnky?",
         "EmptyDashboard": "Prázdná nástěnka - vyberte si své oblíbené widgety",
         "LoadingWidget": "Načítám widget, prosím čekejte...",
         "ManageDashboard": "Správa nástěnky",
         "Maximise": "Maximalizovat",
         "Minimise": "Minimalizovat",
-        "NotUndo": "Nemůžete vrátit zpět tuto operaci.",
-        "PluginDescription": "Váše nástěnka analýzy Web stránek. Můžete si jí upravit: přidat nové widgety, změnit jejich pořadí. Každý uživatel přistupuje ke své vlastní nástěncei",
+        "NotUndo": "Tuto operaci nemůžete vrátit zpět.",
+        "PluginDescription": "Vaše nástěnka webové analýzy. Můžete si ji upravit: přidat nové widgety, změnit jejich pořadí. Každý uživatel přistupuje ke své vlastní nástěnce.",
         "RemoveDashboard": "Odstranit nástěnku",
         "RemoveDashboardConfirm": "Opravdu chcete odstranit nástěnku: %s?",
         "RenameDashboard": "Přejmenovat nástěnku",
         "ResetDashboard": "Obnovit nástěnku",
         "ResetDashboardConfirm": "Opravdu chcete obnovit nastavení nástěnky do továrního stavu?",
-        "SelectDashboardLayout": "Prosím vyberte nové rozvržení návštěnky",
+        "SelectDashboardLayout": "Prosím vyberte nové rozvržení nástěnky",
         "SelectWidget": "Zvolte widget pro přidání na nástěnku",
         "SetAsDefaultWidgets": "Nastavit výchozí výběr widgetů",
-        "SetAsDefaultWidgetsConfirm": "Opravdu chcete nastavit toto rozvržení widgetů jako výchozí rozvržení?",
+        "SetAsDefaultWidgetsConfirm": "Opravdu chcete nastavit toto rozvržení widgetů jako výchozí?",
         "SetAsDefaultWidgetsConfirmHelp": "Tyto widgety a jejich rozvržení budou použity vždy, když někdo vytvoří novou nástěnku nebo použije vlastnost %s.",
         "TopLinkTooltip": "Zobraz analytické hlášení webu pro %s.",
         "WidgetNotFound": "Widget nenalezen",
diff --git a/plugins/DevicesDetection/Menu.php b/plugins/DevicesDetection/Menu.php
index e37c62e75f93894645e96242ba374ca4fedbe82d..797f9886249814b39b279cda157105e5f07f309c 100644
--- a/plugins/DevicesDetection/Menu.php
+++ b/plugins/DevicesDetection/Menu.php
@@ -20,13 +20,13 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Piwik::isUserHasSomeAdminAccess()) {
             $menu->addDiagnosticItem('DevicesDetection_DeviceDetection',
-                                     array('module' => 'DevicesDetection', 'action' => 'deviceDetection'),
+                                     $this->urlForAction('deviceDetection'),
                                      $order = 40);
         }
     }
 
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addVisitorsItem('DevicesDetection_submenu', array('module' => 'DevicesDetection', 'action' => 'index'));
+        $menu->addVisitorsItem('DevicesDetection_submenu', $this->urlForAction('index'));
     }
 }
diff --git a/plugins/DevicesDetection/lang/cs.json b/plugins/DevicesDetection/lang/cs.json
index 381ca725d2d5de9e916163bc891400e06ea40b3e..a15d7cac58a001f430356d318b9f8287e25ea858 100644
--- a/plugins/DevicesDetection/lang/cs.json
+++ b/plugins/DevicesDetection/lang/cs.json
@@ -5,7 +5,7 @@
         "CarBrowser": "Prohlížeč v autě",
         "Console": "Konzole",
         "dataTableLabelBrands": "Značka",
-        "dataTableLabelBrowserFamily": "Rodina prohlížeče",
+        "dataTableLabelBrowserFamily": "Rodina prohlížečů",
         "dataTableLabelModels": "Model",
         "dataTableLabelSystemVersion": "Verze operačního systému",
         "dataTableLabelTypes": "Typ",
@@ -18,7 +18,7 @@
         "FeaturePhone": "Ukázkový telefon",
         "OperatingSystemFamilies": "Rodiny operačních systémů",
         "OperatingSystemVersions": "Verze operačního systému",
-        "PluginDescription": "Tento zásuvný modul poskytuje rozšířené informace o mobilních iařízeních, jako např. výrobce, model (verze zařízení), vylepšenou detekci typu zařízení (TV, konzole, Chytré telefony, PC) a další. Tento zásuvný modul přidává nové hlášení v sekci návštěvníci > zařízení.",
+        "PluginDescription": "Tento zásuvný modul poskytuje rozšířené informace o mobilních zařízeních, jako např. výrobce, model (verze zařízení), vylepšenou detekci typu zařízení (TV, konzole, Chytré telefony, PC) a další. Tento zásuvný modul přidává nové hlášení v sekci návštěvníci > zařízení.",
         "SmartDisplay": "Chytrý displej",
         "Smartphone": "Chytrý telefon",
         "submenu": "Zařízení",
diff --git a/plugins/Events/Menu.php b/plugins/Events/Menu.php
index 01c60cabe6490b8b7ee96964a628cc243201e900..440a35978e1f9160686b289cf0f73ea6b3f22964 100644
--- a/plugins/Events/Menu.php
+++ b/plugins/Events/Menu.php
@@ -16,6 +16,6 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addActionsItem('Events_Events', array('module' => 'Events', 'action' => 'index'), 30);
+        $menu->addActionsItem('Events_Events', $this->urlForAction('index'), 30);
     }
 }
diff --git a/plugins/ExamplePlugin/Controller.php b/plugins/ExamplePlugin/Controller.php
index 4a2c3507b934a5d6e189843cf83555d44dc696f9..a496e40ed91b0f2c0a3ed131bd0e124453977b25 100644
--- a/plugins/ExamplePlugin/Controller.php
+++ b/plugins/ExamplePlugin/Controller.php
@@ -11,17 +11,19 @@ namespace Piwik\Plugins\ExamplePlugin;
 use Piwik\View;
 
 /**
- *
+ * A controller let's you for example create a page that can be added to a menu. For more information read our guide
+ * http://developer.piwik.org/guides/mvc-in-piwik or have a look at the our API references for controller and view:
+ * http://developer.piwik.org/api-reference/Piwik/Plugin/Controller and
+ * http://developer.piwik.org/api-reference/Piwik/View
  */
 class Controller extends \Piwik\Plugin\Controller
 {
 
     public function index()
     {
-        $view = new View('@ExamplePlugin/index.twig');
-        $this->setBasicVariablesView($view);
-        $view->answerToLife = '42';
-
-        return $view->render();
+        // Render the Twig template templates/index.twig and assign the view variable answerToLife to the view.
+        return $this->renderTemplate('index', array(
+             'answerToLife' => 42
+        ));
     }
 }
diff --git a/plugins/ExamplePlugin/Menu.php b/plugins/ExamplePlugin/Menu.php
index 2a3ed266f2dcb15e3b71f3e54a1c60607a6c02a6..3fd347aee1cab817173aaab73487ac3f27128916 100644
--- a/plugins/ExamplePlugin/Menu.php
+++ b/plugins/ExamplePlugin/Menu.php
@@ -22,34 +22,37 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        // with custom category 'UI Framework'
-        // $menu->add('UI Framework', '', array('module' => 'ExamplePlugin', 'action' => ''), true, $orderId = 30);
-        // $menu->add('UI Framework', 'Report 1', array('module' => 'ExamplePlugin', 'action' => 'report1'), true, $orderId = 30);
-        // or reusing an existing category
-        // $menu->addVisitorsItem('Report 1', array('module' => 'ExamplePlugin', 'action' => 'report1'), $orderId = 30);
-        // $menu->addActionsItem('Report 1', array('module' => 'ExamplePlugin', 'action' => 'report1'), $orderId = 30);
+        // reuse an existing category. Execute the showList() method within the controller when menu item was clicked
+        // $menu->addVisitorsItem('Report 1', $this->urlForAction('showList'), $orderId = 30);
+        // $menu->addActionsItem('Report 1', $this->urlForAction('showList'), $orderId = 30);
+
+        // or create a custom category 'UI Framework'
+        // $menu->addItem('UI Framework', '', $this->urlForDefaultAction(), $orderId = 30);
+        // $menu->addItem('UI Framework', 'Report 1', $this->urlForAction('showList'), $orderId = 30);
     }
 
     public function configureAdminMenu(MenuAdmin $menu)
     {
-        // with custom category
-        // $menu->add('General_Settings', 'My Admin Item', array('module' => 'ExamplePlugin', 'action' => ''), true, $orderId = 30);
-        // or reusing an existing category
-        // $menu->addSettingsItem('My Admin Item', array('module' => 'ExamplePlugin', 'action' => ''), $orderId = 30);
-        // $menu->addPlatformItem('My Admin Item', array('module' => 'ExamplePlugin', 'action' => ''), $orderId = 30);
+        // reuse an existing category
+        // $menu->addSettingsItem('My Admin Item', $this->urlForDefaultAction(), $orderId = 30);
+        // $menu->addPlatformItem('My Admin Item', $this->urlForDefaultAction(), $orderId = 30);
+
+        // or create a custom category
+        // $menu->addItem('General_Settings', 'My Admin Item', $this->urlForDefaultAction(), $orderId = 30);
     }
 
     public function configureTopMenu(MenuTop $menu)
     {
-        // $menu->add('My Top Item', null, array('module' => 'ExamplePlugin', 'action' => ''), true, $orderId = 30);
+        // $menu->addItem('My Top Item', null, $this->urlForDefaultAction(), $orderId = 30);
     }
 
     public function configureUserMenu(MenuUser $menu)
     {
-        // with custom category
-        // $menu->add('CoreAdminHome_MenuManage', 'My User Item', array('module' => 'ExamplePlugin', 'action' => ''), true, $orderId = 30);
-        // or reusing an existing category
-        // $menu->addManageItem('My User Item', array('module' => 'ExamplePlugin', 'action' => ''), $orderId = 30);
-        // $menu->addPlatformItem('My User Item', array('module' => 'ExamplePlugin', 'action' => ''), $orderId = 30);
+        // reuse an existing category. Execute the showList() method within the controller when menu item was clicked
+        // $menu->addManageItem('My User Item', $this->urlForAction('showList'), $orderId = 30);
+        // $menu->addPlatformItem('My User Item', $this->urlForDefaultAction(), $orderId = 30);
+
+        // or create a custom category
+        // $menu->addItem('CoreAdminHome_MenuManage', 'My User Item', $this->urlForDefaultAction(), $orderId = 30);
     }
 }
diff --git a/plugins/ExamplePlugin/plugin.json b/plugins/ExamplePlugin/plugin.json
index b6328199ce3acb4b815fecdc30052d283c8ed4e3..d3b8257e4d93df14e943058b34679f866b938dd9 100644
--- a/plugins/ExamplePlugin/plugin.json
+++ b/plugins/ExamplePlugin/plugin.json
@@ -3,6 +3,9 @@
  "version": "0.1.0",
  "description": "ExampleDescription",
  "theme": false,
+ "require": {
+    "piwik": ">=PIWIK_VERSION"
+ },
  "authors": [
      {
          "name": "Piwik",
diff --git a/plugins/ExamplePlugin/templates/index.twig b/plugins/ExamplePlugin/templates/index.twig
index d8c940d0fcd2ae8226f851b6c05a143fa08462c6..c322e32785c692b3ec289926b533b44220ca1528 100644
--- a/plugins/ExamplePlugin/templates/index.twig
+++ b/plugins/ExamplePlugin/templates/index.twig
@@ -1,4 +1,8 @@
-<strong>Hello world!</strong>
-<br/>
+{% extends 'dashboard.twig' %}
 
-The answer to life is {{ answerToLife }}
\ No newline at end of file
+{% block content %}
+    <strong>Hello world!</strong>
+    <br/>
+
+    The answer to life is {{ answerToLife }}
+{% endblock %}
\ No newline at end of file
diff --git a/plugins/ExampleUI/Menu.php b/plugins/ExampleUI/Menu.php
index 8b5f1bcfea3cbe59010b73c3a9c6e6c1f69893a7..66a0b7041a2f42fce7fd2b577679e8ec1cb7324b 100644
--- a/plugins/ExampleUI/Menu.php
+++ b/plugins/ExampleUI/Menu.php
@@ -18,7 +18,7 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->add('UI Framework', '', array('module' => 'ExampleUI', 'action' => 'dataTables'), true, 30);
+        $menu->addItem('UI Framework', '', $this->urlForAction('dataTables'), 30);
 
         $this->addSubMenu($menu, 'Data tables', 'dataTables', 1);
         $this->addSubMenu($menu, 'Bar graph', 'barGraph', 2);
@@ -34,12 +34,11 @@ class Menu extends \Piwik\Plugin\Menu
 
     public function configureUserMenu(MenuUser $menu)
     {
-        $urlParams = array('module' => 'ExampleUI', 'action' => 'notifications');
-        $menu->addPlatformItem('UI Notifications', $urlParams, $order = 3);
+        $menu->addPlatformItem('UI Notifications', $this->urlForAction('notifications'), $order = 3);
     }
 
     private function addSubMenu(MenuReporting $menu, $subMenu, $action, $order)
     {
-        $menu->add('UI Framework', $subMenu, array('module' => 'ExampleUI', 'action' => $action), true, $order);
+        $menu->addItem('UI Framework', $subMenu, $this->urlForAction($action), $order);
     }
 }
diff --git a/plugins/Feedback/Menu.php b/plugins/Feedback/Menu.php
index aa1156bc520f0986ede76542ea39d19a485c4082..acfd55dab1c5f0184ee680ef7419b9d9cddcdd12 100644
--- a/plugins/Feedback/Menu.php
+++ b/plugins/Feedback/Menu.php
@@ -15,11 +15,10 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureUserMenu(MenuUser $menu)
     {
-        $menu->add(
+        $menu->addItem(
             'General_Help',
             null,
-            array('module' => 'Feedback', 'action' => 'index', 'segment' => false),
-            true,
+            $this->urlForAction('index', array('segment' => false)),
             $order = 99,
             $tooltip = Piwik::translate('Feedback_TopLinkTooltip')
         );
diff --git a/plugins/Feedback/lang/cs.json b/plugins/Feedback/lang/cs.json
index f1cf4788c10c2da8b1643ae860a3bda7b85b9de4..10e558ad3dc27e15a05c4e8519e90e9cc6056932 100644
--- a/plugins/Feedback/lang/cs.json
+++ b/plugins/Feedback/lang/cs.json
@@ -17,9 +17,9 @@
         "SendFeedback": "Odeslat odezvu",
         "SpecialRequest": "Máte speciální požadavek na tým Piwiku?",
         "ThankYou": "Děkujeme vám, že pomáháte Piwik dělat lepším!",
-        "TopLinkTooltip": "Řekni co si myslíš, nebo pořádek pomoc profesionála.",
+        "TopLinkTooltip": "Řekni co si myslíš, nebo požádej o pomoc profesionála.",
         "ViewAnswersToFAQ": "Zobrazit odpovědi na %sčasto kladené otázky%s",
-        "ViewUserGuides": "eNaučte se jak konfigurovat Piwik a efektivně analyzovat data s našimi %1$suživatelskými příručkami%2$s",
+        "ViewUserGuides": "Naučte se, jak konfigurovat Piwik a efektivně analyzovat data s našimi %1$suživatelskými příručkami%2$s",
         "VisitTheForums": "Navštivte %s forum%s",
         "WantToThankConsiderDonating": "Myslíte si, že je Piwik úžasný a chcete nám poděkovat?"
     }
diff --git a/plugins/Goals/Menu.php b/plugins/Goals/Menu.php
index 62608d8729faed191c5deb41cc48f2ec8acbcb4a..46b394b06783398cf02aa02640d71f1b6f356ecf 100644
--- a/plugins/Goals/Menu.php
+++ b/plugins/Goals/Menu.php
@@ -29,41 +29,40 @@ class Menu extends \Piwik\Plugin\Menu
         $site = new Site($idSite);
 
         if (count($goals) == 0) {
+            $action = $site->isEcommerceEnabled() ? 'ecommerceReport' : 'addNewGoal';
+            $url    = $this->urlForAction($action, array(
+                'idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null
+            )));
 
-            $menu->add($mainGoalMenu, '', array('module' => 'Goals',
-                    'action' => ($site->isEcommerceEnabled() ? 'ecommerceReport' : 'addNewGoal'),
-                    'idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null)),
-                true,
-                25);
+            $menu->addItem($mainGoalMenu, '', $url, 25);
 
             if ($site->isEcommerceEnabled()) {
-                $menu->add($mainGoalMenu, 'Goals_Ecommerce', array('module' => 'Goals', 'action' => 'ecommerceReport', 'idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER), true, 1);
+                $menu->addItem($mainGoalMenu, 'Goals_Ecommerce', $this->urlForAction('ecommerceReport', array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER)), 1);
             }
 
-            $menu->add($mainGoalMenu, 'Goals_AddNewGoal', array('module' => 'Goals', 'action' => 'addNewGoal'));
+            $menu->addItem($mainGoalMenu, 'Goals_AddNewGoal', $this->urlForAction('addNewGoal'));
 
         } else {
 
-            $menu->add($mainGoalMenu, '', array('module' => 'Goals',
-                    'action' => ($site->isEcommerceEnabled() ? 'ecommerceReport' : 'index'),
-                    'idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null)),
-                true,
-                25);
+            $action = $site->isEcommerceEnabled() ? 'ecommerceReport' : 'index';
+            $url    = $this->urlForAction($action, array('idGoal' => ($site->isEcommerceEnabled() ? Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER : null)));
+
+            $menu->addItem($mainGoalMenu, '', $url, 25);
 
             if ($site->isEcommerceEnabled()) {
-                $menu->add($mainGoalMenu, 'Goals_Ecommerce', array('module' => 'Goals', 'action' => 'ecommerceReport', 'idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER), true, 1);
+                $menu->addItem($mainGoalMenu, 'Goals_Ecommerce', $this->urlForAction('ecommerceReport', array('idGoal' => Piwik::LABEL_ID_GOAL_IS_ECOMMERCE_ORDER)), 1);
             }
 
-            $menu->add($mainGoalMenu, 'Goals_GoalsOverview', array('module' => 'Goals', 'action' => 'index'), true, 2);
+            $menu->addItem($mainGoalMenu, 'Goals_GoalsOverview', array('module' => 'Goals', 'action' => 'index'), 2);
 
             $group = new Group();
             foreach ($goals as $goal) {
                 $subMenuName = str_replace('%', '%%', Translate::clean($goal['name']));
-                $params      = array('module' => 'Goals', 'action' => 'goalReport', 'idGoal' => $goal['idgoal']);
+                $params      = $this->urlForAction('goalReport', array('idGoal' => $goal['idgoal']));
                 $tooltip     = sprintf('%s (id = %d)', $subMenuName, $goal['idgoal']);
 
                 if (count($goals) <= 3) {
-                    $menu->add($mainGoalMenu, $subMenuName, $params, true, 50, $tooltip);
+                    $menu->addItem($mainGoalMenu, $subMenuName, $params, 50, $tooltip);
                 } else {
                     $group->add($subMenuName, $params, $tooltip);
                 }
diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php
index b23e697dffb8f9941b87e7cddea8499a7e6ef420..d9aeeabe677d7925db7cdb155953296d949c3342 100644
--- a/plugins/ImageGraph/StaticGraph.php
+++ b/plugins/ImageGraph/StaticGraph.php
@@ -14,7 +14,7 @@ use pData;
 use pImage;
 use Piwik\Piwik;
 use Piwik\SettingsPiwik;
-use Piwik\Factory;
+use Piwik\BaseFactory;
 
 require_once PIWIK_INCLUDE_PATH . "/libs/pChart2.1.3/class/pDraw.class.php";
 require_once PIWIK_INCLUDE_PATH . "/libs/pChart2.1.3/class/pImage.class.php";
@@ -24,7 +24,7 @@ require_once PIWIK_INCLUDE_PATH . "/libs/pChart2.1.3/class/pData.class.php";
  * The StaticGraph abstract class is used as a base class for different types of static graphs.
  *
  */
-abstract class StaticGraph extends Factory
+abstract class StaticGraph extends BaseFactory
 {
     const GRAPH_TYPE_BASIC_LINE = "evolution";
     const GRAPH_TYPE_VERTICAL_BAR = "verticalBar";
diff --git a/plugins/Installation/Menu.php b/plugins/Installation/Menu.php
index 7ae25c8d79fe4888089a4a549b41fa69b4212ce1..fd57fab75cc088d7db59ca3cea3eaf3a27e14e8a 100644
--- a/plugins/Installation/Menu.php
+++ b/plugins/Installation/Menu.php
@@ -17,7 +17,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Piwik::hasUserSuperUserAccess()) {
             $menu->addSettingsItem('Installation_SystemCheck',
-                                   array('module' => 'Installation', 'action' => 'systemCheckPage'),
+                                   $this->urlForAction('systemCheckPage'),
                                    $order = 15);
         }
     }
diff --git a/plugins/LanguagesManager/Menu.php b/plugins/LanguagesManager/Menu.php
index 1b53892a941a67e013256aaf30ea36f39831ca08..a51250d944852fc8c86e7303857e2ca0ba390137 100644
--- a/plugins/LanguagesManager/Menu.php
+++ b/plugins/LanguagesManager/Menu.php
@@ -28,7 +28,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) {
             $menu->addDevelopmentItem('LanguagesManager_TranslationSearch',
-                                      array('module' => 'LanguagesManager', 'action' => 'searchTranslation'));
+                                      $this->urlForAction('searchTranslation'));
         }
     }
 }
diff --git a/plugins/Live/lang/cs.json b/plugins/Live/lang/cs.json
index 539045b8f7f51ac26af7b2720f2632ee797ade12..90799cd357cee3ec43c67fa4384b8336896b6297 100644
--- a/plugins/Live/lang/cs.json
+++ b/plugins/Live/lang/cs.json
@@ -32,7 +32,7 @@
         "VisitorLog": "Pohled na návštěvníky",
         "VisitorLogDocumentation": "Tato tabulka zobrazuje poslední návštěvy v daném období. Najetím na datum návštěvy zobrazíte čas, kdy tento návštěvník navštívil stránky naposledy. %s Pokud období zahrnuje dnešek, můžete vidět návštěvníky v reálném čase! %s Zde zobrazovaná data jsou vždy živá bez ohledu na to, jak a kdy probíhá archivační cron úloha.",
         "VisitorProfile": "Profil návštěvníka",
-        "VisitorsInRealTime": "Návstěv v reálném čase",
+        "VisitorsInRealTime": "Návštěvníci v reálném čase",
         "VisitorsLastVisit": "K poslední návštěvě tohoto návštěvníka došlo před %s dny.",
         "VisitsFrom": "%1$s%2$s návštěv%3$s z",
         "VisitSummary": "Strávil celkem %1$s%2$s na stránkách%3$s a %4$szobrazil %5$s stránek za %6$s návštěv.%7$s"
diff --git a/plugins/MobileMessaging/Menu.php b/plugins/MobileMessaging/Menu.php
index 4dea3c329d46ec38fc107a2a054817740cfffc3f..e810e997449663a654d421138f678296d302d445 100644
--- a/plugins/MobileMessaging/Menu.php
+++ b/plugins/MobileMessaging/Menu.php
@@ -14,10 +14,6 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureAdminMenu(MenuAdmin $menu)
     {
-        $menu->addSettingsItem(
-            'MobileMessaging_SettingsMenu',
-            array('module' => 'MobileMessaging', 'action' => 'index'),
-            $order = 12
-        );
+        $menu->addSettingsItem('MobileMessaging_SettingsMenu', $this->urlForAction('index'), $order = 12);
     }
 }
diff --git a/plugins/MobileMessaging/SMSProvider.php b/plugins/MobileMessaging/SMSProvider.php
index 0019a1ad582084e0a86cd52b2ff669bbfc251b52..c9212971e271fffc87f4cacc6802d4e18cb52432 100644
--- a/plugins/MobileMessaging/SMSProvider.php
+++ b/plugins/MobileMessaging/SMSProvider.php
@@ -10,13 +10,13 @@ namespace Piwik\Plugins\MobileMessaging;
 
 use Exception;
 use Piwik\Piwik;
-use Piwik\Factory;
+use Piwik\BaseFactory;
 
 /**
  * The SMSProvider abstract class is used as a base class for SMS provider implementations.
  *
  */
-abstract class SMSProvider extends Factory
+abstract class SMSProvider extends BaseFactory
 {
     const MAX_GSM_CHARS_IN_ONE_UNIQUE_SMS = 160;
     const MAX_GSM_CHARS_IN_ONE_CONCATENATED_SMS = 153;
diff --git a/plugins/MultiSites/Menu.php b/plugins/MultiSites/Menu.php
index 0cbee0d89b337de0fb72971f285e08b4f0508e86..5059cfc09dc2094a71a0bc4ce7d2763506ae5d8c 100644
--- a/plugins/MultiSites/Menu.php
+++ b/plugins/MultiSites/Menu.php
@@ -15,7 +15,7 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureTopMenu(MenuTop $menu)
     {
-        $urlParams = array('module' => 'MultiSites', 'action' => 'index', 'segment' => false);
+        $urlParams = $this->urlForAction('index', array('segment' => false));
         $tooltip   = Piwik::translate('MultiSites_TopLinkTooltip');
 
         $menu->add('General_MultiSitesSummary', null, $urlParams, true, 3, $tooltip);
diff --git a/plugins/PrivacyManager/Menu.php b/plugins/PrivacyManager/Menu.php
index 5eee77622c53b5b5f60b9d50ca8614450694336e..33c7aa55a2c29a472600d1b2a9f08e6770d2dc03 100644
--- a/plugins/PrivacyManager/Menu.php
+++ b/plugins/PrivacyManager/Menu.php
@@ -17,7 +17,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Piwik::isUserHasSomeAdminAccess()) {
             $menu->addSettingsItem('PrivacyManager_MenuPrivacySettings',
-                                   array('module' => 'PrivacyManager', 'action' => 'privacySettings'),
+                                   $this->urlForAction('privacySettings'),
                                    $order = 7);
         }
     }
diff --git a/plugins/PrivacyManager/lang/cs.json b/plugins/PrivacyManager/lang/cs.json
index 12f2d404b441e5354031db78bebc8afbc181c286..f5a1a6dd3cb1cfe037e7b5816ceadc02bce6c4d7 100644
--- a/plugins/PrivacyManager/lang/cs.json
+++ b/plugins/PrivacyManager/lang/cs.json
@@ -4,16 +4,16 @@
         "AnonymizeIpInlineHelp": "Skryje poslední byte IP adresy návštěvníka, aby souhlasila se zákony vaší země.",
         "AnonymizeIpMaskLengtDescription": "Zvolte, kolik bitů z návštěvníkovy IP adresy má být maskováno.",
         "AnonymizeIpMaskLength": "%s bitů - např. %s",
-        "CannotLockSoDeleteLogActions": "Tabulka log_action nebude vyprázdněn: adejte Mysql uživateli %s privilegium LOCK TABLES.",
+        "CannotLockSoDeleteLogActions": "Tabulka log_action nebude vyprázdněna: dejte Mysql uživateli %s privilegium LOCK TABLES.",
         "ClickHereSettings": "Pro přístup k nastavení %s klikněte zde.",
         "CurrentDBSize": "Aktuální velikost databáze",
         "DBPurged": "Databáze vyprázdněna.",
         "DeleteBothConfirm": "Chystáte se povolit mazání dat logů i mazání dat hlášení. Tato operace trvale odstraní stará data. Opravdu to chcete provést?",
-        "DeleteDataDescription": "Můžete Piwik nastavit tak, aby po určitém čase mazal data rá stalogů nebo zpracovaná data hlášení. To pomáhá udržet malou databázi.",
-        "DeleteDataDescription2": "Pokud si to přejete, zpracovaných hlášení mohou zůstat a budou odstraněnajen data logů (zobrazení stránek, návštěvy a konverze) budou smazána. Nebo mohou být smazána hlášení a data logů mohou být zachována.",
+        "DeleteDataDescription": "Můžete Piwik nastavit tak, aby po určitém čase mazal stará data logů nebo zpracovaná data hlášení. To pomáhá udržet malou databázi.",
+        "DeleteDataDescription2": "Pokud si to přejete, zpracovaná hlášení mohou zůstat a budou odstraněna jen data logů (zobrazení stránek (návštěvy a konverze). Nebo mohou být smazána hlášení a data logů mohou být zachována.",
         "DeleteDataInterval": "Smazat stará data každých",
         "DeleteDataSettings": "Smazat staré logy návštěvníků a hlášení",
-        "DeleteLogDescription2": "Pokud povolíte automatické mazání logů, musíte zajistit, že jsou zpracovány všechna denní hlášení, aby nedošlo ke ztrátě dat.",
+        "DeleteLogDescription2": "Pokud povolíte automatické mazání logů, musíte zajistit, že jsou zpracována všechna denní hlášení, aby nedošlo ke ztrátě dat.",
         "DeleteLogInfo": "Logy z následujících tabulek budou smazány: %s",
         "DeleteLogsConfirm": "Chystáte se povolit mazání dat logů. Pokud budou odstraněna stará data logů a nebyla vytvořena historická hlášení, nebudete schopen zobrazit stará analytická data. Oprav",
         "DeleteLogsOlderThan": "Vymazat logy starší než",
@@ -28,7 +28,7 @@
         "DeleteSchedulingSettings": "Nastavení plánování",
         "DoNotTrack_Description": "Do not track je návrh technologie a politiky, která umožňuje uživatelům indikovat, že si nepřejí být stránkami, které navštěvují a to včetně služeb webové analýzi, reklamních služeb a sociálních platforem.",
         "DoNotTrack_Disable": "Zakázat podporu Do not track",
-        "DoNotTrack_Disabled": "Pivik sleduje všechny návštěvníky včetně těch, kteří v možnostech svého webového prohlížeče nastavili, že si nepřejí být sledováni.",
+        "DoNotTrack_Disabled": "Piwik sleduje všechny návštěvníky včetně těch, kteří v možnostech svého webového prohlížeče nastavili, že si nepřejí být sledováni.",
         "DoNotTrack_DisabledMoreInfo": "Doporučujeme respektovat soukromí vašich návštěvníků a podporu Do not track povolit.",
         "DoNotTrack_Enable": "Povolit podporu Do not track",
         "DoNotTrack_Enabled": "Aktuálně respektujete soukromí vašich návštěvníků, víborně!",
@@ -38,7 +38,7 @@
         "EstimatedSpaceSaved": "Odhadované ušetřené místo",
         "GeolocationAnonymizeIpNote": "Poznámka: Geolokace bude mít přibližně stejnou přesnost, když je anonymizován 1 bit. Pokud jsou anonymizovány 2 bity a více, geolokace bude nepřesná.",
         "GetPurgeEstimate": "Získat odhad po vyprázdnění",
-        "KeepBasicMetrics": "Uchovat základní měření (návštěvy, zobrazení stránek, odchody, cíle, atd.)",
+        "KeepBasicMetrics": "Uchovat základní metriky (návštěvy, zobrazení stránek, odchody, cíle, atd.)",
         "KeepDataFor": "Uchovávat všechna data po",
         "KeepReportSegments": "Pro výše uchovávaná data také zachovat segmentovaná hlášení",
         "LastDelete": "Poslední mazání bylo v",
diff --git a/plugins/Referrers/Menu.php b/plugins/Referrers/Menu.php
index 60768d7c2f8c8901de100cf8e80c8ae65ecd401e..835ae15f785b17ed0ea3354fa1472f2672c8a72b 100644
--- a/plugins/Referrers/Menu.php
+++ b/plugins/Referrers/Menu.php
@@ -14,9 +14,9 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addReferrersItem('', array('module' => 'Referrers', 'action' => 'index'), 20);
-        $menu->addReferrersItem('General_Overview', array('module' => 'Referrers', 'action' => 'index'), 1);
-        $menu->addReferrersItem('Referrers_SubmenuSearchEngines', array('module' => 'Referrers', 'action' => 'getSearchEnginesAndKeywords'), 2);
-        $menu->addReferrersItem('Referrers_SubmenuWebsites', array('module' => 'Referrers', 'action' => 'indexWebsites'), 3);
+        $menu->addReferrersItem('', $this->urlForAction('index'), 20);
+        $menu->addReferrersItem('General_Overview', $this->urlForAction('index'), 1);
+        $menu->addReferrersItem('Referrers_SubmenuSearchEngines', $this->urlForAction('getSearchEnginesAndKeywords'), 2);
+        $menu->addReferrersItem('Referrers_SubmenuWebsites', $this->urlForAction('indexWebsites'), 3);
     }
 }
diff --git a/plugins/ScheduledReports/Menu.php b/plugins/ScheduledReports/Menu.php
index 26aafad2ad121845adf898676474a1fd0ebd524d..6c0111ff235101b6a0d460b61a6ad6ca40cd3474 100644
--- a/plugins/ScheduledReports/Menu.php
+++ b/plugins/ScheduledReports/Menu.php
@@ -24,10 +24,10 @@ class Menu extends \Piwik\Plugin\Menu
             \Piwik\Plugin\Manager::getInstance()->isPluginActivated('MobileMessaging')
                 ? 'MobileMessaging_TopLinkTooltip' : 'ScheduledReports_TopLinkTooltip');
 
-        $menu->addManageItem(null, array('module' => '', 'action' => '', 'segment' => false), 10);
+        $menu->addManageItem(null, $this->urlForDefaultAction(array('segment' => false)), 10);
         $menu->addManageItem(
             $this->getTopMenuTranslationKey(),
-            array('module' => 'ScheduledReports', 'action' => 'index', 'segment' => false),
+            $this->urlForAction('index', array('segment' => false)),
             13,
             $tooltip
         );
diff --git a/plugins/SitesManager/Menu.php b/plugins/SitesManager/Menu.php
index 017690f442727b1e49e6c29a68742b350dabd796..3f4d1b02adf3f97a871bc04c6b773f3cdc1fc151 100644
--- a/plugins/SitesManager/Menu.php
+++ b/plugins/SitesManager/Menu.php
@@ -17,7 +17,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (Piwik::isUserHasSomeAdminAccess()) {
             $menu->addManageItem('SitesManager_Sites',
-                                 array('module' => 'SitesManager', 'action' => 'index'),
+                                 $this->urlForAction('index'),
                                  $order = 1);
         }
     }
diff --git a/plugins/UserCountry/Menu.php b/plugins/UserCountry/Menu.php
index 41e259a618b1ec1aa38a5425e2ef0671f5b46c22..9305ab23fabb4a946e1c78a18365d64ada5ba81f 100644
--- a/plugins/UserCountry/Menu.php
+++ b/plugins/UserCountry/Menu.php
@@ -18,13 +18,13 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (UserCountry::isGeoLocationAdminEnabled() && Piwik::hasUserSuperUserAccess()) {
             $menu->addSettingsItem('UserCountry_Geolocation',
-                                   array('module' => 'UserCountry', 'action' => 'adminIndex'),
+                                   $this->urlForAction('adminIndex'),
                                    $order = 8);
         }
     }
 
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addVisitorsItem('UserCountry_SubmenuLocations', array('module' => 'UserCountry', 'action' => 'index'));
+        $menu->addVisitorsItem('UserCountry_SubmenuLocations', $this->urlForAction('index'));
     }
 }
diff --git a/plugins/UserCountry/lang/cs.json b/plugins/UserCountry/lang/cs.json
index db4bd145a55cb59e3e93cdab1b43e071f494745d..37cc8685b74af1b0316ea6b39161f92ae74d79cc 100644
--- a/plugins/UserCountry/lang/cs.json
+++ b/plugins/UserCountry/lang/cs.json
@@ -12,7 +12,7 @@
         "CityAndCountry": "%1$s, %2$s",
         "Continent": "Kontinent",
         "continent_afr": "Afrika",
-        "continent_amc": "Středná Amerika",
+        "continent_amc": "Střední Amerika",
         "continent_amn": "Jižní Amerika",
         "continent_ams": "Severní a střední Amerika",
         "continent_ant": "Antarktida",
@@ -21,7 +21,7 @@
         "continent_oce": "Oceanie",
         "Country": "Státy",
         "country_a1": "Anonymní proxy",
-        "country_a2": "Staelitní poskytovatel",
+        "country_a2": "Satelitní poskytovatel",
         "country_ac": "Ascension Islands",
         "country_ad": "Andorra",
         "country_ae": "United Arab Emirates",
diff --git a/plugins/UserCountryMap/Menu.php b/plugins/UserCountryMap/Menu.php
index fa32a8f9b7940ee968e19da319e75dd9e08f6632..88108e3f4d37bb61155895e787c5baab9a4aa0da 100644
--- a/plugins/UserCountryMap/Menu.php
+++ b/plugins/UserCountryMap/Menu.php
@@ -17,7 +17,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if (PluginManager::getInstance()->isPluginActivated('UserCountry')) {
             $menu->addVisitorsItem('UserCountryMap_RealTimeMap',
-                                   array('module' => 'UserCountryMap', 'action' => 'realtimeWorldMap'),
+                                   $this->urlForAction('realtimeWorldMap'),
                                    $order = 70);
         }
     }
diff --git a/plugins/UserSettings/Menu.php b/plugins/UserSettings/Menu.php
index 5b442e5e09a5b11911d4ae30f8e776d478d3950c..c194ea20fba1dd2ea3fab0b829400942895bbd89 100644
--- a/plugins/UserSettings/Menu.php
+++ b/plugins/UserSettings/Menu.php
@@ -14,6 +14,6 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addVisitorsItem('General_Settings', array('module' => 'UserSettings', 'action' => 'index'));
+        $menu->addVisitorsItem('General_Settings', $this->urlForAction('index'));
     }
 }
diff --git a/plugins/UsersManager/Menu.php b/plugins/UsersManager/Menu.php
index 494d09542c2ef21a518af4bee6f04abfc4c52843..8335d97305c1fcd09fa189a1e821450db2b16a80 100644
--- a/plugins/UsersManager/Menu.php
+++ b/plugins/UsersManager/Menu.php
@@ -16,12 +16,8 @@ class Menu extends \Piwik\Plugin\Menu
     public function configureAdminMenu(MenuAdmin $menu)
     {
         if (Piwik::isUserHasSomeAdminAccess()) {
-            $menu->addManageItem('UsersManager_MenuUsers',
-                                 array('module' => 'UsersManager', 'action' => 'index'),
-                                 $order = 2);
-            $menu->addManageItem('UsersManager_MenuUserSettings',
-                                 array('module' => 'UsersManager', 'action' => 'userSettings'),
-                                 $order = 3);
+            $menu->addManageItem('UsersManager_MenuUsers', $this->urlForAction('index'), $order = 2);
+            $menu->addManageItem('UsersManager_MenuUserSettings', $this->urlForAction('userSettings'), $order = 3);
         }
     }
 }
diff --git a/plugins/VisitFrequency/Menu.php b/plugins/VisitFrequency/Menu.php
index 8759cf751d8202cc485e445e1d24fb94ef915e90..e858bd2f765959b22f28da543a1110b9d8826eb1 100644
--- a/plugins/VisitFrequency/Menu.php
+++ b/plugins/VisitFrequency/Menu.php
@@ -14,7 +14,6 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addVisitorsItem('VisitFrequency_SubmenuFrequency',
-                   array('module' => 'VisitFrequency', 'action' => 'index'), $order = 55);
+        $menu->addVisitorsItem('VisitFrequency_SubmenuFrequency', $this->urlForAction('index'), $order = 55);
     }
 }
diff --git a/plugins/VisitTime/Menu.php b/plugins/VisitTime/Menu.php
index db221a4eda3025014b37250964eb8255460d132c..ffa3a5b015d1290584913765cc670ce4ad4ebae9 100644
--- a/plugins/VisitTime/Menu.php
+++ b/plugins/VisitTime/Menu.php
@@ -14,7 +14,6 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureReportingMenu(MenuReporting $menu)
     {
-        $menu->addVisitorsItem('VisitTime_SubmenuTimes',
-                   array('module' => 'VisitTime', 'action' => 'index'), $order = 65);
+        $menu->addVisitorsItem('VisitTime_SubmenuTimes', $this->urlForAction('index'), $order = 65);
     }
 }
diff --git a/plugins/VisitsSummary/lang/cs.json b/plugins/VisitsSummary/lang/cs.json
index d4cd9aa258f2cc3727cb5de52be7c977e55c8bdc..6c191f1c2b7eda976f527448cf7c1fda580a0ca8 100644
--- a/plugins/VisitsSummary/lang/cs.json
+++ b/plugins/VisitsSummary/lang/cs.json
@@ -12,7 +12,7 @@
         "NbOutlinksDescription": "%s externích odkazů",
         "NbPageviewsDescription": "%s zobrazení",
         "NbSearchesDescription": "Celkem %s vyhledávání na vašich stránkách",
-        "NbUniqueDownloadsDescription": "%s unikátních stražení",
+        "NbUniqueDownloadsDescription": "%s unikátních stažení",
         "NbUniqueOutlinksDescription": "%s unikátních externích odkazů",
         "NbUniquePageviewsDescription": "%s unikátních zobrazení",
         "NbUniqueVisitors": "%s unikátních návštěvníků",
diff --git a/plugins/Widgetize/Menu.php b/plugins/Widgetize/Menu.php
index 954df309e5fa571ca71928c9f2047e07ba54b429..f796faf57e1bc1b8d264b573849b64b346ef2225 100644
--- a/plugins/Widgetize/Menu.php
+++ b/plugins/Widgetize/Menu.php
@@ -16,7 +16,7 @@ class Menu extends \Piwik\Plugin\Menu
     public function configureUserMenu(MenuUser $menu)
     {
         $tooltip   = Piwik::translate('Widgetize_TopLinkTooltip');
-        $urlParams = array('module' => 'Widgetize', 'action' => 'index', 'segment' => false);
+        $urlParams = $this->urlForAction('index', array('segment' => false));
 
         $menu->addPlatformItem(null, $urlParams, 50, $tooltip);
         $menu->addPlatformItem('General_Widgets', $urlParams, 5, $tooltip);
diff --git a/tests/PHPUnit/Core/DeprecatedMethodsTest.php b/tests/PHPUnit/Core/DeprecatedMethodsTest.php
index ce496684ba0c40f0fb6a31953fc1d9fd2557153a..47bbddb2d26e63383f28e7e026be79978b122b91 100644
--- a/tests/PHPUnit/Core/DeprecatedMethodsTest.php
+++ b/tests/PHPUnit/Core/DeprecatedMethodsTest.php
@@ -29,6 +29,8 @@ class DeprecatedMethodsTest extends PHPUnit_Framework_TestCase
 
         $validTill = '2014-10-15';
         $this->assertDeprecatedMethodIsRemoved('\Piwik\SettingsPiwik', 'rewriteTmpPathWithHostname', $validTill);
+
+        $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Menu\MenuAbstract', 'add');
     }
 
     private function assertDeprecatedMethodIsRemoved($className, $method, $removalDate)
@@ -49,4 +51,22 @@ class DeprecatedMethodsTest extends PHPUnit_Framework_TestCase
         $errorMessage = $className . '::' . $method . ' should be removed as the method is deprecated but it is not.';
         $this->assertFalse($methodExists, $errorMessage);
     }
+
+    private function assertDeprecatedMethodIsRemovedInPiwik3($className, $method)
+    {
+        $version = \Piwik\Version::VERSION;
+
+        $class        = new ReflectionClass($className);
+        $methodExists = $class->hasMethod($method);
+
+        if (-1 === version_compare($version, '3.0.0')) {
+
+            $errorMessage = $className . '::' . $method . ' should still exists until 3.0 although it is deprecated.';
+            $this->assertTrue($methodExists, $errorMessage);
+            return;
+        }
+
+        $errorMessage = $className . '::' . $method . ' should be removed as the method is deprecated but it is not.';
+        $this->assertFalse($methodExists, $errorMessage);
+    }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/Core/FactoryTest.php b/tests/PHPUnit/Core/FactoryTest.php
index dfa6cbdb7a6c083abce3611b3b2a2e75910c7525..d85efcc2cecfbb24569a4c284e4726b187396e9c 100644
--- a/tests/PHPUnit/Core/FactoryTest.php
+++ b/tests/PHPUnit/Core/FactoryTest.php
@@ -6,7 +6,7 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  */
 
-use Piwik\Factory;
+use Piwik\BaseFactory;
 
 /**
  * @group Core
@@ -16,7 +16,7 @@ class FactoryTest extends PHPUnit_Framework_TestCase
 {
     public function testCreatingExistingClassSucceeds()
     {
-        $instance = Factory::factory("Piwik\\Timer");
+        $instance = BaseFactory::factory("Piwik\\Timer");
 
         $this->assertNotNull($instance);
         $this->assertInstanceOf("Piwik\\Timer", $instance);
@@ -28,6 +28,6 @@ class FactoryTest extends PHPUnit_Framework_TestCase
      */
     public function testCreatingInvalidClassThrows()
     {
-        Factory::factory("This\\Class\\Does\\Not\\Exist");
+        BaseFactory::factory("This\\Class\\Does\\Not\\Exist");
     }
 }
\ No newline at end of file
diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI
index 319cf3e20c8f280fb2a4662eaf64bc90ad44f5ec..b719a0aa77b2223a4a54ecc46ba693a38d85f59a 160000
--- a/tests/PHPUnit/UI
+++ b/tests/PHPUnit/UI
@@ -1 +1 @@
-Subproject commit 319cf3e20c8f280fb2a4662eaf64bc90ad44f5ec
+Subproject commit b719a0aa77b2223a4a54ecc46ba693a38d85f59a