diff --git a/.gitmodules b/.gitmodules
index d209a1bd03b61f7d9bb43603816e74ea1c5b5c8a..6f50e7405e51ff1d7cdc44a0b1b3fdcf7f826365 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -37,7 +37,13 @@
 	path = plugins/LogViewer
 	url = https://github.com/piwik/plugin-LogViewer.git
     branch = master
+[submodule "plugins/AnonymousPiwikUsageMeasurement"]
+	path = plugins/AnonymousPiwikUsageMeasurement
+	url = https://github.com/piwik/plugin-AnonymousPiwikUsageMeasurement.git
 
+
+# Add new Plugin submodule above this line ^
+# 
 # Note: when you add a submodule that SHOULD be left in the packaged release such as the few submodules below,
 #       then you MUST add these submodules names in the SUBMODULES_PACKAGED_WITH_CORE variable in:
 #       https://github.com/piwik/piwik-package/blob/master/scripts/build-package.sh
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 30dae0e20ff521b2978b29c37b16dde47390bc03..1360b440f43375150632fbb72020498857b824e1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,13 +39,19 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'
 * Support for IE8 was dropped. This affects only the Piwik UI, not the Piwik.js Tracker.
 * Required PHP version was changed from 5.3 to 5.4
 
-## Piwik 2.15.0
+## Piwik 2.15.0 
+
+### New commands
+ *  New diagnostic command `diagnostics:analyze-archive-table` that analyzes archive tables
+ *  New command `database:optimize-archive-tables` to optimize archive tables and possibly save disk space (even if on InnoDB)
+ *  New Command `core:invalidate-report-data` to invalidate archive data (w/ period cascading) ([FAQ](https://piwik.org/faq/how-to/faq_155/))
 
 ### Breaking Changes
 * The method `Dimension::getId()` has been set as `final`. It is not allowed to overwrite this method.
 * We fixed a bug where the API method `Sites.getPatternMatchSites` only returned a very limited number of websites by default. We now return all websites by default unless a limit is specified specifically.
 * Handling of localized date, time and range formats has been changed. Patterns no longer contain placeholders like %shortDay%, but work with CLDR pattern instead. You can use one of the predefined format constants in Date class for using getLocalized().
 * As we are now using CLDR formats for all languages, some time formats were even changed in english. Attributes like prettyDate in API responses might so have been changed slightly.
+* The config `enable_measure_piwik_usage_in_idsite` which is used to track the Piwik usage with Piwik was removed and replaced by a new plugin `AnonymousPiwikUsageMeasurement`
 
 ### Deprecations
 * The HTTP API method `SitesManager.getSitesIdWithVisits` has been deprecated and will be removed in Piwik 3.0
@@ -61,17 +67,14 @@ This is a changelog for Piwik platform developers. All changes for our HTTP API'
  * `Tracker.recordStandardGoals`
 
 ### Internal change
+* `piwik.js` can now be configured with "Content Security Policy" ([CSP FAQ](https://piwik.org/faq/general/faq_20904/))
 * In `piwik.js` we replaced [JSON2](https://github.com/douglascrockford/JSON-js) with [JSON3](https://bestiejs.github.io/json3/) to implement CSP (Content Security Policy) as JSON3 does not use `eval()`. JSON3 will be used if a browser does not provide a native JSON API. We are using `JSON3` in a way that it will not conflict if your website is using `JSON3` as well.
-
+* The option `branch` of the console command `development:sync-system-test-processed` was removed as it is no longer needed.
 
 ### New APIs
 * The JavaScript Tracker `piwik.js` got a new method `logAllContentBlocksOnPage` to log all found content blocks within a page to the console. This is useful to debug / test content tracking. It can be triggered via `_paq.push(['logAllContentBlocksOnPage'])`
 * The Class `Piwik\Plugins\Login\Controller` is now considered a public API.
-
-### Internal Change
-* The option `branch` of the console command `development:sync-system-test-processed` was removed as it is no longer needed.
-
-### APIs
+* The new method `Piwik\Menu\MenuAbstract::registerMenuIcon()` can be used to define an icon for a menu category to replace the default arrow icon.
 * New event `CronArchive.getIdSitesNotUsingTracker` that allows you to set a list of idSites that do not use the Tracker API to make sure we archive these sites if needed.
 * New events `CronArchive.init.start` which is triggered when the CLI archiver starts and `CronArchive.end` when the archiver ended.
 
diff --git a/composer.lock b/composer.lock
index a86ee1f2f8e78427203de4f7a267133b7702a18c..acb0776a049f0a4dac1c54fb05a45e139ec6b094 100644
--- a/composer.lock
+++ b/composer.lock
@@ -937,16 +937,16 @@
         },
         {
             "name": "piwik/referrer-spam-blacklist",
-            "version": "1.0.5",
+            "version": "1.0.6",
             "source": {
                 "type": "git",
                 "url": "https://github.com/piwik/referrer-spam-blacklist.git",
-                "reference": "ee310007ebfe07ac7f502d85948edc56c49563c3"
+                "reference": "5414a855511c7bc761347a3091276c30ba30311d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/ee310007ebfe07ac7f502d85948edc56c49563c3",
-                "reference": "ee310007ebfe07ac7f502d85948edc56c49563c3",
+                "url": "https://api.github.com/repos/piwik/referrer-spam-blacklist/zipball/5414a855511c7bc761347a3091276c30ba30311d",
+                "reference": "5414a855511c7bc761347a3091276c30ba30311d",
                 "shasum": ""
             },
             "type": "library",
@@ -955,7 +955,7 @@
                 "Public Domain"
             ],
             "description": "Community-contributed list of referrer spammers",
-            "time": "2015-07-06 09:15:56"
+            "time": "2015-10-07 10:17:59"
         },
         {
             "name": "psr/log",
diff --git a/config/global.ini.php b/config/global.ini.php
index 2b86a1c131325c149abd8bc7b275eee43ae785d1..7dd55d37190af4c857f4ac68efaac28f1c2d0da2 100644
--- a/config/global.ini.php
+++ b/config/global.ini.php
@@ -107,11 +107,6 @@ always_archive_data_range = 0;
 ; NOTE: you must also set [log] log_writers[] = "screen" to enable the profiler to print on screen
 enable_sql_profiler = 0
 
-; if set to > 0, a Piwik tracking code will be included in the Piwik UI footer and will track visits, pages, etc.
-; data will be stored for idSite = enable_measure_piwik_usage_in_idsite
-; this is useful for Piwik developers as an easy way to create data in their local Piwik
-enable_measure_piwik_usage_in_idsite = 0
-
 ; If set to 1, all requests to piwik.php will be forced to be 'new visitors'
 tracker_always_new_visitor = 0
 
@@ -132,6 +127,7 @@ enabled = 0
 
 ; if set to 1, javascript files will be included individually and neither merged nor minified.
 ; this option must be set to 1 when adding, removing or modifying javascript files
+; Note that for quick debugging, instead of using below setting, you can add `&disable_merged_assets=1` to the Piwik URL
 disable_merged_assets = 0
 
 [General]
@@ -780,8 +776,6 @@ Plugins[] = MobileMessaging
 Plugins[] = Overlay
 Plugins[] = SegmentEditor
 Plugins[] = Insights
-Plugins[] = ZenMode
-Plugins[] = LeftMenu
 Plugins[] = Morpheus
 Plugins[] = Contents
 Plugins[] = TestRunner
diff --git a/core/Archive.php b/core/Archive.php
index 54133939724fc1917868e2060e48f75390282bba..80ef151f388792b03bd89454cb268c0be29d1da8 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -11,6 +11,7 @@ namespace Piwik;
 use Piwik\Archive\Parameters;
 use Piwik\ArchiveProcessor\Rules;
 use Piwik\Archive\ArchiveInvalidator;
+use Piwik\Container\StaticContainer;
 use Piwik\DataAccess\ArchiveSelector;
 use Piwik\Period\Factory as PeriodFactory;
 
@@ -166,6 +167,11 @@ class Archive
      */
     private static $cache;
 
+    /**
+     * @var ArchiveInvalidator
+     */
+    private $invalidator;
+
     /**
      * @param Parameters $params
      * @param bool $forceIndexedBySite Whether to force index the result of a query by site ID.
@@ -177,6 +183,8 @@ class Archive
         $this->params = $params;
         $this->forceIndexedBySite = $forceIndexedBySite;
         $this->forceIndexedByDate = $forceIndexedByDate;
+
+        $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
     }
 
     /**
@@ -539,8 +547,7 @@ class Archive
             return; // all requested site ids were already handled
         }
 
-        $invalidator  = new ArchiveInvalidator();
-        $sitesPerDays = $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
+        $sitesPerDays = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
 
         foreach ($sitesPerDays as $date => $siteIds) {
             if (empty($siteIds)) {
@@ -554,7 +561,7 @@ class Archive
             }
 
             try {
-                $invalidator->markArchivesAsInvalidated($siteIdsToActuallyInvalidate, array(Date::factory($date)), false);
+                $this->invalidator->markArchivesAsInvalidated($siteIdsToActuallyInvalidate, array(Date::factory($date)), false);
             } catch (\Exception $e) {
                 Site::clearCache();
                 throw $e;
diff --git a/core/Archive/ArchiveInvalidator.php b/core/Archive/ArchiveInvalidator.php
index d89a2911e91fa10ba6867a1dc7f329c3cf78faac..6ecc5b8734765791df966cee4160ed54c745b43b 100644
--- a/core/Archive/ArchiveInvalidator.php
+++ b/core/Archive/ArchiveInvalidator.php
@@ -9,16 +9,16 @@
 
 namespace Piwik\Archive;
 
+use Piwik\Archive\ArchiveInvalidator\InvalidationResult;
 use Piwik\CronArchive\SitesToReprocessDistributedList;
 use Piwik\DataAccess\ArchiveTableCreator;
 use Piwik\DataAccess\Model;
 use Piwik\Date;
 use Piwik\Option;
-use Piwik\Piwik;
 use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList;
 use Piwik\Plugins\PrivacyManager\PrivacyManager;
 use Piwik\Period;
-use Piwik\Period\Week;
+use Piwik\Segment;
 
 /**
  * Service that can be used to invalidate archives or add archive references to a list so they will
@@ -45,12 +45,18 @@ use Piwik\Period\Week;
  */
 class ArchiveInvalidator
 {
-    private $warningDates = array();
-    private $processedDates = array();
-    private $minimumDateWithLogs = false;
-
     private $rememberArchivedReportIdStart = 'report_to_invalidate_';
 
+    /**
+     * @var Model
+     */
+    private $model;
+
+    public function __construct(Model $model)
+    {
+        $this->model = $model;
+    }
+
     public function rememberToInvalidateArchivedReportsLater($idSite, Date $date)
     {
         $key   = $this->buildRememberArchivedReportId($idSite, $date->toString());
@@ -120,17 +126,30 @@ class ArchiveInvalidator
      * @param $idSites int[]
      * @param $dates Date[]
      * @param $period string
-     * @return array
+     * @param $segment Segment
+     * @param bool $cascadeDown
+     * @return InvalidationResult
      * @throws \Exception
      */
-    public function markArchivesAsInvalidated(array $idSites, $dates, $period)
+    public function markArchivesAsInvalidated(array $idSites, array $dates, $period, Segment $segment = null, $cascadeDown = false)
     {
-        $dates = $this->removeDatesThatHaveBeenPurged($dates);
+        $invalidationInfo = new InvalidationResult();
+
+        $datesToInvalidate = $this->removeDatesThatHaveBeenPurged($dates, $invalidationInfo);
+
+        if (empty($period)) {
+            // if the period is empty, we don't need to cascade in any way, since we'll remove all periods
+            $periodDates = $this->getDatesByYearMonthAndPeriodType($dates);
+        } else {
+            $periods = $this->getPeriodsToInvalidate($datesToInvalidate, $period, $cascadeDown);
+            $periodDates = $this->getPeriodDatesByYearMonthAndPeriodType($periods);
+        }
 
-        $datesByMonth = $this->getDatesByYearMonth($dates);
+        $periodDates = $this->getUniqueDates($periodDates);
+        $this->markArchivesInvalidated($idSites, $periodDates, $segment);
 
-        $this->markArchivesInvalidatedFor($idSites, $period, $datesByMonth);
-        $this->persistInvalidatedArchives($idSites, $datesByMonth);
+        $yearMonths = array_keys($periodDates);
+        $this->markInvalidatedArchivesForReprocessAndPurge($idSites, $yearMonths);
 
         foreach ($idSites as $idSite) {
             foreach ($dates as $date) {
@@ -138,148 +157,161 @@ class ArchiveInvalidator
             }
         }
 
-        return $this->makeOutputLogs();
+        return $invalidationInfo;
     }
 
     /**
-     * @param $idSites
-     * @param $period string
-     * @param $datesByMonth array
-     * @throws \Exception
+     * @param string[][][] $periodDates
+     * @return string[][][]
      */
-    private function markArchivesInvalidatedFor($idSites, $period, $datesByMonth)
+    private function getUniqueDates($periodDates)
     {
-        $invalidateForPeriodId = $this->getPeriodId($period);
-
-        // In each table, invalidate day/week/month/year containing this date
-        $archiveTables = ArchiveTableCreator::getTablesArchivesInstalled();
-
-        $archiveNumericTables = array_filter($archiveTables, function ($name) {
-            return ArchiveTableCreator::getTypeFromTableName($name) == ArchiveTableCreator::NUMERIC_TABLE;
-        });
-
-        foreach ($archiveNumericTables as $table) {
-            // Extract Y_m from table name
-            $suffix = ArchiveTableCreator::getDateFromTableName($table);
-            if (!isset($datesByMonth[$suffix])) {
-                continue;
+        $result = array();
+        foreach ($periodDates as $yearMonth => $periodsByYearMonth) {
+            foreach ($periodsByYearMonth as $periodType => $periods) {
+                $result[$yearMonth][$periodType] = array_unique($periods);
             }
-            // Dates which are to be deleted from this table
-            $datesToDelete = $datesByMonth[$suffix];
-            self::getModel()->updateArchiveAsInvalidated($table, $idSites, $invalidateForPeriodId, $datesToDelete);
         }
+        return $result;
     }
 
     /**
      * @param Date[] $dates
-     * @return Date[]
+     * @param string $periodType
+     * @param bool $cascadeDown
+     * @return Period[]
      */
-    private function removeDatesThatHaveBeenPurged($dates)
+    private function getPeriodsToInvalidate($dates, $periodType, $cascadeDown)
     {
-        $this->findOlderDateWithLogs();
+        $periodsToInvalidate = array();
 
-        $result = array();
         foreach ($dates as $date) {
-            // we should only delete reports for dates that are more recent than N days
-            if ($this->minimumDateWithLogs
-                && $date->isEarlier($this->minimumDateWithLogs)
-            ) {
-                $this->warningDates[] = $date->toString();
-                continue;
+            if ($periodType == 'range') {
+                $date = $date . ',' . $date;
             }
 
-            $result[] = $date;
+            $period = Period\Factory::build($periodType, $date);
+            $periodsToInvalidate[] = $period;
+
+            if ($cascadeDown) {
+                $periodsToInvalidate = array_merge($periodsToInvalidate, $period->getAllOverlappingChildPeriods());
+            }
+
+            if ($periodType != 'year'
+                && $periodType != 'range'
+            ) {
+                $periodsToInvalidate[] = Period\Factory::build('year', $date);
+            }
         }
-        return $result;
+
+        return $periodsToInvalidate;
     }
 
-    private function findOlderDateWithLogs()
+    /**
+     * @param Period[] $periods
+     * @return string[][][]
+     */
+    private function getPeriodDatesByYearMonthAndPeriodType($periods)
     {
-        // If using the feature "Delete logs older than N days"...
-        $purgeDataSettings = PrivacyManager::getPurgeDataSettings();
-        $logsDeletedWhenOlderThanDays = $purgeDataSettings['delete_logs_older_than'];
-        $logsDeleteEnabled = $purgeDataSettings['delete_logs_enable'];
+        $result = array();
+        foreach ($periods as $period) {
+            $date = $period->getDateStart();
+            $periodType = $period->getId();
 
-        if ($logsDeleteEnabled
-            && $logsDeletedWhenOlderThanDays
-        ) {
-            $this->minimumDateWithLogs = Date::factory('today')->subDay($logsDeletedWhenOlderThanDays);
+            $yearMonth = ArchiveTableCreator::getTableMonthFromDate($date);
+            $result[$yearMonth][$periodType][] = $date->toString();
         }
+        return $result;
     }
 
     /**
-     * Given the list of dates, process which tables YYYY_MM we should delete from
+     * Called when deleting all periods.
      *
-     * @param $datesToInvalidate Date[]
-     * @return array
+     * @param Date[] $dates
+     * @return string[][][]
      */
-    private function getDatesByYearMonth(array $datesToInvalidate)
+    private function getDatesByYearMonthAndPeriodType($dates)
     {
-        $datesByMonth = array();
-        foreach ($datesToInvalidate as $date) {
-            $this->processedDates[] = $date->toString();
-
-            $month = $date->toString('Y_m');
-            // For a given date, we must invalidate in the monthly archive table
-            $datesByMonth[$month][] = $date->toString();
-
-            // But also the year stored in January
-            $year = $date->toString('Y_01');
-            $datesByMonth[$year][] = $date->toString();
-
-            // but also weeks overlapping several months stored in the month where the week is starting
-            /* @var $week Week */
-            $week = Period\Factory::build('week', $date);
-            $weekAsString = $week->getDateStart()->toString('Y_m');
-            $datesByMonth[$weekAsString][] = $date->toString();
+        $result = array();
+        foreach ($dates as $date) {
+            $yearMonth = ArchiveTableCreator::getTableMonthFromDate($date);
+            $result[$yearMonth][null][] = $date->toString();
+
+            // since we're removing all periods, we must make sure to remove year periods as well.
+            // this means we have to make sure the january table is processed.
+            $janYearMonth = $date->toString('Y') . '_01';
+            $result[$janYearMonth][null][] = $date->toString();
         }
-        return $datesByMonth;
+        return $result;
     }
 
     /**
-     * @return array
+     * @param int[] $idSites
+     * @param string[][][] $dates
+     * @throws \Exception
      */
-    private function makeOutputLogs()
+    private function markArchivesInvalidated($idSites, $dates, Segment $segment = null)
     {
-        $output = array();
-        if ($this->warningDates) {
-            $output[] = 'Warning: the following Dates have not been invalidated, because they are earlier than your Log Deletion limit: ' .
-                implode(", ", $this->warningDates) .
-                "\n The last day with logs is " . $this->minimumDateWithLogs . ". " .
-                "\n Please disable 'Delete old Logs' or set it to a higher deletion threshold (eg. 180 days or 365 years).'.";
-        }
+        $archiveNumericTables = ArchiveTableCreator::getTablesArchivesInstalled($type = ArchiveTableCreator::NUMERIC_TABLE);
+        foreach ($archiveNumericTables as $table) {
+            $tableDate = ArchiveTableCreator::getDateFromTableName($table);
+            if (empty($dates[$tableDate])) {
+                continue;
+            }
 
-        $output[] = "Success. The following dates were invalidated successfully: " . implode(", ", $this->processedDates);
-        return $output;
+            $this->model->updateArchiveAsInvalidated($table, $idSites, $dates[$tableDate], $segment);
+        }
     }
 
     /**
-     * @param $period
-     * @return int|null
+     * @param Date[] $dates
+     * @param InvalidationResult $invalidationInfo
+     * @return \Piwik\Date[]
      */
-    private function getPeriodId($period)
+    private function removeDatesThatHaveBeenPurged($dates, InvalidationResult $invalidationInfo)
     {
-        return isset(Piwik::$idPeriods[$period]) ? Piwik::$idPeriods[$period] : null;
+        $this->findOlderDateWithLogs($invalidationInfo);
+
+        $result = array();
+        foreach ($dates as $date) {
+            // we should only delete reports for dates that are more recent than N days
+            if ($invalidationInfo->minimumDateWithLogs
+                && $date->isEarlier($invalidationInfo->minimumDateWithLogs)
+            ) {
+                $invalidationInfo->warningDates[] = $date->toString();
+                continue;
+            }
+
+            $result[] = $date;
+            $invalidationInfo->processedDates[] = $date->toString();
+        }
+        return $result;
+    }
+
+    private function findOlderDateWithLogs(InvalidationResult $info)
+    {
+        // If using the feature "Delete logs older than N days"...
+        $purgeDataSettings = PrivacyManager::getPurgeDataSettings();
+        $logsDeletedWhenOlderThanDays = (int)$purgeDataSettings['delete_logs_older_than'];
+        $logsDeleteEnabled = $purgeDataSettings['delete_logs_enable'];
+
+        if ($logsDeleteEnabled
+            && $logsDeletedWhenOlderThanDays
+        ) {
+            $info->minimumDateWithLogs = Date::factory('today')->subDay($logsDeletedWhenOlderThanDays);
+        }
     }
 
     /**
      * @param array $idSites
-     * @param $datesByMonth
+     * @param array $yearMonths
      */
-    private function persistInvalidatedArchives(array $idSites, $datesByMonth)
+    private function markInvalidatedArchivesForReprocessAndPurge(array $idSites, $yearMonths)
     {
-        $yearMonths = array_keys($datesByMonth);
-        $yearMonths = array_unique($yearMonths);
-
         $store = new SitesToReprocessDistributedList();
         $store->add($idSites);
 
         $archivesToPurge = new ArchivesToPurgeDistributedList();
         $archivesToPurge->add($yearMonths);
     }
-
-    private static function getModel()
-    {
-        return new Model();
-    }
 }
diff --git a/core/Archive/ArchiveInvalidator/InvalidationResult.php b/core/Archive/ArchiveInvalidator/InvalidationResult.php
new file mode 100644
index 0000000000000000000000000000000000000000..517e113841329a860d3ec671c4f15b04a63bb340
--- /dev/null
+++ b/core/Archive/ArchiveInvalidator/InvalidationResult.php
@@ -0,0 +1,56 @@
+<?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\Archive\ArchiveInvalidator;
+
+use Piwik\Date;
+
+/**
+ * Information about the result of an archive invalidation operation.
+ */
+class InvalidationResult
+{
+    /**
+     * Dates that couldn't be invalidated because they are earlier than the configured log
+     * deletion limit.
+     *
+     * @var array
+     */
+    public $warningDates = array();
+
+    /**
+     * Dates that were successfully invalidated.
+     *
+     * @var array
+     */
+    public $processedDates = array();
+
+    /**
+     * The day of the oldest log entry.
+     *
+     * @var Date|bool
+     */
+    public $minimumDateWithLogs = false;
+
+    /**
+     * @return string[]
+     */
+    public function makeOutputLogs()
+    {
+        $output = array();
+        if ($this->warningDates) {
+            $output[] = 'Warning: the following Dates have not been invalidated, because they are earlier than your Log Deletion limit: ' .
+                implode(", ", $this->warningDates) .
+                "\n The last day with logs is " . $this->minimumDateWithLogs . ". " .
+                "\n Please disable 'Delete old Logs' or set it to a higher deletion threshold (eg. 180 days or 365 years).'.";
+        }
+
+        $output[] = "Success. The following dates were invalidated successfully: " . implode(", ", $this->processedDates);
+        return $output;
+    }
+}
\ No newline at end of file
diff --git a/core/ArchiveProcessor/Rules.php b/core/ArchiveProcessor/Rules.php
index caa5a627fb4c85736543ae94cf0906a292b8df57..0ec92f75907dd623c015a08256e3c7dcb3c3a053 100644
--- a/core/ArchiveProcessor/Rules.php
+++ b/core/ArchiveProcessor/Rules.php
@@ -86,7 +86,7 @@ class Rules
         return 'done' . $segment->getHash() . '.' . $plugin ;
     }
 
-    private static function getDoneFlagArchiveContainsAllPlugins(Segment $segment)
+    public static function getDoneFlagArchiveContainsAllPlugins(Segment $segment)
     {
         return 'done' . $segment->getHash();
     }
diff --git a/core/AssetManager.php b/core/AssetManager.php
index a1a1762a4b6c7034c722983316ec873ba7928441..407a2058c05aa1a0afa7c47360a6b799a7def447 100644
--- a/core/AssetManager.php
+++ b/core/AssetManager.php
@@ -260,7 +260,15 @@ class AssetManager extends Singleton
      */
     public function isMergedAssetsDisabled()
     {
-        return Config::getInstance()->Development['disable_merged_assets'];
+        if (Config::getInstance()->Development['disable_merged_assets'] == 1) {
+            return true;
+        }
+        
+        if (isset($_GET['disable_merged_assets']) && $_GET['disable_merged_assets'] == 1) {
+            return true;
+        }
+        
+        return false;
     }
 
     /**
diff --git a/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php b/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php
index d8ec05ca53cd023a92ca7f24acf7f200f7e84355..aed319253fa8cfbf50161096e9055086dea55aee 100644
--- a/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php
+++ b/core/AssetManager/UIAssetFetcher/JScriptUIAssetFetcher.php
@@ -72,6 +72,8 @@ class JScriptUIAssetFetcher extends UIAssetFetcher
             'libs/bower_components/jquery-ui/ui/minified/jquery-ui.min.js',
             'libs/jquery/jquery.browser.js',
             'libs/',
+            'js/',
+            'piwik.js',
             'plugins/CoreHome/javascripts/require.js',
             'plugins/Morpheus/javascripts/piwikHelper.js',
             'plugins/Morpheus/javascripts/jquery.icheck.min.js',
diff --git a/core/Category/Category.php b/core/Category/Category.php
index cda49032e0c7e8efc77185e6a27ece84d4845992..9694054d11497ca076556533800c483c7fa6d03e 100644
--- a/core/Category/Category.php
+++ b/core/Category/Category.php
@@ -36,6 +36,12 @@ class Category
      */
     protected $order = 99;
 
+    /**
+     * The icon for this category, eg 'icon-user'
+     * @var int
+     */
+    protected $icon = '';
+
     /**
      * @param int $order
      * @return static
@@ -97,4 +103,16 @@ class Category
     {
         return !empty($this->subcategories);
     }
+
+    public function setIcon($icon)
+    {
+        $this->icon = $icon;
+        return $this;
+    }
+
+    public function getIcon()
+    {
+        return $this->icon;
+    }
+
 }
\ No newline at end of file
diff --git a/core/Columns/Updater.php b/core/Columns/Updater.php
index a29ed16330cd38e951df9a3d2792390630f547df..8dea10ded7ef4fed09595f4373e6305d05454508 100644
--- a/core/Columns/Updater.php
+++ b/core/Columns/Updater.php
@@ -47,9 +47,9 @@ class Updater extends \Piwik\Updates
      */
     public function __construct(array $visitDimensions = null, array $actionDimensions = null, array $conversionDimensions = null)
     {
-        $this->visitDimensions = $visitDimensions === null ? VisitDimension::getAllDimensions() : $visitDimensions;
-        $this->actionDimensions = $actionDimensions === null ? ActionDimension::getAllDimensions() : $actionDimensions;
-        $this->conversionDimensions = $conversionDimensions === null ? ConversionDimension::getAllDimensions() : $conversionDimensions;
+        $this->visitDimensions = $visitDimensions;
+        $this->actionDimensions = $actionDimensions;
+        $this->conversionDimensions = $conversionDimensions;
     }
 
     public function getMigrationQueries(PiwikUpdater $updater)
@@ -74,6 +74,36 @@ class Updater extends \Piwik\Updates
         $updater->executeMigrationQueries(__FILE__, $this->getMigrationQueries($updater));
     }
 
+    private function getVisitDimensions()
+    {
+        // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance
+        if (!isset($this->visitDimensions)) {
+            $this->visitDimensions = VisitDimension::getAllDimensions();
+        }
+
+        return $this->visitDimensions;
+    }
+
+    private function getActionDimensions()
+    {
+        // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance
+        if (!isset($this->actionDimensions)) {
+            $this->actionDimensions = ActionDimension::getAllDimensions();
+        }
+
+        return $this->actionDimensions;
+    }
+
+    private function getConversionDimensions()
+    {
+        // see eg https://github.com/piwik/piwik/issues/8399 we fetch them only on demand to improve performance
+        if (!isset($this->conversionDimensions)) {
+            $this->conversionDimensions = ConversionDimension::getAllDimensions();
+        }
+
+        return $this->conversionDimensions;
+    }
+
     private function getUpdates(PiwikUpdater $updater)
     {
         $visitColumns      = DbHelper::getTableColumns(Common::prefixTable('log_visit'));
@@ -82,17 +112,17 @@ class Updater extends \Piwik\Updates
 
         $allUpdatesToRun = array();
 
-        foreach ($this->visitDimensions as $dimension) {
+        foreach ($this->getVisitDimensions() as $dimension) {
             $updates         = $this->getUpdatesForDimension($updater, $dimension, 'log_visit.', $visitColumns, $conversionColumns);
             $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates);
         }
 
-        foreach ($this->actionDimensions as $dimension) {
+        foreach ($this->getActionDimensions() as $dimension) {
             $updates         = $this->getUpdatesForDimension($updater, $dimension, 'log_link_visit_action.', $actionColumns);
             $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates);
         }
 
-        foreach ($this->conversionDimensions as $dimension) {
+        foreach ($this->getConversionDimensions() as $dimension) {
             $updates         = $this->getUpdatesForDimension($updater, $dimension, 'log_conversion.', $conversionColumns);
             $allUpdatesToRun = $this->mixinUpdates($allUpdatesToRun, $updates);
         }
@@ -162,15 +192,15 @@ class Updater extends \Piwik\Updates
         $actionColumns     = DbHelper::getTableColumns(Common::prefixTable('log_link_visit_action'));
         $conversionColumns = DbHelper::getTableColumns(Common::prefixTable('log_conversion'));
 
-        foreach ($this->visitDimensions as $dimension) {
+        foreach ($this->getVisitDimensions() as $dimension) {
             $versions = $this->mixinVersions($updater, $dimension, VisitDimension::INSTALLER_PREFIX, $visitColumns, $versions);
         }
 
-        foreach ($this->actionDimensions as $dimension) {
+        foreach ($this->getActionDimensions() as $dimension) {
             $versions = $this->mixinVersions($updater, $dimension, ActionDimension::INSTALLER_PREFIX, $actionColumns, $versions);
         }
 
-        foreach ($this->conversionDimensions as $dimension) {
+        foreach ($this->getConversionDimensions() as $dimension) {
             $versions = $this->mixinVersions($updater, $dimension, ConversionDimension::INSTALLER_PREFIX, $conversionColumns, $versions);
         }
 
diff --git a/core/CronArchive.php b/core/CronArchive.php
index e33b918154e2b87ea8bcf98f9ccbefe50aacd94c..4b9d3556d3f43413918c9e9967dd8afa12ca429f 100644
--- a/core/CronArchive.php
+++ b/core/CronArchive.php
@@ -237,6 +237,11 @@ class CronArchive
      */
     private $urlToPiwik = null;
 
+    /**
+     * @var ArchiveInvalidator
+     */
+    private $invalidator;
+
     /**
      * Returns the option name of the option that stores the time core:archive was last executed.
      *
@@ -262,6 +267,8 @@ class CronArchive
 
         $processNewSegmentsFrom = $processNewSegmentsFrom ?: StaticContainer::get('ini.General.process_new_segments_from');
         $this->segmentArchivingRequestUrlProvider = new SegmentArchivingRequestUrlProvider($processNewSegmentsFrom);
+
+        $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
     }
 
     /**
@@ -1069,8 +1076,7 @@ class CronArchive
 
     public function invalidateArchivedReportsForSitesThatNeedToBeArchivedAgain()
     {
-        $invalidator  = new ArchiveInvalidator();
-        $sitesPerDays = $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
+        $sitesPerDays = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
 
         foreach ($sitesPerDays as $date => $siteIds) {
             $listSiteIds = implode(',', $siteIds);
diff --git a/core/DataAccess/ArchiveTableCreator.php b/core/DataAccess/ArchiveTableCreator.php
index ca94b7239997b0b19a027fd0d1901119e66bf188..ad95863da48ec61c97d745489b76e3e27efd2439 100644
--- a/core/DataAccess/ArchiveTableCreator.php
+++ b/core/DataAccess/ArchiveTableCreator.php
@@ -71,24 +71,27 @@ class ArchiveTableCreator
     /**
      * Returns all table names archive_*
      *
+     * @param string $type The type of table to return. Either `self::NUMERIC_TABLE` or `self::BLOB_TABLE`.
      * @return array
      */
-    public static function getTablesArchivesInstalled()
+    public static function getTablesArchivesInstalled($type = null)
     {
         if (is_null(self::$tablesAlreadyInstalled)) {
             self::refreshTableList();
         }
 
-        $archiveTables = array();
+        if (empty($type)) {
+            $tableMatchRegex = '/archive_(numeric|blob)_/';
+        } else {
+            $tableMatchRegex = '/archive_' . preg_quote($type) . '_/';
+        }
 
+        $archiveTables = array();
         foreach (self::$tablesAlreadyInstalled as $table) {
-            if (strpos($table, 'archive_numeric_') !== false
-                || strpos($table, 'archive_blob_') !== false
-            ) {
+            if (preg_match($tableMatchRegex, $table)) {
                 $archiveTables[] = $table;
             }
         }
-
         return $archiveTables;
     }
 
diff --git a/core/DataAccess/Model.php b/core/DataAccess/Model.php
index a83db1317a5c99be3fa466563d1351089b6cebb7..4213cd203950c1f1ea06e9332e61e3dfec0ed154 100644
--- a/core/DataAccess/Model.php
+++ b/core/DataAccess/Model.php
@@ -9,10 +9,13 @@
 namespace Piwik\DataAccess;
 
 use Exception;
+use Piwik\ArchiveProcessor\Rules;
 use Piwik\Common;
 use Piwik\Container\StaticContainer;
 use Piwik\Db;
 use Piwik\DbHelper;
+use Piwik\Period;
+use Piwik\Segment;
 use Piwik\Sequence;
 use Psr\Log\LoggerInterface;
 
@@ -95,39 +98,55 @@ class Model
     }
 
     /**
-     * @param $archiveTable
-     * @param $idSites
-     * @param $periodId
-     * @param $datesToDelete
+     * @param string $archiveTable Prefixed table name
+     * @param int[] $idSites
+     * @param string[][] $datesByPeriodType
+     * @param Segment $segment
+     * @return \Zend_Db_Statement
      * @throws Exception
      */
-    public function updateArchiveAsInvalidated($archiveTable, $idSites, $periodId, $datesToDelete)
+    public function updateArchiveAsInvalidated($archiveTable, $idSites, $datesByPeriodType, Segment $segment = null)
     {
-        $sql = $bind = array();
-        $datesToDelete = array_unique($datesToDelete);
-        foreach ($datesToDelete as $dateToDelete) {
-            $sql[] = '(date1 <= ? AND ? <= date2 AND name LIKE \'done%\')';
-            $bind[] = $dateToDelete;
-            $bind[] = $dateToDelete;
-        }
-        $sql = implode(" OR ", $sql);
+        $idSites = array_map('intval', $idSites);
+
+        $bind = array();
 
-        $idSites = array_values($idSites);
-        $sqlSites = " AND idsite IN (" . Common::getSqlStringFieldsArray($idSites) . ")";
-        $bind = array_merge($bind, $idSites);
+        $periodConditions = array();
+        foreach ($datesByPeriodType as $periodType => $dates) {
+            $dateConditions = array();
 
-        $sqlPeriod = "";
-        if ($periodId) {
-            $sqlPeriod = " AND period = ? ";
-            $bind[] = $periodId;
+            foreach ($dates as $date) {
+                $dateConditions[] = "(date1 <= ? AND ? <= date2)";
+                $bind[] = $date;
+                $bind[] = $date;
+            }
+
+            $dateConditionsSql = implode(" OR ", $dateConditions);
+            if (empty($periodType)
+                || $periodType == Period\Day::PERIOD_ID
+            ) {
+                // invalidate all periods if no period supplied or period is day
+                $periodConditions[] = "($dateConditionsSql)";
+            } else if ($periodType == Period\Range::PERIOD_ID) {
+                $periodConditions[] = "(period = " . Period\Range::PERIOD_ID . " AND ($dateConditionsSql))";
+            } else {
+                // for non-day periods, invalidate greater periods, but not range periods
+                $periodConditions[] = "(period >= " . (int)$periodType . " AND period < " . Period\Range::PERIOD_ID . " AND ($dateConditionsSql))";
+            }
+        }
+
+        if ($segment) {
+            $nameCondition = "name LIKE '" . Rules::getDoneFlagArchiveContainsAllPlugins($segment) . "%'";
+        } else {
+            $nameCondition = "name LIKE 'done%'";
         }
 
-        $query = "UPDATE $archiveTable " .
-            " SET value = " . ArchiveWriter::DONE_INVALIDATED .
-            " WHERE ( $sql ) " .
-            $sqlSites .
-            $sqlPeriod;
-        Db::query($query, $bind);
+        $sql = "UPDATE $archiveTable SET value = " . ArchiveWriter::DONE_INVALIDATED
+             . " WHERE $nameCondition
+                   AND idsite IN (" . implode(", ", $idSites) . ")
+                   AND (" . implode(" OR ", $periodConditions) . ")";
+
+        return Db::query($sql, $bind);
     }
 
 
@@ -157,7 +176,7 @@ class Model
             // Individual blob tables could be missing
             $this->logger->debug("Unable to delete archives by period from {blobTable}.", array(
                 'blobTable' => $blobTable,
-                'exception' => $e
+                'exception' => $e,
             ));
         }
 
@@ -179,7 +198,7 @@ class Model
             // Individual blob tables could be missing
             $this->logger->debug("Unable to delete archive IDs from {blobTable}.", array(
                 'blobTable' => $blobTable,
-                'exception' => $e
+                'exception' => $e,
             ));
         }
 
diff --git a/core/DataTable/Filter/CalculateEvolutionFilter.php b/core/DataTable/Filter/CalculateEvolutionFilter.php
index 5af658bad6de2a4058019b51d8ff033684f8fad0..73274c537dc9e6ea3728b070cc90cfc3d0e76814 100755
--- a/core/DataTable/Filter/CalculateEvolutionFilter.php
+++ b/core/DataTable/Filter/CalculateEvolutionFilter.php
@@ -11,6 +11,7 @@ namespace Piwik\DataTable\Filter;
 use Piwik\Common;
 use Piwik\DataTable;
 use Piwik\DataTable\Row;
+use Piwik\NumberFormatter;
 use Piwik\Site;
 
 /**
@@ -157,10 +158,10 @@ class CalculateEvolutionFilter extends ColumnCallbackAddColumnPercentage
     {
         $number = self::getPercentageValue($currentValue - $pastValue, $pastValue, $quotientPrecision);
         if ($appendPercentSign) {
-            $number = self::appendPercentSign($number);
+            return NumberFormatter::getInstance()->formatPercent($number, $quotientPrecision);
         }
 
-        return $number;
+        return NumberFormatter::getInstance()->format($number, $quotientPrecision);
     }
 
     public static function appendPercentSign($number)
diff --git a/core/Db.php b/core/Db.php
index 8a18f558d82787ccee363cb5ed1a9cd2e4d2ae88..12798d2ff5215da72b360c7e0febe1f6a5945ca4 100644
--- a/core/Db.php
+++ b/core/Db.php
@@ -33,7 +33,7 @@ use Piwik\Db\Adapter;
  */
 class Db
 {
-    const SQL_MODE = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE';
+    const SQL_MODE = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE';
 
     private static $connection = null;
 
diff --git a/core/Intl/Locale.php b/core/Intl/Locale.php
index 0c7676569af4e306c2649bbfe8bbd34bd93bda33..05cf51a8e39f9616b077302257a9f9ff51683b4a 100644
--- a/core/Intl/Locale.php
+++ b/core/Intl/Locale.php
@@ -31,6 +31,8 @@ class Locale
         
         setlocale(LC_ALL, $newLocale);
         setlocale(LC_CTYPE, '');
+        // Always use english for numbers. otherwise the decimal separator might get localized when casting a float to string
+        setlocale(LC_NUMERIC, array('en_US.UTF-8', 'en-US'));
     }
 
     public static function setDefaultLocale()
diff --git a/core/Menu/MenuAbstract.php b/core/Menu/MenuAbstract.php
index 7651a1199d3a0323acefb332815efc8d43f10451..777d97b523736b34a1eec8d5025e518dae2aec30 100644
--- a/core/Menu/MenuAbstract.php
+++ b/core/Menu/MenuAbstract.php
@@ -30,6 +30,7 @@ abstract class MenuAbstract extends Singleton
     protected $edits = array();
     protected $renames = array();
     protected $orderingApplied = false;
+    protected $menuIcons = array();
     protected static $menus = array();
 
     /**
@@ -48,6 +49,17 @@ abstract class MenuAbstract extends Singleton
         return $this->menu;
     }
 
+    /**
+     * Let's you register a menu icon for a certain menu category to replace the default arrow icon.
+     *
+     * @param string $menuName The translation key of a main menu category, eg 'Dashboard_Dashboard'
+     * @param string $iconCssClass   The css class name of an icon, eg 'icon-user'
+     */
+    public function registerMenuIcon($menuName, $iconCssClass)
+    {
+        $this->menuIcons[$menuName] = $iconCssClass;
+    }
+
     /**
      * Returns a list of available plugin menu instances.
      *
@@ -164,6 +176,11 @@ abstract class MenuAbstract extends Singleton
             $this->menu[$menuName]['_order'] = $order;
             $this->menu[$menuName]['_name']  = $menuName;
             $this->menu[$menuName]['_tooltip'] = $tooltip;
+            if (!empty($this->menuIcons[$menuName])) {
+                $this->menu[$menuName]['_icon'] = $this->menuIcons[$menuName];
+            } else {
+                $this->menu[$menuName]['_icon'] = '';
+            }
         }
         if (!empty($subMenuName)) {
             $this->menu[$menuName][$subMenuName]['_url'] = $url;
diff --git a/core/Metrics/Formatter.php b/core/Metrics/Formatter.php
index c2b8a1062d2fddb33f20e29f68065b127ff2cb6a..8fbe5cbb89c7b0b37f06a232fd8f8858ee80484c 100644
--- a/core/Metrics/Formatter.php
+++ b/core/Metrics/Formatter.php
@@ -11,6 +11,7 @@ use Piwik\Common;
 use Piwik\Container\StaticContainer;
 use Piwik\DataTable;
 use Piwik\Intl\Data\Provider\CurrencyDataProvider;
+use Piwik\NumberFormatter;
 use Piwik\Piwik;
 use Piwik\Plugin\Metric;
 use Piwik\Plugin\ProcessedMetric;
@@ -98,7 +99,7 @@ class Formatter
 
         $seconds   = $minusDaysAndHours - $minutes * 60;
         $precision = ($seconds > 0 && $seconds < 0.01 ? 3 : 2);
-        $seconds   = round($seconds, $precision);
+        $seconds   = NumberFormatter::getInstance()->formatNumber(round($seconds, $precision), $precision);
 
         if ($years > 0) {
             $return = sprintf(Piwik::translate('General_YearsDays'), $years, $days);
@@ -149,21 +150,16 @@ class Formatter
     public function getPrettyMoney($value, $idSite)
     {
         $space = ' ';
-
         $currencySymbol = self::getCurrencySymbol($idSite);
-
         $currencyBefore =  $currencySymbol . $space;
         $currencyAfter = '';
-
         // (maybe more currencies prefer this notation?)
         $currencySymbolToAppend = array('€', 'kr', 'zł');
-
         // manually put the currency symbol after the amount
         if (in_array($currencySymbol, $currencySymbolToAppend)) {
             $currencyAfter = $space . $currencySymbol;
             $currencyBefore = '';
         }
-
         // if the input is a number (it could be a string or INPUT form),
         // and if this number is not an int, we round to precision 2
         if (is_numeric($value)) {
@@ -175,7 +171,6 @@ class Formatter
                 $value = sprintf("%01." . $precision . "f", $value);
             }
         }
-
         $prettyMoney = $currencyBefore . $value . $currencyAfter;
         return $prettyMoney;
     }
diff --git a/core/NumberFormatter.php b/core/NumberFormatter.php
new file mode 100644
index 0000000000000000000000000000000000000000..ad030400f4ad77ac987dce0d430c8a7df6cc9827
--- /dev/null
+++ b/core/NumberFormatter.php
@@ -0,0 +1,305 @@
+<?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;
+
+/**
+ * Class NumberFormatter
+ *
+ * Used to format numbers according to current language
+ */
+class NumberFormatter extends Singleton
+{
+    /** @var string language specific patterns for numbers */
+    protected $patternNumber;
+
+    /** @var string language specific pattern for percent numbers */
+    protected $patternPercent;
+
+    /** @var string language specific pattern for currency numbers */
+    protected $patternCurrency;
+
+    /** @var string language specific plus sign */
+    protected $symbolPlus;
+
+    /** @var string language specific minus sign */
+    protected $symbolMinus;
+
+    /** @var string language specific percent sign */
+    protected $symbolPercent;
+
+    /** @var string language specific symbol used as decimal separator */
+    protected $symbolDecimal;
+
+    /** @var string language specific symbol used as group separator */
+    protected $symbolGroup;
+
+    /** @var bool indicates if language uses grouping for numbers */
+    protected $usesGrouping;
+
+    /** @var int language specific size for primary group numbers */
+    protected $primaryGroupSize;
+
+    /** @var int language specific size for secondary group numbers */
+    protected $secondaryGroupSize;
+
+    /**
+     * Loads all required data from Intl plugin
+     */
+    public function __construct()
+    {
+        $this->patternNumber = Piwik::translate('Intl_NumberFormatNumber');
+        $this->patternCurrency = Piwik::translate('Intl_NumberFormatCurrency');
+        $this->patternPercent = Piwik::translate('Intl_NumberFormatPercent');
+        $this->symbolPlus = Piwik::translate('Intl_NumberSymbolPlus');
+        $this->symbolMinus = Piwik::translate('Intl_NumberSymbolMinus');
+        $this->symbolPercent = Piwik::translate('Intl_NumberSymbolPercent');
+        $this->symbolGroup = Piwik::translate('Intl_NumberSymbolGroup');
+        $this->symbolDecimal = Piwik::translate('Intl_NumberSymbolDecimal');
+    }
+
+    /**
+     * Parses the given pattern and returns patterns for positive and negative numbers
+     *
+     * @param string $pattern
+     * @return array
+     */
+    protected function parsePattern($pattern)
+    {
+        $patterns = explode(';', $pattern);
+        if (!isset($patterns[1])) {
+            // No explicit negative pattern was provided, construct it.
+            $patterns[1] = '-' . $patterns[0];
+        }
+        return $patterns;
+    }
+
+    /**
+     * Formats a given number or percent value (if $value starts or ends with a %)
+     *
+     * @param string|int|float $value
+     * @param int $maximumFractionDigits
+     * @param int $minimumFractionDigits
+     * @return mixed|string
+     */
+    public function format($value, $maximumFractionDigits=0, $minimumFractionDigits=0)
+    {
+        if (trim($value, '%') != $value) {
+            return $this->formatPercent($value);
+        }
+
+        return $this->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits);
+    }
+
+    /**
+     * Formats a given number
+     *
+     * @see \Piwik\NumberFormatter::format()
+     *
+     * @param string|int|float $value
+     * @param int $maximumFractionDigits
+     * @param int $minimumFractionDigits
+     * @return mixed|string
+     */
+    public function formatNumber($value, $maximumFractionDigits=0, $minimumFractionDigits=0)
+    {
+
+        static $positivePattern, $negativePattern;
+
+        if (empty($positivePatter) || empty($negativePattern)) {
+            list($positivePattern, $negativePattern) = $this->parsePattern($this->patternNumber);
+        }
+        $negative = $this->isNegative($value);
+        $pattern = $negative ? $negativePattern : $positivePattern;
+
+        return $this->formatNumberWithPattern($pattern, $value, $maximumFractionDigits, $minimumFractionDigits);
+    }
+
+    /**
+     * Formats given number as percent value
+     * @param string|int|float $value
+     * @param int $maximumFractionDigits
+     * @param int $minimumFractionDigits
+     * @return mixed|string
+     */
+    public function formatPercent($value, $maximumFractionDigits=0, $minimumFractionDigits=0)
+    {
+        static $positivePattern, $negativePattern;
+
+        if (empty($positivePatter) || empty($negativePattern)) {
+            list($positivePattern, $negativePattern) = $this->parsePattern($this->patternPercent);
+        }
+
+        $newValue =  trim($value, " \0\x0B%");
+        if (!is_numeric($newValue)) {
+            return $value;
+        }
+
+        $negative = $this->isNegative($value);
+        $pattern = $negative ? $negativePattern : $positivePattern;
+
+        return $this->formatNumberWithPattern($pattern, $newValue, $maximumFractionDigits, $minimumFractionDigits);
+    }
+
+
+    /**
+     * Formats given number as percent value, but keep the leading + sign if found
+     *
+     * @param $value
+     * @return string
+     */
+    public function formatPercentEvolution($value)
+    {
+        $isPositiveEvolution = !empty($value) && ($value > 0 || $value[0] == '+');
+
+        $formatted = self::formatPercent($value);
+
+        if($isPositiveEvolution) {
+            return $this->symbolPlus . $formatted;
+        }
+        return $formatted;
+    }
+
+    /**
+     * Formats given number as percent value
+     * @param string|int|float $value
+     * @param string $currency
+     * @param int $precision
+     * @return mixed|string
+     */
+    public function formatCurrency($value, $currency, $precision=2)
+    {
+        static $positivePattern, $negativePattern;
+
+        if (empty($positivePatter) || empty($negativePattern)) {
+            list($positivePattern, $negativePattern) = $this->parsePattern($this->patternCurrency);
+        }
+
+        $newValue =  trim($value, " \0\x0B$currency");
+        if (!is_numeric($newValue)) {
+            return $value;
+        }
+
+        $negative = $this->isNegative($value);
+        $pattern = $negative ? $negativePattern : $positivePattern;
+
+        if ($newValue == round($newValue)) {
+            // if no fraction digits available, don't show any
+            $value = $this->formatNumberWithPattern($pattern, $newValue, 0, 0);
+        } else {
+            // show given count of fraction digits otherwise
+            $value = $this->formatNumberWithPattern($pattern, $newValue, $precision, $precision);
+        }
+
+        return str_replace('¤', $currency, $value);
+    }
+
+    /**
+     * Formats the given number with the given pattern
+     *
+     * @param string $pattern
+     * @param string|int|float $value
+     * @param int $maximumFractionDigits
+     * @param int $minimumFractionDigits
+     * @return mixed|string
+     */
+    protected function formatNumberWithPattern($pattern, $value, $maximumFractionDigits=0, $minimumFractionDigits=0)
+    {
+        if (!is_numeric($value)) {
+            return $value;
+        }
+
+        $this->usesGrouping = (strpos($pattern, ',') !== false);
+        // if pattern has number groups, parse them.
+        if ($this->usesGrouping) {
+            preg_match('/#+0/', $pattern, $primaryGroupMatches);
+            $this->primaryGroupSize = $this->secondaryGroupSize = strlen($primaryGroupMatches[0]);
+            $numberGroups = explode(',', $pattern);
+            // check for distinct secondary group size.
+            if (count($numberGroups) > 2) {
+                $this->secondaryGroupSize = strlen($numberGroups[1]);
+            }
+        }
+
+        // Ensure that the value is positive and has the right number of digits.
+        $negative = $this->isNegative($value);
+        $signMultiplier = $negative ? '-1' : '1';
+        $value = $value / $signMultiplier;
+        $value = round($value, $maximumFractionDigits);
+        // Split the number into major and minor digits.
+        $valueParts = explode('.', $value);
+        $majorDigits = $valueParts[0];
+        // Account for maximumFractionDigits = 0, where the number won't
+        // have a decimal point, and $valueParts[1] won't be set.
+        $minorDigits = isset($valueParts[1]) ? $valueParts[1] : '';
+        if ($this->usesGrouping) {
+            // Reverse the major digits, since they are grouped from the right.
+            $majorDigits = array_reverse(str_split($majorDigits));
+            // Group the major digits.
+            $groups = array();
+            $groups[] = array_splice($majorDigits, 0, $this->primaryGroupSize);
+            while (!empty($majorDigits)) {
+                $groups[] = array_splice($majorDigits, 0, $this->secondaryGroupSize);
+            }
+            // Reverse the groups and the digits inside of them.
+            $groups = array_reverse($groups);
+            foreach ($groups as &$group) {
+                $group = implode(array_reverse($group));
+            }
+            // Reconstruct the major digits.
+            $majorDigits = implode(',', $groups);
+        }
+        if ($minimumFractionDigits < $maximumFractionDigits) {
+            // Strip any trailing zeroes.
+            $minorDigits = rtrim($minorDigits, '0');
+            if (strlen($minorDigits) < $minimumFractionDigits) {
+                // Now there are too few digits, re-add trailing zeroes
+                // until the desired length is reached.
+                $neededZeroes = $minimumFractionDigits - strlen($minorDigits);
+                $minorDigits .= str_repeat('0', $neededZeroes);
+            }
+        }
+        // Assemble the final number and insert it into the pattern.
+        $value = $minorDigits ? $majorDigits . '.' . $minorDigits : $majorDigits;
+        $value = preg_replace('/#(?:[\.,]#+)*0(?:[,\.][0#]+)*/', $value, $pattern);
+        // Localize the number.
+        $value = $this->replaceSymbols($value);
+        return $value;
+    }
+
+
+    /**
+     * Replaces number symbols with their localized equivalents.
+     *
+     * @param string $value The value being formatted.
+     *
+     * @return string
+     *
+     * @see http://cldr.unicode.org/translation/number-symbols
+     */
+    protected function replaceSymbols($value)
+    {
+        $replacements = array(
+            '.' => $this->symbolDecimal,
+            ',' => $this->symbolGroup,
+            '+' => $this->symbolPlus,
+            '-' => $this->symbolMinus,
+            '%' => $this->symbolPercent,
+        );
+        return strtr($value, $replacements);
+    }
+
+    /**
+     * @param $value
+     * @return bool
+     */
+    protected function isNegative($value)
+    {
+        return $value < 0;
+    }
+}
\ No newline at end of file
diff --git a/core/Period.php b/core/Period.php
index 11ddb9c7c215f724d06879a7069edf7826c623df..70a47d29055c8fdb8bc2eacea58780f98fee4da3 100644
--- a/core/Period.php
+++ b/core/Period.php
@@ -9,6 +9,7 @@
 namespace Piwik;
 
 use Piwik\Container\StaticContainer;
+use Piwik\Period\Factory;
 use Piwik\Period\Range;
 use Piwik\Translation\Translator;
 
@@ -104,6 +105,7 @@ abstract class Period
         if (self::isMultiplePeriod($dateString, 'day')) {
             return;
         }
+
         Date::factory($dateString);
     }
 
@@ -277,6 +279,31 @@ abstract class Period
      */
     abstract public function getLocalizedLongString();
 
+    /**
+     * Returns the label of the period type that is one size smaller than this one, or null if
+     * it's the smallest.
+     *
+     * Range periods and other such 'period collections' are not considered as separate from
+     * the value type of the collection. So a range period will return the result of the
+     * subperiod's `getImmediateChildPeriodLabel()` method.
+     *
+     * @ignore
+     * @return string|null
+     */
+    abstract public function getImmediateChildPeriodLabel();
+
+    /**
+     * Returns the label of the period type that is one size bigger than this one, or null
+     * if it's the biggest.
+     *
+     * Range periods and other such 'period collections' are not considered as separate from
+     * the value type of the collection. So a range period will return the result of the
+     * subperiod's `getParentPeriodLabel()` method.
+     *
+     * @ignore
+     */
+    abstract public function getParentPeriodLabel();
+
     /**
      * Returns the date range string comprising two dates
      *
@@ -290,7 +317,6 @@ abstract class Period
         return $dateStart->toString("Y-m-d") . "," . $dateEnd->toString("Y-m-d");
     }
 
-
     /**
      * @param string $format
      *
@@ -352,4 +378,33 @@ abstract class Period
                 $maxDifference
             ));
     }
+
+    /**
+     * Returns all child periods that exist within this periods entire date range. Cascades
+     * downwards over all period types that are smaller than this one. For example, month periods
+     * will cascade to week and day periods and year periods will cascade to month, week and day
+     * periods.
+     *
+     * The method will not return periods that are outside the range of this period.
+     *
+     * @return Period[]
+     * @ignore
+     */
+    public function getAllOverlappingChildPeriods()
+    {
+        return $this->getAllOverlappingChildPeriodsInRange($this->getDateStart(), $this->getDateEnd());
+    }
+
+    private function getAllOverlappingChildPeriodsInRange(Date $dateStart, Date $dateEnd)
+    {
+        $result = array();
+
+        $childPeriodType = $this->getImmediateChildPeriodLabel();
+        if (empty($childPeriodType)) {
+            return $result;
+        }
+
+        $childPeriods = Factory::build($childPeriodType, $dateStart->toString() . ',' . $dateEnd->toString());
+        return array_merge($childPeriods->getSubperiods(), $childPeriods->getAllOverlappingChildPeriodsInRange($dateStart, $dateEnd));
+    }
 }
diff --git a/core/Period/Day.php b/core/Period/Day.php
index 4ce864df8a73d7ed65eb8081040a7dc0a887a665..108d42e277f9fa9e03beb31ef4137da1e8e3e0ab 100644
--- a/core/Period/Day.php
+++ b/core/Period/Day.php
@@ -16,6 +16,8 @@ use Piwik\Period;
  */
 class Day extends Period
 {
+    const PERIOD_ID = 1;
+
     protected $label = 'day';
 
     /**
@@ -98,4 +100,14 @@ class Day extends Period
     {
         return $this->toString();
     }
+
+    public function getImmediateChildPeriodLabel()
+    {
+        return null;
+    }
+
+    public function getParentPeriodLabel()
+    {
+        return 'week';
+    }
 }
diff --git a/core/Period/Month.php b/core/Period/Month.php
index 4c779e48537b9c7bfa2a33ac19afab995eba7bbd..7a52bd06f8096e849cf83e53e356ed567b1e9327 100644
--- a/core/Period/Month.php
+++ b/core/Period/Month.php
@@ -15,6 +15,8 @@ use Piwik\Period;
  */
 class Month extends Period
 {
+    const PERIOD_ID = 3;
+
     protected $label = 'month';
 
     /**
@@ -111,4 +113,14 @@ class Month extends Period
             $startDate = $startDate->addDay(1);
         }
     }
+
+    public function getImmediateChildPeriodLabel()
+    {
+        return 'week';
+    }
+
+    public function getParentPeriodLabel()
+    {
+        return 'year';
+    }
 }
diff --git a/core/Period/Range.php b/core/Period/Range.php
index 1dff3f56ae0b9d1b6860f2255b1461b4a83ebe30..7073ad2c16f4c7bc759d4b887592a2484a3062b1 100644
--- a/core/Period/Range.php
+++ b/core/Period/Range.php
@@ -30,6 +30,8 @@ use Piwik\Period;
  */
 class Range extends Period
 {
+    const PERIOD_ID = 5;
+
     protected $label = 'range';
     protected $today;
 
@@ -512,4 +514,15 @@ class Range extends Period
 
         return $dateStart->toString("Y-m-d") . "," . $dateEnd->toString("Y-m-d");
     }
+
+    public function getImmediateChildPeriodLabel()
+    {
+        $subperiods = $this->getSubperiods();
+        return reset($subperiods)->getImmediateChildPeriodLabel();
+    }
+
+    public function getParentPeriodLabel()
+    {
+        return null;
+    }
 }
diff --git a/core/Period/Week.php b/core/Period/Week.php
index d2724694dda48965f28107a60e3c0aa4ec68b8f7..0029855a3ce58579087540da72ebc49b6f4ec2f8 100644
--- a/core/Period/Week.php
+++ b/core/Period/Week.php
@@ -14,6 +14,8 @@ use Piwik\Period;
  */
 class Week extends Period
 {
+    const PERIOD_ID = 2;
+
     protected $label = 'week';
 
     /**
@@ -76,4 +78,14 @@ class Week extends Period
             $currentDay = $currentDay->addDay(1);
         }
     }
+
+    public function getImmediateChildPeriodLabel()
+    {
+        return 'day';
+    }
+
+    public function getParentPeriodLabel()
+    {
+        return 'month';
+    }
 }
diff --git a/core/Period/Year.php b/core/Period/Year.php
index cfda052bf575c98a8a7cc9f06052fa272a6e0154..208c6bbfac1858de4fcb63fb0540634b76b97ae2 100644
--- a/core/Period/Year.php
+++ b/core/Period/Year.php
@@ -15,6 +15,8 @@ use Piwik\Period;
  */
 class Year extends Period
 {
+    const PERIOD_ID = 4;
+
     protected $label = 'year';
 
     /**
@@ -87,4 +89,14 @@ class Year extends Period
 
         return $stringMonth;
     }
+
+    public function getImmediateChildPeriodLabel()
+    {
+        return 'month';
+    }
+
+    public function getParentPeriodLabel()
+    {
+        return null;
+    }
 }
diff --git a/core/Piwik.php b/core/Piwik.php
index 5ad50713834ca6428a4c5a3e5872ba6189caf241..9545cff6c8e260c58a2c10cc8ac0e36599e66e59 100644
--- a/core/Piwik.php
+++ b/core/Piwik.php
@@ -10,6 +10,11 @@ namespace Piwik;
 
 use Exception;
 use Piwik\Container\StaticContainer;
+use Piwik\Period\Day;
+use Piwik\Period\Month;
+use Piwik\Period\Range;
+use Piwik\Period\Week;
+use Piwik\Period\Year;
 use Piwik\Plugins\UsersManager\API as APIUsersManager;
 use Piwik\Translation\Translator;
 
@@ -31,11 +36,11 @@ class Piwik
      * @var array
      */
     public static $idPeriods = array(
-        'day'   => 1,
-        'week'  => 2,
-        'month' => 3,
-        'year'  => 4,
-        'range' => 5,
+        'day'   => Day::PERIOD_ID,
+        'week'  => Week::PERIOD_ID,
+        'month' => Month::PERIOD_ID,
+        'year'  => Year::PERIOD_ID,
+        'range' => Range::PERIOD_ID,
     );
 
     /**
diff --git a/core/Plugin/Controller.php b/core/Plugin/Controller.php
index 93f1b59195c5ea0c7f0407b68b8213a9f88884cd..e4c9380e2d5115c9ab39e9cd6008091818b60af0 100644
--- a/core/Plugin/Controller.php
+++ b/core/Plugin/Controller.php
@@ -15,7 +15,6 @@ use Piwik\API\Request;
 use Piwik\Common;
 use Piwik\Config as PiwikConfig;
 use Piwik\Config;
-use Piwik\Container\StaticContainer;
 use Piwik\DataTable\Filter\CalculateEvolutionFilter;
 use Piwik\Date;
 use Piwik\Exception\NoPrivilegesException;
@@ -25,6 +24,7 @@ use Piwik\Menu\MenuTop;
 use Piwik\Menu\MenuUser;
 use Piwik\NoAccessException;
 use Piwik\Notification\Manager as NotificationManager;
+use Piwik\NumberFormatter;
 use Piwik\Period\Month;
 use Piwik\Period;
 use Piwik\Period\PeriodValidator;
@@ -667,8 +667,6 @@ abstract class Controller
      *
      * The following variables assigned:
      *
-     * **enableMeasurePiwikForSiteId** - The value of the `[Debug] enable_measure_piwik_usage_in_idsite`
-     *                                     INI config option.
      * **isSuperUser** - True if the current user is the Super User, false if otherwise.
      * **hasSomeAdminAccess** - True if the current user has admin access to at least one site,
      *                          false if otherwise.
@@ -688,7 +686,6 @@ abstract class Controller
     protected function setBasicVariablesView($view)
     {
         $view->clientSideConfig = PiwikConfig::getInstance()->getClientSideOptions();
-        $view->enableMeasurePiwikForSiteId = PiwikConfig::getInstance()->Debug['enable_measure_piwik_usage_in_idsite'];
         $view->isSuperUser = Access::getInstance()->hasSuperUserAccess();
         $view->hasSomeAdminAccess = Piwik::isUserHasSomeAdminAccess();
         $view->hasSomeViewAccess  = Piwik::isUserHasSomeViewAccess();
diff --git a/core/ReportRenderer/Pdf.php b/core/ReportRenderer/Pdf.php
index 0c4fb2f6a33e625dfc6ebc6c01979042527d36bb..59fb862650ff32f6bd4dc48aec76322d04ffb3ff 100644
--- a/core/ReportRenderer/Pdf.php
+++ b/core/ReportRenderer/Pdf.php
@@ -10,6 +10,7 @@ namespace Piwik\ReportRenderer;
 
 use Piwik\Common;
 use Piwik\Filesystem;
+use Piwik\NumberFormatter;
 use Piwik\Piwik;
 use Piwik\Plugins\API\API;
 use Piwik\ReportRenderer;
@@ -405,7 +406,7 @@ class Pdf extends ReportRenderer
                     if (empty($rowMetrics[$columnId])) {
                         $rowMetrics[$columnId] = 0;
                     }
-                    $this->TCPDF->Cell($this->cellWidth, $this->cellHeight, $rowMetrics[$columnId], 'LR', 0, 'L', $fill);
+                    $this->TCPDF->Cell($this->cellWidth, $this->cellHeight, NumberFormatter::getInstance()->format($rowMetrics[$columnId]), 'LR', 0, 'L', $fill);
                 }
             }
 
diff --git a/core/Singleton.php b/core/Singleton.php
index cde63cb744916a4eb560c3d1b24ab4587614ff8c..46e3c531d7e6f93b6bd56471f08ce16dba64040f 100644
--- a/core/Singleton.php
+++ b/core/Singleton.php
@@ -32,7 +32,7 @@ class Singleton
      * Returns the singleton instance for the derived class. If the singleton instance
      * has not been created, this method will create it.
      *
-     * @return Singleton
+     * @return static
      */
     public static function getInstance()
     {
diff --git a/core/Tracker/TableLogAction/Cache.php b/core/Tracker/TableLogAction/Cache.php
index 598fae96400f116e1299046086ea6f74e675930a..ba078c570d6b43d8efba17b4599441607f6cc607 100644
--- a/core/Tracker/TableLogAction/Cache.php
+++ b/core/Tracker/TableLogAction/Cache.php
@@ -11,7 +11,6 @@ namespace Piwik\Tracker\TableLogAction;
 
 use Piwik\Common;
 use Piwik\Config;
-use Piwik\Container\StaticContainer;
 use Psr\Log\LoggerInterface;
 
 class Cache
@@ -32,19 +31,17 @@ class Cache
     private $logger;
 
     /**
-     * for tests
-     *
-     * @var int
+     * @var \Piwik\Cache\Lazy
      */
-    static public $hits = 0;
+    private $cache;
 
-    public function __construct($logger = null, $config = null)
+    public function __construct(LoggerInterface $logger, Config $config, \Piwik\Cache\Lazy $cache)
     {
-        $config = $config ?: Config::getInstance();
         $this->isEnabled = (bool)$config->General['enable_segments_subquery_cache'];
         $this->limitActionIds = $config->General['segments_subquery_cache_limit'];
         $this->lifetime = $config->General['segments_subquery_cache_ttl'];
-        $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
+        $this->logger = $logger;
+        $this->cache = $cache;
     }
 
     /**
@@ -96,24 +93,22 @@ class Cache
      */
     private function getIdsFromCache($valueToMatch, $sql)
     {
-        $cache = $this->buildCache();
         $cacheKey = $this->getCacheKey($valueToMatch, $sql);
 
-        if ($cache->contains($cacheKey) === true) {
-            self::$hits++;
+        if ($this->cache->contains($cacheKey) === true) { // TODO: hits
             $this->logger->debug("Segment subquery cache HIT (for '$valueToMatch' and SQL '$sql)");
-            return $cache->fetch($cacheKey);
+            return $this->cache->fetch($cacheKey);
         }
 
         $ids = $this->fetchActionIdsFromDb($valueToMatch, $sql);
 
         if($this->isTooBigToCache($ids)) {
             $this->logger->debug("Segment subquery cache SKIPPED SAVE (too many IDs returned by subquery: %s ids)'", array(count($ids)));
-            $cache->save($cacheKey, $ids = null, $this->lifetime);
+            $this->cache->save($cacheKey, $ids = null, $this->lifetime);
             return null;
         }
 
-        $cache->save($cacheKey, $ids, $this->lifetime);
+        $this->cache->save($cacheKey, $ids, $this->lifetime);
         $this->logger->debug("Segment subquery cache SAVE (for '$valueToMatch' and SQL '$sql')'");
 
         return $ids;
@@ -154,14 +149,6 @@ class Cache
         return $ids;
     }
 
-    /**
-     * @return \Piwik\Cache\Lazy
-     */
-    private function buildCache()
-    {
-        return \Piwik\Cache::getLazyCache();
-    }
-
     /**
      * @param $ids
      * @return bool
diff --git a/core/Tracker/Visit.php b/core/Tracker/Visit.php
index fc11d0cc3f80c62ea858e88e2ae6b4ca8a88c667..84b702449e0b0083320e5b3bad74340ca8c4531f 100644
--- a/core/Tracker/Visit.php
+++ b/core/Tracker/Visit.php
@@ -69,12 +69,18 @@ class Visit implements VisitInterface
      */
     private $visitorRecognizer;
 
+    /**
+     * @var ArchiveInvalidator
+     */
+    private $invalidator;
+
     public function __construct()
     {
         $this->requestProcessors = StaticContainer::get('tracker.request.processors');
         $this->visitorRecognizer = StaticContainer::get('Piwik\Tracker\VisitorRecognizer');
         $this->visitProperties = null;
         $this->userSettings = StaticContainer::get('Piwik\Tracker\Settings');
+        $this->invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
     }
 
     /**
@@ -566,8 +572,7 @@ class Visit implements VisitInterface
         $date = Date::factory((int)$time, $timezone);
 
         if (!$date->isToday()) { // we don't have to handle in case date is in future as it is not allowed by tracker
-            $invalidReport = new ArchiveInvalidator();
-            $invalidReport->rememberToInvalidateArchivedReportsLater($idSite, $date);
+            $this->invalidator->rememberToInvalidateArchivedReportsLater($idSite, $date);
         }
     }
 
diff --git a/core/Twig.php b/core/Twig.php
index 09720eefddc4cb87076ece561e9232840730b0ca..c806dcf9bb516a9c30acc0b1d7db436e8ad0fe2d 100755
--- a/core/Twig.php
+++ b/core/Twig.php
@@ -12,6 +12,7 @@ use Exception;
 use Piwik\Container\StaticContainer;
 use Piwik\DataTable\Filter\SafeDecodeLabel;
 use Piwik\Metrics\Formatter;
+use Piwik\Tracker\GoalManager;
 use Piwik\View\RenderTokenParser;
 use Piwik\Visualization\Sparkline;
 use Twig_Environment;
@@ -84,8 +85,11 @@ class Twig
         $this->addFilter_truncate();
         $this->addFilter_notification();
         $this->addFilter_percentage();
+        $this->addFilter_percent();
+        $this->addFilter_percentEvolution();
         $this->addFilter_prettyDate();
         $this->addFilter_safeDecodeRaw();
+        $this->addFilter_number();
         $this->twig->addFilter(new Twig_SimpleFilter('implode', 'implode'));
         $this->twig->addFilter(new Twig_SimpleFilter('ucwords', 'ucwords'));
         $this->twig->addFilter(new Twig_SimpleFilter('lcfirst', 'lcfirst'));
@@ -272,11 +276,39 @@ class Twig
     protected function addFilter_percentage()
     {
         $percentage = new Twig_SimpleFilter('percentage', function ($string, $totalValue, $precision = 1) {
-            return Piwik::getPercentageSafe($string, $totalValue, $precision) . '%';
+            return NumberFormatter::getInstance()->formatPercent(Piwik::getPercentageSafe($string, $totalValue, $precision), $precision);
         });
         $this->twig->addFilter($percentage);
     }
 
+    protected function addFilter_percent()
+    {
+        $percentage = new Twig_SimpleFilter('percent', function ($string, $precision = 1) {
+            return NumberFormatter::getInstance()->formatPercent($string, $precision);
+        });
+        $this->twig->addFilter($percentage);
+    }
+
+    protected function addFilter_percentEvolution()
+    {
+        $percentage = new Twig_SimpleFilter('percentEvolution', function ($string) {
+            return NumberFormatter::getInstance()->formatPercentEvolution($string);
+        });
+        $this->twig->addFilter($percentage);
+    }
+
+    protected function addFilter_number()
+    {
+        $formatter = new Twig_SimpleFilter('number', function ($string, $minFractionDigits = 0, $maxFractionDigits = 0) {
+            // if a leading/trailing percent sign is found, format as percent number
+            if ($string != trim($string, '%')) {
+                return NumberFormatter::getInstance()->formatPercent($string, $minFractionDigits, $maxFractionDigits);
+            }
+            return NumberFormatter::getInstance()->format($string, $minFractionDigits, $maxFractionDigits);
+        });
+        $this->twig->addFilter($formatter);
+    }
+
     protected function addFilter_truncate()
     {
         $truncateFilter = new Twig_SimpleFilter('truncate', function ($string, $size) {
@@ -299,7 +331,8 @@ class Twig
             }
             $idSite = func_get_args();
             $idSite = $idSite[1];
-            return $formatter->getPrettyMoney($amount, $idSite);
+            $currencySymbol = Formatter::getCurrencySymbol($idSite);
+            return NumberFormatter::getInstance()->formatCurrency($amount, $currencySymbol, GoalManager::REVENUE_PRECISION);
         });
         $this->twig->addFilter($moneyFilter);
     }
diff --git a/core/Updates/2.15.0-b16.php b/core/Updates/2.15.0-b16.php
new file mode 100644
index 0000000000000000000000000000000000000000..a37e621129ede6856d45c1d846eec8727fe3f70f
--- /dev/null
+++ b/core/Updates/2.15.0-b16.php
@@ -0,0 +1,45 @@
+<?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\Updates;
+
+use Piwik\Plugin\Manager;
+use Piwik\Updater;
+use Piwik\Updates;
+
+class Updates_2_15_0_b16 extends Updates
+{
+
+    public function doUpdate(Updater $updater)
+    {
+        $this->uninstallPlugin('LeftMenu');
+        $this->uninstallPlugin('ZenMode');
+    }
+
+    private function uninstallPlugin($plugin)
+    {
+        $pluginManager = Manager::getInstance();
+
+        if ($pluginManager->isPluginInstalled($plugin)) {
+            if ($pluginManager->isPluginActivated($plugin)) {
+                $pluginManager->deactivatePlugin($plugin);
+            }
+
+            $pluginManager->unloadPlugin($plugin);
+            $pluginManager->uninstallPlugin($plugin);
+        } else {
+            $this->makeSurePluginIsRemovedFromFilesystem($plugin);
+        }
+    }
+
+    private function makeSurePluginIsRemovedFromFilesystem($plugin)
+    {
+        Manager::deletePluginFromFilesystem($plugin);
+    }
+}
diff --git a/core/Updates/2.15.0-b17.php b/core/Updates/2.15.0-b17.php
new file mode 100644
index 0000000000000000000000000000000000000000..86e3decf20105fd67f76c166d9bfe1bab651979f
--- /dev/null
+++ b/core/Updates/2.15.0-b17.php
@@ -0,0 +1,44 @@
+<?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\Updates;
+
+use Piwik\Config;
+use Piwik\Updater;
+use Piwik\Updates;
+
+/**
+ * Update for version 2.15.0-b17.
+ */
+class Updates_2_15_0_b17 extends Updates
+{
+    /**
+     * Perform the incremental version update.
+     *
+     * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()`
+     * method, you must call {@link Updater::executeMigrationQueries()} here.
+     *
+     * See {@link Updates} for an example.
+     *
+     * @param Updater $updater
+     */
+    public function doUpdate(Updater $updater)
+    {
+        $this->removeDeprecatedDebugConfig('enable_measure_piwik_usage_in_idsite');
+    }
+
+    private function removeDeprecatedDebugConfig($name)
+    {
+        $config = Config::getInstance();
+        $debug = $config->Debug;
+        unset($debug[$name]);
+        $config->Debug = $debug;
+        $config->forceSave();
+    }
+}
diff --git a/core/Updates/2.15.0-b20.php b/core/Updates/2.15.0-b20.php
new file mode 100644
index 0000000000000000000000000000000000000000..79b4703f1b201751d47f791305b7e4e620ca11e5
--- /dev/null
+++ b/core/Updates/2.15.0-b20.php
@@ -0,0 +1,42 @@
+<?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\Updates;
+
+use Piwik\Plugin;
+use Piwik\Updater;
+use Piwik\Updates;
+
+/**
+ * Update for version 2.15.0-b20.
+ */
+class Updates_2_15_0_b20 extends Updates
+{
+
+    /**
+     * Perform the incremental version update.
+     *
+     * This method should preform all updating logic. If you define queries in an overridden `getMigrationQueries()`
+     * method, you must call {@link Updater::executeMigrationQueries()} here.
+     *
+     * See {@link Updates} for an example.
+     *
+     * @param Updater $updater
+     */
+    public function doUpdate(Updater $updater)
+    {
+        $this->makeSurePluginIsRemovedFromFilesystem('ZenMode');
+        $this->makeSurePluginIsRemovedFromFilesystem('LeftMenu');
+    }
+
+    private function makeSurePluginIsRemovedFromFilesystem($plugin)
+    {
+        Plugin\Manager::deletePluginFromFilesystem($plugin);
+    }
+}
diff --git a/core/View/UIControl.php b/core/View/UIControl.php
index 845d0f9d6ae72fb08c0fe82d9ce1d76d8511cc58..dc5bca1279857c897deb18c981dd1c18a9419e06 100644
--- a/core/View/UIControl.php
+++ b/core/View/UIControl.php
@@ -59,6 +59,13 @@ class UIControl extends \Piwik\View
      */
     public $cssClass = "";
 
+    /**
+     * HTML Attributes for the root element
+     *
+     * @var string
+     */
+    public $htmlAttributes = array();
+
     /**
      * The inner view that renders the actual control content.
      *
@@ -125,6 +132,7 @@ class UIControl extends \Piwik\View
         $this->templateVars['cssIdentifier'] = $this->cssIdentifier;
         $this->templateVars['cssClass'] = $this->cssClass;
         $this->templateVars['jsClass'] = $this->jsClass;
+        $this->templateVars['htmlAttributes'] = $this->htmlAttributes;
         $this->templateVars['jsNamespace'] = $this->jsNamespace;
         $this->templateVars['implOverride'] = $override;
 
diff --git a/lang/ar.json b/lang/ar.json
index f377dc92b49539163a95f3260e7d338a538d26ef..ad887566338065ba4786427fb099a81bb5f446d4 100644
--- a/lang/ar.json
+++ b/lang/ar.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "لوحة التحكم لكافة المواقع",
         "And": "Ùˆ",
         "API": "واجهة تحكم التطبيقات",
-        "ApplyDateRange": "تطبيق مدى التاريخ",
         "ArchivingInlineHelp": "للمواقع المتوسطة وعالية الزيارات، من المفضل تعطيل إطلاق الأرشفة من المتصفح. بدلاً من ذلك، فنحن نفضل ضبط Cron job لمعالجة Piwik كل ساعة.",
         "ArchivingTriggerDescription": "مفضل في حالة مواقع Piwik الكبيرة أن تقوم %sبضبط وظيفة %s لمعالجة التقارير آلياً.",
         "AuthenticationMethodSmtp": "أسلوب المصادقة لمزود SMTP",
@@ -241,7 +240,6 @@
         "Widgets": "الإضافات",
         "YearsDays": "%1$s سنة %2$s أيام",
         "Yes": "نعم",
-        "YouAreViewingDemoShortMessage": "أنت تشاهد حالياً نسخة عرض من Piwik",
         "YouMustBeLoggedIn": "يجب عليك تسجيل الدخول للوصول إلى هذه الخاصية.",
         "YourChangesHaveBeenSaved": "تم حفظ التغييرات."
     },
diff --git a/lang/be.json b/lang/be.json
index a23a909c7b8185a5d2219d7d1c92bc34e1fd633f..3db0b9931d2ae70b1ea11bfe1d5cd3c7e6ae22fa 100644
--- a/lang/be.json
+++ b/lang/be.json
@@ -7,7 +7,6 @@
         "AfterEntry": "пасля ўваходны тут",
         "AllWebsitesDashboard": "Галоўная панэль ўсіх вэб-сайтаў",
         "API": "API-функцыі",
-        "ApplyDateRange": "Прымяніце дыяпазон дат",
         "ArchivingInlineHelp": "Для сайтаў з сярэднім і высокім трафікам, рэкамендуецца адключыць функцыю архівавання Piwik для запуску з браўзэра.",
         "ArchivingTriggerDescription": "Рэкамендуецца для Piwik на сайтах з высокім трафікам, патрэбна %sўсталяваць заданне для крону%s для аўтаматычнай апрацоўкі справаздач.",
         "AuthenticationMethodSmtp": "Метад праверкі сапраўднасці для SMTP",
@@ -261,7 +260,6 @@
         "Widgets": "Віджэты",
         "YearsDays": "%1$s гадоў %2$s дзён",
         "Yes": "Так",
-        "YouAreViewingDemoShortMessage": "Вы праглядаеце дэма версію Piwik",
         "YouMustBeLoggedIn": "Каб атрымаць доступ да гэтай функцыянальнасці, Вы павінны аўтарызавацца.",
         "YourChangesHaveBeenSaved": "Вашы змены былі захаваныя."
     }
diff --git a/lang/bg.json b/lang/bg.json
index 854afef7f40bb09e702e643f5dcd08463a4b1353..30ad48d1cc53db9f00a2dff0ab1ef9c04965f769 100644
--- a/lang/bg.json
+++ b/lang/bg.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Табло за всички сайтове",
         "And": "и",
         "API": "API",
-        "ApplyDateRange": "Прилагане на периода от време",
         "ArchivingInlineHelp": "За сайтовете със среден или висок трафик, препоръчваме да изключите Piwik архивиране след гледане от браузър. Съветваме ви в този случай да използвате cron job за Вашите доклади на всеки час.",
         "ArchivingTriggerDescription": "За по-големи Piwik инсталации, се препоръчва %scron job%s за автоматични доклади.",
         "AuthenticationMethodSmtp": "Удостоверен метод за SMTP",
@@ -388,7 +387,6 @@
         "YearsDays": "%1$s години %2$s дни",
         "Yes": "Да",
         "YouAreCurrentlyUsing": "Вие използвате Piwik %s.",
-        "YouAreViewingDemoShortMessage": "В момента Вие разглеждате демо версия на Piwik",
         "YouMustBeLoggedIn": "Трябва да сте влязъл, за да имате достъп до тази функционалност.",
         "YourChangesHaveBeenSaved": "Промените бяха запазени."
     },
diff --git a/lang/bs.json b/lang/bs.json
index e4c3bed4a1832e52b59e01824002dad4859e6843..a37d3a5716dd05a8865d3bdd13b2da488c5284a7 100644
--- a/lang/bs.json
+++ b/lang/bs.json
@@ -9,7 +9,6 @@
         "AllWebsitesDashboard": "Kontrolne ploče svih web stranica",
         "And": "i",
         "API": "API",
-        "ApplyDateRange": "Prihvati raspon datuma",
         "ArchivingInlineHelp": "Za web stranice koje imaju veću posjećenost preporučeno je isključiti Piwik arhiviranje pokretača iz browsera. Umjesto toga, preporučujemo cron job koji se procesira svaki sat.",
         "ArchivingTriggerDescription": "Preporučeno za veće Piwik instalacije, moraš %s postaviti cron job%s da procesiras reporte automatski.",
         "AuthenticationMethodSmtp": "Metoda provjere za SMTP",
@@ -308,7 +307,6 @@
         "YearsDays": "%1$s godine %2$s dani",
         "Yes": "Da",
         "YouAreCurrentlyUsing": "Trenutno koristite piwik %s.",
-        "YouAreViewingDemoShortMessage": "Trenutno pregledate demo veziju Piwik-a",
         "YouMustBeLoggedIn": "Moras biti ulogovan za ovu funkciju.",
         "YourChangesHaveBeenSaved": "Vaše promjene su sačuvane."
     }
diff --git a/lang/ca.json b/lang/ca.json
index 27d2d5b9424b7655e4c17d533737a41042ae384d..12dd727763d22c7f5ef507c216e423fa9d59fe25 100644
--- a/lang/ca.json
+++ b/lang/ca.json
@@ -9,7 +9,6 @@
         "All": "Tots",
         "AllWebsitesDashboard": "Tauler de tots els llocs web",
         "API": "API",
-        "ApplyDateRange": "Aplicar un rang de dates",
         "ArchivingInlineHelp": "Per llocs amb transit entre mig i alt, es recomana desactivar l'arxivat del Piwik des del navegador. En canvi, recomanem que configureu una tasca de cron per processar els informes de Piwik cada hora.",
         "ArchivingTriggerDescription": "Recomanat per instal·lacions grans de Piwik, es pot %sconfigurar una %stasca programada per processar les entrades automàticament.",
         "AuthenticationMethodSmtp": "Mètode d'autenticació SMTP",
@@ -347,7 +346,6 @@
         "YearsDays": "%1$s anys %2$s dies",
         "Yes": "Sí",
         "YouAreCurrentlyUsing": "Ara mateix estàs fent servir el Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Ara mateix estàs veient la demo del Piwik",
         "YouMustBeLoggedIn": "Has d'entrar per accedir a aquesta funcionalitat.",
         "YourChangesHaveBeenSaved": "Els vostres canvis s'han guardat"
     },
diff --git a/lang/cs.json b/lang/cs.json
index 1f9650744389a386bbce029a6fe41ad1e561e3c3..9d274d13b0a4bf47e7477bd010ea71a27ce37f88 100644
--- a/lang/cs.json
+++ b/lang/cs.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Nástěnka pro všechny weby",
         "And": "a",
         "API": "API",
-        "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",
@@ -402,7 +401,6 @@
         "YearsDays": "%1$s roků %2$s dní",
         "Yes": "Ano",
         "YouAreCurrentlyUsing": "Používáte Piwik verze %s.",
-        "YouAreViewingDemoShortMessage": "Právě si prohlížíte demoverzi Piwiku",
         "YouMustBeLoggedIn": "Abyste mohli využívat tyto funkce musíte být přihlášeni",
         "YourChangesHaveBeenSaved": "Vaše změny byly uloženy"
     },
diff --git a/lang/da.json b/lang/da.json
index d7c3f1029e8614d6d1ad260afcee2460a5e1fffc..49c70c5019bffe72b3a1e0dd16b72321013471b1 100644
--- a/lang/da.json
+++ b/lang/da.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Kontrolpanel for alle hjemmesider",
         "And": "og",
         "API": "API",
-        "ApplyDateRange": "Anvend datointerval",
         "ArchivingInlineHelp": "For hjemmesider med medium til høj trafik anbefales det at deaktivere Piwik-arkivering udløst fra browseren. I stedet anbefales det at køre et cron job hver time til at behandle Piwik rapporter.",
         "ArchivingTriggerDescription": "Til større Piwik installationer anbefales det, at %soprette et cron job%s til at behandle rapporterne automatisk.",
         "AuthenticationMethodSmtp": "Godkenselsesmetode til SMTP",
@@ -389,7 +388,6 @@
         "YearsDays": "%1$s år %2$s dage",
         "Yes": "Ja",
         "YouAreCurrentlyUsing": "Du bruger i øjeblikket Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Du bruger en demo version af Piwik",
         "YouMustBeLoggedIn": "Du skal være logget på for at få adgang til denne funktion.",
         "YourChangesHaveBeenSaved": "Ændringer er gemt."
     },
diff --git a/lang/de.json b/lang/de.json
index a4be0d4224ef87e94de246f69c9360a743c71cf8..25650ebf009fb9735de6d98c45ee3d3aa4e2e302 100644
--- a/lang/de.json
+++ b/lang/de.json
@@ -11,7 +11,7 @@
         "AllWebsitesDashboard": "Dashboard aller Websites",
         "And": "und",
         "API": "API",
-        "ApplyDateRange": "Zeitraum anwenden",
+        "Apply": "Anwenden",
         "ArchivingInlineHelp": "Für Websites mit mittlerem bis hohem Verkehrsaufkommen wird empfohlen, die durch den Browser ausgelöste Archivierung zu deaktivieren. Stattdessen wird empfohlen, dass Sie einen Cronjob aufsetzen, der die Berichte einmal pro Stunde abarbeitet.",
         "ArchivingTriggerDescription": "Für größere Piwik-Installationen sollten Sie %seinen Cronjob erstellen%s, der die Berichte automatisch abarbeitet.",
         "AuthenticationMethodSmtp": "Authentifizierungsmethode für SMTP",
diff --git a/lang/el.json b/lang/el.json
index 23819d344f27a97da2dacb896fc9607d91073831..2fac12eb087a90bb2e829b1f47f873508b16eea7 100644
--- a/lang/el.json
+++ b/lang/el.json
@@ -11,7 +11,7 @@
         "AllWebsitesDashboard": "Κεντρικός πίνακας όλων των ιστοσελίδων",
         "And": "και",
         "API": "API",
-        "ApplyDateRange": "Εφαρμογή Χρονικού Εύρους",
+        "Apply": "Εφαρμογή",
         "ArchivingInlineHelp": "Για μεσαίας ή μεγάλης επισκεψιμότητας ιστοσελίδες, προτείνεται να απενεργοποιήσετε την αρχειοθέτηση από τον φυλλομετρητή. Αντί για αυτό, σας προτείνουμε να εγκαταστήσετε μια εργασία cron για να δημιουργείτε αναφορές Piwik κάθε ώρα.",
         "ArchivingTriggerDescription": "Συνιστάται για μεγάλες εγκαταστάσεις του Piwik. Χρειάζεται να %sεγκαταστήσετε μια εργασία cron%s για να δημιουργείτε τις αναφορές αυτόματα.",
         "AuthenticationMethodSmtp": "Μέθοδος πιστοποίησης SMTP",
@@ -402,7 +402,7 @@
         "YearsDays": "%1$s έτη %2$s ημέρες",
         "Yes": "Ναι",
         "YouAreCurrentlyUsing": "Χρησιμοποιείτε την έκδοση %s του Piwik.",
-        "YouAreViewingDemoShortMessage": "Τώρα βλέπετε τη δοκιμή του Piwik",
+        "YouAreViewingDemoShortMessage": "Βλέπετε μια έκδοση του Piwik σε κατάστασης παρουσίασης",
         "YouMustBeLoggedIn": "Πρέπει να συνδεθείτε για να έχετε πρόσβαση στη λειτουργία",
         "YourChangesHaveBeenSaved": "Οι αλλαγές σας αποθηκεύτηκαν."
     },
diff --git a/lang/en.json b/lang/en.json
index 5cdeef30a828c5b1441bf49197060475c386bd20..a3da13491cc75d491ea25ceb3bb228d9530a2cef 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -11,7 +11,7 @@
         "AllWebsitesDashboard": "All Websites dashboard",
         "And": "and",
         "API": "API",
-        "ApplyDateRange": "Apply Date Range",
+        "Apply": "Apply",
         "ArchivingInlineHelp": "For medium to high traffic websites, it is recommended to disable Piwik archiving to trigger from the browser. Instead, we recommend that you setup a cron job to process Piwik reports every hour.",
         "ArchivingTriggerDescription": "Recommended for larger Piwik installs, you need to %ssetup a cron job%s to process the reports automatically.",
         "AuthenticationMethodSmtp": "Authentication method for SMTP",
@@ -99,7 +99,7 @@
         "DateRange": "Date range:",
         "DateRangeFrom": "From",
         "DateRangeFromTo": "From %s to %s",
-        "DateRangeInPeriodList": "Date range",
+        "DateRangeInPeriodList": "date range",
         "DateRangeTo": "To",
         "DaysHours": "%1$s days %2$s hours",
         "DaysSinceFirstVisit": "Days since first visit",
@@ -403,7 +403,7 @@
         "YearsDays": "%1$s years %2$s days",
         "Yes": "Yes",
         "YouAreCurrentlyUsing": "You are currently using Piwik %s.",
-        "YouAreViewingDemoShortMessage": "You are currently viewing the demo of Piwik",
+        "YouAreViewingDemoShortMessage": "You are viewing the demo of Piwik",
         "YouMustBeLoggedIn": "You must be logged in to access this functionality.",
         "YourChangesHaveBeenSaved": "Your changes have been saved."
     },
diff --git a/lang/es.json b/lang/es.json
index bf2dcb8fac59bdc35ae4f8e49c6afe5f358d2571..273fae6abec641381411d568f4fe9e01df15b80b 100644
--- a/lang/es.json
+++ b/lang/es.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Panel de todos los sitios de internet",
         "And": "y",
         "API": "API",
-        "ApplyDateRange": "Aplicar el rango de fecha",
         "ArchivingInlineHelp": "Para sitios de internet de medio o alto tráfico, se recomienda deshabilitar el archivado de Piwik al ingresar con el navegador. En su lugar, le recomendamos que configure una tarea cron para procesar los informes de Piwik cada hora.",
         "ArchivingTriggerDescription": "Recomendado para grandes instalaciones de Piwik, necesita %sconfigurar una tarea de cron %s para procesar los reportes automáticamente.",
         "AuthenticationMethodSmtp": "Método de autenticación SMTP",
@@ -399,7 +398,6 @@
         "YearsDays": "%1$s años %2$s días",
         "Yes": "Sí",
         "YouAreCurrentlyUsing": "Actualmente está utilizando Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Actualmente está viendo la demo de Piwik",
         "YouMustBeLoggedIn": "Debe ingresar para acceder a esta funcionalidad.",
         "YourChangesHaveBeenSaved": "Se han guardado los cambios."
     },
diff --git a/lang/et.json b/lang/et.json
index ba75a0591078461bb22089845b869431e149ac40..85ee35982564a52ca94199ab7f37da2b877e9ab2 100644
--- a/lang/et.json
+++ b/lang/et.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Kõigi veebilehtede töölaud",
         "And": "ja",
         "API": "API",
-        "ApplyDateRange": "Rakenda kuupäeva vahemik",
         "AuthenticationMethodSmtp": "SMTP serveri autentimismeetod",
         "AverageOrderValue": "Keskmine tellimuse väärtus",
         "AveragePrice": "Keskmine hind",
@@ -299,7 +298,6 @@
         "YearsDays": "%1$s aastat %2$s päeva",
         "Yes": "Jah",
         "YouAreCurrentlyUsing": "Kasutad hetkel Piwik versiooni %s.",
-        "YouAreViewingDemoShortMessage": "Hetkel asud Piwiku demo keskkonnas",
         "YouMustBeLoggedIn": "Antud funktsionaalsusele ligipääsuks pead olema sisselogitud.",
         "YourChangesHaveBeenSaved": "Sinu muudatused on salvestatud."
     },
diff --git a/lang/eu.json b/lang/eu.json
index 462bc4c60c01a954c6ffc05c0d46e487ab59860c..9991094d534b39d70959afbbeda69e3e318ca354 100644
--- a/lang/eu.json
+++ b/lang/eu.json
@@ -143,7 +143,6 @@
         "Widgets": "Widget-ak",
         "YearsDays": "%1$s urte %2$s egun",
         "Yes": "Bai",
-        "YouAreViewingDemoShortMessage": "Piwiken demoa ikusten ari zara",
         "YouMustBeLoggedIn": "Saioa hasi behar duzu funtzionaltasun hau erabiltzeko.",
         "YourChangesHaveBeenSaved": "Zure aldaketak gorde egin dira."
     }
diff --git a/lang/fa.json b/lang/fa.json
index 886614852c3811a083b961217ef0cbcf39ce520d..9fafc732358209732257e497d6bbfeab0feac04e 100644
--- a/lang/fa.json
+++ b/lang/fa.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "داشبورد همه وبسايت‌ها",
         "And": "Ùˆ",
         "API": "API",
-        "ApplyDateRange": "استفاده از بازه زمانی",
         "ArchivingInlineHelp": "توصیه می‌شود برای وبسایت‌های با ترافیک متوسط یا بالا گزینه آرشیو پیویک از مرورگر غیر فعال شود. بجای آن توصیه می‌کنیم تا یک cron job برای پردازش گزارش‌ها هر یک ساعت راه‌اندازی شود.",
         "ArchivingTriggerDescription": "شما به %sراه‌اندازی یک cron job%s برای پردازش خودکار گزارش‌ها نیاز دارید.",
         "AuthenticationMethodSmtp": "روش تایید هویت برای SMTP",
@@ -355,7 +354,6 @@
         "YearsDays": "%1$s سال ها %2$s روز ها",
         "Yes": "بلی",
         "YouAreCurrentlyUsing": "شما هم اکنون از پیوک %s استفاده می کنید.",
-        "YouAreViewingDemoShortMessage": "شما هم اکنون در حال مشاهده نسخه نمایشی پیویک هستید",
         "YouMustBeLoggedIn": "برای دسترسی به این قابلیت شما باید وارد سیستم شوید.",
         "YourChangesHaveBeenSaved": "تغییرات شما دخیره شد."
     },
diff --git a/lang/fi.json b/lang/fi.json
index cffa849a8aca899b32d3fdf11ee84bfac20bb810..4406cd2eff2c0685cca447393f513aa44c954105 100644
--- a/lang/fi.json
+++ b/lang/fi.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Kaikkien verkkosivujen työpöytä",
         "And": "ja",
         "API": "API",
-        "ApplyDateRange": "Ota käyttöön",
         "ArchivingInlineHelp": "Keskikokoisilla ja vilkkailla sivulla on suositeltavaa kieltää arkistointi selaimesta. Parempi vaihtoehto on käyttää cron-työtä arkistointiin joka tunti.",
         "ArchivingTriggerDescription": "Suositeltavaa suuremmissa Piwik-asennuksissa. Sinun täytyy %sasentaa cron-työ%s, jotta raportit käsitellään oikein.",
         "AuthenticationMethodSmtp": "SMTP:n autentikointimenetelmä",
@@ -390,7 +389,6 @@
         "YearsDays": "%1$s vuotta %2$s päivää",
         "Yes": "Kyllä",
         "YouAreCurrentlyUsing": "Käytät Piwik %s:ää",
-        "YouAreViewingDemoShortMessage": "Katselet demoversiota Piwikistä",
         "YouMustBeLoggedIn": "Sinun täytyy kirjautua sisään ennen tämän toiminnallisuuden käyttämistä.",
         "YourChangesHaveBeenSaved": "Muutokset on tallennettu"
     },
diff --git a/lang/fr.json b/lang/fr.json
index 625b1a4fb6ca4faff8776332cec67c08fae7bff1..c034a062c0c942f4d9f7736f02c8794b9387a4f8 100644
--- a/lang/fr.json
+++ b/lang/fr.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Tableau de bord de tous les sites",
         "And": "et",
         "API": "API",
-        "ApplyDateRange": "Appliquer la plage de dates",
         "ArchivingInlineHelp": "Pour les sites à trafic moyen et fort, il est recommandé de désactiver l'archivage de Piwik depuis le navigateur. Nous vous recommandons de mettre en place une tâche planifiée (cron job) qui génère les rapports toutes les heures.",
         "ArchivingTriggerDescription": "Recommandé pour les installations importantes de Piwik, vous devriez %s mettre en place une tâche planifiée (cron) %s pour générer les rapports automatiquement.",
         "AuthenticationMethodSmtp": "Méthode d'authentification pour le serveur SMTP",
@@ -402,7 +401,6 @@
         "YearsDays": "%1$s années %2$s jours",
         "Yes": "Oui",
         "YouAreCurrentlyUsing": "Vous utilisez actuellement Piwik %s",
-        "YouAreViewingDemoShortMessage": "Vous êtes en train de visionner la démonstration de Piwik",
         "YouMustBeLoggedIn": "Vous devez être connecté(e) pour accéder à cette fonctionnalité.",
         "YourChangesHaveBeenSaved": "Vos modifications ont été enregistrées."
     },
diff --git a/lang/gl.json b/lang/gl.json
index 9769cdde26faa4d98f405bdbd0376a6ba21710e4..770ebfaf5d8e99756f8e016a29cc60e8db29bd2e 100644
--- a/lang/gl.json
+++ b/lang/gl.json
@@ -131,7 +131,6 @@
         "Widgets": "Engadidos",
         "YearsDays": "%1$s anos %2$s días",
         "Yes": "Si",
-        "YouAreViewingDemoShortMessage": "Vostede esta vendo a demo de Piwik",
         "YouMustBeLoggedIn": "Debes de rexistrate para acceder a esta función.",
         "YourChangesHaveBeenSaved": "Os cambios foron grabados"
     },
diff --git a/lang/he.json b/lang/he.json
index 5373a84706de2a0bc849b38e940704f323ad56f2..2d39983728c22226e760ad59b1e2787986307b30 100644
--- a/lang/he.json
+++ b/lang/he.json
@@ -9,7 +9,6 @@
         "AllWebsitesDashboard": "פאנל סקירה לכל האתרים",
         "And": "ו",
         "API": "API",
-        "ApplyDateRange": "יישום טווח תאריכים",
         "ArchivingInlineHelp": "עבור אתרים בעלי תעבורה בינוניתעד גבוהה, מומלץ לבטל את ארכיון Piwik בעת צפייה דרך הדפדפן בדוחות. במקום זאת, מומלץ להגדיר עבודה כרונית (cron job) שתעבד דוחות Piwik בכל שעה.",
         "ArchivingTriggerDescription": "מומלץ להתקנות גדולות יותר של Piwik, צריך %sלהגדיר עבודה כרונית%s שתעבד את הדוחות אוטומטית.",
         "AuthenticationMethodSmtp": "שיטת אימות עבור SMTP",
@@ -216,7 +215,6 @@
         "YearlyReports": "דוחות שנתיים",
         "YearsDays": "%1$s שנים ו-%2$s ימים",
         "Yes": "כן",
-        "YouAreViewingDemoShortMessage": "הנך צופה בגרסת ההדגמה של Piwik",
         "YouMustBeLoggedIn": "חובה להתחבר למערכת בכדי לבצע פעולה זו.",
         "YourChangesHaveBeenSaved": "השינויים נשמרו."
     },
diff --git a/lang/hi.json b/lang/hi.json
index d7a468d5559260b22cc51839dfdf84eb6cbc6683..370c5a19778ceba8133a3bd9f3ddd516f6921572 100644
--- a/lang/hi.json
+++ b/lang/hi.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "सभी वेबसाइटों के डैशबोर्ड",
         "And": "और",
         "API": "एपीआई",
-        "ApplyDateRange": "तिथि सीमा लागू करें",
         "ArchivingInlineHelp": "मध्यम से उच्च यातायात वेबसाइटों के लिए,यह Piwik ब्राउज़र से सक्रिय करने के लिए पुरालेखण को निष्क्रिय करने की सिफारिश की है.इसके बजाय, हम आपको Piwik रिपोर्टों के हर घंटे की प्रक्रिया के लिए एक क्रॉन जॉब सेटअप करने की सलाह देते हैं.",
         "ArchivingTriggerDescription": "बड़ा Piwik स्थापित के लिए सिफारिश है, आपको स्वतः रिपोर्टों को संसाधित करने के लिए %s एक क्रॉन जॉब सेटअप %s की जरूरत है.",
         "AuthenticationMethodSmtp": "एसएमटीपी के लिए प्रमाणीकरण विधि",
@@ -383,7 +382,6 @@
         "YearsDays": "%1$s साल %2$s दिन",
         "Yes": "हां",
         "YouAreCurrentlyUsing": "आप वर्तमान में Piwik %s का उपयोग कर रहे हैं.",
-        "YouAreViewingDemoShortMessage": "आप वर्तमान में Piwik का डेमो देख रहे हैं",
         "YouMustBeLoggedIn": "आप इस कार्यक्षमता का उपयोग करने में लॉग इन होना चाहिए.",
         "YourChangesHaveBeenSaved": "आपके परिवर्तन को सहेजा गया है."
     },
diff --git a/lang/hr.json b/lang/hr.json
index b4592701002cfaf6a23f6ff3ee72172c4b67361c..5f2a1441c53231ce46ec9e8de5b7ee97df2bdc67 100644
--- a/lang/hr.json
+++ b/lang/hr.json
@@ -9,7 +9,6 @@
         "AllWebsitesDashboard": "Upravljačka ploča za sve stranice",
         "And": "i",
         "API": "API",
-        "ApplyDateRange": "Odredi vremenski raspon",
         "ArchivingInlineHelp": "Preporučljivo je isključiti pokretanje arhiviranja pri posjeti za stranice sa srednjom i visokom posjećenošću.Umjesto toga savjetujemo da postavite cron job koji će obraditi Piwik izvještaje svakih sat vremena.",
         "ArchivingTriggerDescription": "Za veće Piwik instalacije preporučamo %spostavljanje cron joba %s za automatsku obradu izvještaja.",
         "AuthenticationMethodSmtp": "Način SMTP autorizacije",
@@ -289,7 +288,6 @@
         "Widgets": "Widgeti",
         "YearsDays": "%1$s godina\/e %2$s dan(a)",
         "Yes": "Da",
-        "YouAreViewingDemoShortMessage": "Trenutno gledate demonstraciju Piwika",
         "YouMustBeLoggedIn": "Moraš biti prijavljen za pristup ovoj funkciji.",
         "YourChangesHaveBeenSaved": "Tvoje su izmjene spremljene"
     },
diff --git a/lang/hu.json b/lang/hu.json
index d6ae8fec019a67bef85d89b961442f1e1c4d8f2a..3c4bb0f14840919da2fd7443f510d70b34fc63dd 100644
--- a/lang/hu.json
+++ b/lang/hu.json
@@ -6,7 +6,6 @@
         "Actions": "Akciók",
         "AllWebsitesDashboard": "Weboldal-összesítő vezérlőpult",
         "API": "API",
-        "ApplyDateRange": "Időintervallum alkalmazása",
         "ArchivingInlineHelp": "Közepes és nagy forgalmú weboldalak esetén ajánlott letiltani a böngészővel való megnyitás által előidézett archiválást. Ehelyett ajánlott egy cron job beállítása, mely óránként feldolgozza a Piwik jelentéseket.",
         "ArchivingTriggerDescription": "Nagyobb, Piwik-et használó weboldalak esetén ajánlott. A jelentések automatikus feldolgozásához %segy cron job belállítása%s is szükséges.",
         "AuthenticationMethodSmtp": "SMTP autentikációs módszer",
@@ -249,7 +248,6 @@
         "Widgets": "Modulok",
         "YearsDays": "%1$s év %2$s nap",
         "Yes": "Igen",
-        "YouAreViewingDemoShortMessage": "Jelenleg a Piwik demóváltozatát láthatod.",
         "YouMustBeLoggedIn": "A funkció eléréséhez be kell lépnie.",
         "YourChangesHaveBeenSaved": "Változtatások elmentve."
     }
diff --git a/lang/id.json b/lang/id.json
index 3ed870575e48b8895668637b450ffaf8065b40cb..919fe0886c521eec4b327faeabfcfa18ee0ddea2 100644
--- a/lang/id.json
+++ b/lang/id.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Panel Kendali semua Situs",
         "And": "dan",
         "API": "API",
-        "ApplyDateRange": "Terapkan Rentang Tanggal",
         "ArchivingInlineHelp": "Untuk kunjungan situs menengah hingga tinggi, disarankan untuk mematikan pengarsipan Piwik ketika laporan ditampilkan. Kami lebih menyarankan untuk mengatur tugas Cron untuk mengolah laporan pada tiap jam.",
         "ArchivingTriggerDescription": "Disarankan untuk instalasi Piwik besar untuk %smengatur tugas Cron%s untuk mengolah laporan otomatis.",
         "AuthenticationMethodSmtp": "Metode otentikasi untuk SMTP",
@@ -350,7 +349,6 @@
         "YearsDays": "%1$s tahun %2$s hari",
         "Yes": "Ya",
         "YouAreCurrentlyUsing": "Anda saat ini menggunakan Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Anda sedanng melihat demostrasi Piwik",
         "YouMustBeLoggedIn": "Anda harus masuk untuk mengakses fungsi ini.",
         "YourChangesHaveBeenSaved": "Perubahan Anda telah tersimpan."
     },
diff --git a/lang/it.json b/lang/it.json
index 8b856596d824f5b0d1154dfdf4e1ce321838452a..6ce8e2c37b45734185fa5d95f35f2fda11dc7adf 100644
--- a/lang/it.json
+++ b/lang/it.json
@@ -11,7 +11,7 @@
         "AllWebsitesDashboard": "Le dashboard di tutti i siti",
         "And": "e",
         "API": "API",
-        "ApplyDateRange": "Applica intervallo di date",
+        "Apply": "Applica",
         "ArchivingInlineHelp": "Per i siti da medi a grandi, è raccomandabile disabilitare l'attivazione di Piwik dal browser. Raccomandiamo piuttosto di configurare un cron job per elaborare i report di Piwik ogni ora.",
         "ArchivingTriggerDescription": "Raccomandato per installazioni di Piwik grandi, devi %sconfigurare un cron job%s per elaborare i report automaticamente.",
         "AuthenticationMethodSmtp": "Metodo di autenticazione per SMTP",
@@ -402,7 +402,7 @@
         "YearsDays": "%1$s anni %2$s giorni",
         "Yes": "Sì",
         "YouAreCurrentlyUsing": "Stai utilizzando Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Stai attualmente guardando la demo di Piwik",
+        "YouAreViewingDemoShortMessage": "Stai vedendo una demo di Piwik",
         "YouMustBeLoggedIn": "Devi essere loggato per accedere a questa funzionalità.",
         "YourChangesHaveBeenSaved": "Le impostazioni sono state salvate."
     },
diff --git a/lang/ja.json b/lang/ja.json
index bc20fae91a129f3f1e3357607fac2b05f2228517..b56b20c2dbe6cc6e0412c093c99826d35bfca52f 100644
--- a/lang/ja.json
+++ b/lang/ja.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "全ウェブサイトのダッシュボード",
         "And": "そして",
         "API": "API",
-        "ApplyDateRange": "期間を適用する",
         "ArchivingInlineHelp": "比較的トラフィックの高いウェブサイトでは、ブラウザでの表示をトリガーとする Piwik アーカイブ処理を無効にすることをお勧めします。 代わりに、1時間ごとに Piwik リポートを処理する cron ジョブをセットアップすることをお勧めします。",
         "ArchivingTriggerDescription": "比較的トラフィックの高いウェブサイトに推奨します。 自動リポート処理には %scron ジョブのセットアップ%sが必要となります。",
         "AuthenticationMethodSmtp": "SMTP の認証方法",
@@ -391,7 +390,6 @@
         "YearsDays": "%1$s å¹´ %2$s æ—¥",
         "Yes": "はい",
         "YouAreCurrentlyUsing": "現在Piwik %s を利用しています",
-        "YouAreViewingDemoShortMessage": "現在、Piwik のデモを表示しています",
         "YouMustBeLoggedIn": "この機能にアクセスするにはログインする必要があります。",
         "YourChangesHaveBeenSaved": "変更は保存されました。"
     },
diff --git a/lang/ko.json b/lang/ko.json
index bb855e29147872bc8ac873fb572e7aaaa44b22fa..0a945953060f6fca9460524374f632c3ec8cbeab 100644
--- a/lang/ko.json
+++ b/lang/ko.json
@@ -6,9 +6,11 @@
         "Actions": "활동",
         "Add": "추가",
         "AfterEntry": "여기에 들어간 후",
+        "All": "모두",
+        "AllowPiwikArchivingToTriggerBrowser": "보고서가 웹 브라우저에 표시될 때 아카이브",
         "AllWebsitesDashboard": "전체 웹사이트의 대시보드",
+        "And": "그리고",
         "API": "API",
-        "ApplyDateRange": "기간 적용",
         "ArchivingInlineHelp": "비교적 트래픽이 높은 웹사이트는 브라우저 트리거를 Piwik에 보관하는 것을 비활성화하는 것이 좋습니다. 대신, 1 시간마다 Piwik 보고서를 처리하는 cron 작업을 설정하는 것이 좋습니다.",
         "ArchivingTriggerDescription": "비교적 트래픽이 높은 웹사이트에 권장합니다. 자동 보고서 처리는 %scron 작업 설정%s이 필요합니다.",
         "AuthenticationMethodSmtp": "SMTP 인증 방법",
@@ -97,6 +99,7 @@
         "DaysSinceLastEcommerceOrder": "마지막 전자상거래 주문일",
         "DaysSinceLastVisit": "마지막 방문일",
         "Default": "기본",
+        "DefaultAppended": "(기본)",
         "Delete": "삭제",
         "Description": "설명",
         "Desktop": "데스크톱",
@@ -105,6 +108,7 @@
         "DisplaySimpleTable": "간단한 테이블 표시",
         "DisplayTableWithGoalMetrics": "목표 지표를 포함하는 테이블 표시",
         "DisplayTableWithMoreMetrics": "모든 통계를 포함하는 테이블 표시",
+        "Documentation": "문서",
         "Donate": "기부",
         "Done": "완료",
         "Download": "다운로드",
@@ -146,6 +150,8 @@
         "ExceptionUnableToStartSession": "세션을 시작할 수 없습니다.",
         "ExceptionUndeletableFile": "%s를 제거할 수 없습니다",
         "ExceptionUnreadableFileDisabledMethod": "설정 파일 {%s}를 로드할 수 없습니다. 서버 %s가 비활성화되었을 수 있습니다.",
+        "ExceptionReportNotFound": "요청된 보고서가 존재하지 않습니다.",
+        "ExceptionWidgetNotFound": "요청된 위젯이 존재하지 않습니다.",
         "Export": "내보내기",
         "ExportAsImage": "이미지로 내보내기",
         "ExportThisReport": "다른 형식으로 데이터셋 내보내기",
@@ -153,6 +159,7 @@
         "FileIntegrityWarningExplanation": "파일의 무결성 검사가 실패하고 몇 가지 오류가 보고되었습니다. 이것은 대부분의 경우, 파일이 불완전하거나 일부 Piwik 파일을 업로드에 실패했을 때 입니다. 모든 Piwik 파일을 바이너리 모드로 다시 업로드하여 오류가 나타나지 않을 때까지 페이지를 새로 고침할 필요가 있습니다.",
         "First": "처음",
         "ForExampleShort": "예:",
+        "Forums": "포럼",
         "FromReferrer": "소스",
         "GeneralInformation": "일반 정보",
         "GetStarted": "시작하기",
@@ -170,6 +177,7 @@
         "Installed": "설치됨",
         "InvalidDateRange": "기간 지정이 잘못되었습니다. 다시 설정하세요.",
         "InvalidResponse": "수신한 데이터가 잘못되었습니다.",
+        "IP": "IP",
         "JsTrackingTag": "자바스크립트 트래킹 태그",
         "Language": "언어",
         "LastDays": "마지막 %s일간 (오늘 포함)",
@@ -208,11 +216,12 @@
         "NotDefined": "%s 없음",
         "Note": "주의",
         "NotInstalled": "설치되지 않음",
+        "NotRecommended": "비추천",
         "NotValid": "%s 사용할 수 없음",
         "NumberOfVisits": "방문수",
         "NVisits": "%s회 방문",
         "Ok": "확인",
-        "OneVisit": "1회 방분",
+        "OneVisit": "1회 방문",
         "OnlyEnterIfRequired": "SMTP 서버가 사용자 이름을 필요로하는 경우에만 입력합니다.",
         "OnlyEnterIfRequiredPassword": "SMTP 서버가 암호를 필요로하는 경우에만 입력합니다.",
         "OnlyUsedIfUserPwdIsSet": "사용자 이름\/암호가 설정되어있는 경우에만 사용됩니다. 어떤 방법을 사용해야하는지 잘 모르는 경우, 공급자에게 문의하세요.",
@@ -246,6 +255,7 @@
         "PurchasedProducts": "구입한 제품",
         "Quantity": "수량",
         "RangeReports": "기간 지정",
+        "Recommended": "권장",
         "RecordsToPlot": "구분된 레코드",
         "Refresh": "새로고침",
         "RefreshPage": "페이지 새로고침",
@@ -255,6 +265,7 @@
         "Report": "보고서",
         "ReportGeneratedFrom": "이 보고서는 %s의 데이터를 사용하여 생성되었습니다.",
         "Reports": "보고서",
+        "ReportsContainingTodayWillBeProcessedAtMostEvery": "보고서 아카이브를 몇 초에 한 번씩 수행",
         "ReportsWillBeProcessedAtMostEveryHour": "따라서, 보고서는 1시간마다 처리됩니다.",
         "RequestTimedOut": "%s에 데이터 요청이 초과되었습니다. 다시 시도하세요.",
         "Required": "%s 필요함",
@@ -324,12 +335,13 @@
         "YearsDays": "%1$s년 %2$s일",
         "Yes": "예",
         "YouAreCurrentlyUsing": "현재 Piwik %s를 이용하고 있습니다.",
-        "YouAreViewingDemoShortMessage": "현재 Piwik 데모를 표시",
         "YouMustBeLoggedIn": "이 기능에 접근하려면 로그인해야합니다.",
         "YourChangesHaveBeenSaved": "변경 사항이 저장되었습니다."
     },
     "Mobile": {
+        "AboutPiwikMobile": "About Piwik 모바일",
         "AccessUrlLabel": "Piwik ì ‘ê·¼ URL",
+        "Account": "계정",
         "Accounts": "계정",
         "AddAccount": "계정 추가",
         "AddPiwikDemo": "Piwik 데모 추가",
@@ -340,6 +352,7 @@
         "ChooseHttpTimeout": "HTTP 시간 초과 값 선택",
         "ChooseMetric": "측정 항목 선택",
         "ChooseReport": "보고서 선택",
+        "ConfirmRemoveAccount": "현재 계정을 삭제 하시겠습니까?",
         "DefaultReportDate": "보고서 날짜",
         "EnableGraphsLabel": "그래프 표시",
         "EvolutionGraph": "이력 그래프",
@@ -352,12 +365,19 @@
         "LoginUseHttps": "HTTPS 사용",
         "MultiChartLabel": "스파크라인 표시",
         "NavigationBack": "뒤로",
+        "NetworkError": "네트워크 에러",
         "NetworkErrorWithStatusCode": "\"%s\" 오류가 발생했습니다. 요청에서 \"%s\" 상태가 반환되었습니다. URL은 \"%s\" 입니다. 입력한 URL을 확인해 보고 서버의 오류 로그에서 더 자세한 내용을 분석하여 이 문제를 해결하세요.",
         "NetworkNotReachable": "네트워크에 연결할 수 없음",
+        "NoDataShort": "데이터 없음",
         "NoPiwikAccount": "Piwik 계정이 없나요?",
+        "NoReportsShort": "보고서 없음",
         "NoVisitorFound": "방문자를 찾을 수 없음",
+        "NoVisitorsShort": "방문자 없음",
         "NoWebsiteFound": "웹사이트를 찾을 수 없음",
+        "NoWebsitesShort": "웹사이트 없음",
         "PullDownToRefresh": "아래로 끌어 새로 고침...",
+        "PossibleSslError": "SSL 인증 에러일 확률이 높습니다.",
+        "IgnoreSslError": "SSL 에러 무시",
         "RatingDontRemindMe": "더이상 보이지 않음",
         "RatingNotNow": "지금 안함",
         "RatingNow": "좋아요, 지금 평가하겠습니다",
@@ -369,6 +389,7 @@
         "ShowAll": "모두 보기",
         "ShowLess": "작게 보기",
         "StaticGraph": "그래프 개요",
+        "TryIt": "시도해 보세요!",
         "UseSearchBarHint": "첫 번째 %s의 웹사이트가 여기에 표시됩니다. 다른 웹사이트에 액세스 할 수있는 검색막대를 사용하세요.",
         "VerifyAccount": "계정 확인",
         "VerifyLoginData": "사용자 이름과 비밀번호 조합이 올바른지 확인하세요.",
diff --git a/lang/lt.json b/lang/lt.json
index 53eca652a9a08a28240cccdb94618cee149de4af..e25dd58181fb2ecc15d727e77091fa3d7b52e77f 100644
--- a/lang/lt.json
+++ b/lang/lt.json
@@ -8,7 +8,6 @@
         "AllWebsitesDashboard": "Visų svetainių skydelis",
         "And": "ir",
         "API": "API sÄ…saja",
-        "ApplyDateRange": "Patvirtinti datos intervalÄ…",
         "ArchivingInlineHelp": "Vidutinio ir didelio srauto svetainėms rekomenduojama išjungti Piwik archyvavimo trigerį. Vietoj to, rekomenduojame nustatyti cron job Piwik ataskaitų generavimui kas valandą.",
         "ArchivingTriggerDescription": "Rekomenduojama didesniems Piwik diegimams. Jums reikia %snustatyti cron job%s automatiniam ataskaitų generavimui.",
         "AuthenticationMethodSmtp": "SMTP autentifikacijos metodas",
@@ -244,7 +243,6 @@
         "YearsDays": "%1$s metai %2$s dienos",
         "Yes": "Taip",
         "YouAreCurrentlyUsing": "Šiuo metu jūs naudojate Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Å iuo metu JÅ«s stebite Piwik demonstracijÄ…",
         "YouMustBeLoggedIn": "Pirmiausia turite prisijungti.",
         "YourChangesHaveBeenSaved": "Jūsų atlikti pakeitimai išsaugoti."
     },
diff --git a/lang/lv.json b/lang/lv.json
index b011a0d47aee086016b3096d56af39f3f789f058..543966acb8d18f4bcd7badab836824166963d2fa 100644
--- a/lang/lv.json
+++ b/lang/lv.json
@@ -7,7 +7,6 @@
         "AfterEntry": "pēc nonākšanas šeit",
         "AllWebsitesDashboard": "Visu vietņu panelis",
         "API": "API",
-        "ApplyDateRange": "Apstiprināt datumu diapozonu",
         "ArchivingInlineHelp": "Vidēja un augsta apmeklējuma vietnēm rekomendējam atslēgt pārlūka izsauktu Piwik arhivēšanu. Tā vietā iesakam lietot cron darbu, kas arhivē Piwik katru stundu.",
         "ArchivingTriggerDescription": "Apjomīgām Piwik instalācijām iesakam %siestatīt cron darbu%s, kas apstrādās atskaites automātiski.",
         "AuthenticationMethodSmtp": "SMTP autentifikācijas metode",
@@ -245,7 +244,6 @@
         "Widgets": "Logdaļas",
         "YearsDays": "%1$s gadi, %2$s dienas",
         "Yes": "Jā",
-        "YouAreViewingDemoShortMessage": "Jūs pašlaik skatāties Piwik demonstrāciju",
         "YouMustBeLoggedIn": "Lai tiktu pie šīs funkcionalitātes, Jums jāpiesakās.",
         "YourChangesHaveBeenSaved": "Izmaiņas saglabātas."
     },
diff --git a/lang/nb.json b/lang/nb.json
index 7654c8fa2bb384f7bcc7b3f611fcb7da3e83efd4..b0af25380c60265df574ee006718027031555b3c 100644
--- a/lang/nb.json
+++ b/lang/nb.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Oversiktspanel for alle nettsteder",
         "And": "og",
         "API": "API",
-        "ApplyDateRange": "Bruk datointervall",
         "ArchivingInlineHelp": "For nettsteder med medium til høy trafikk, er det anbefalt å slå av at nettleseren kan utløse Piwik-arkivering. I stedet anbefaler vi at du setter opp en cron-jobb som prosesserer Piwik-rapporter hver time.",
         "ArchivingTriggerDescription": "For større Piwik-installasjoner anbefales det at du setter opp en %scron-jobb%s for å behandle rapporter automatisk.",
         "AuthenticationMethodSmtp": "Autentiseringsmetode for SMTP",
@@ -369,7 +368,6 @@
         "YearsDays": "%1$s år %2$s dager",
         "Yes": "Ja",
         "YouAreCurrentlyUsing": "Du bruker for øyeblikket Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Du ser for øyeblikket på Piwik-demoen",
         "YouMustBeLoggedIn": "Du må være innlogget for å bruke denne funksjonaliteten.",
         "YourChangesHaveBeenSaved": "Din endringer er lagret."
     },
diff --git a/lang/nl.json b/lang/nl.json
index fa1a05e93e638897e5212c5b4d3a7dd91c9fd691..774914af72512428b4360fee029162aff7fed5ee 100644
--- a/lang/nl.json
+++ b/lang/nl.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Dashboard van alle websites",
         "And": "en",
         "API": "API",
-        "ApplyDateRange": "Voer datumbereik in",
         "ArchivingInlineHelp": "Voor middelgrote tot grote websites, is het aan te raden Piwik archivering voor de browser uit te schakelen. Als alternatief raden we aan om een cronjob te maken om piwik om het uur rapporten te laten genereren.",
         "ArchivingTriggerDescription": "Aangeraden voor grote Piwik installaties, gebruik een %scronjob%s om automatisch rapporten te genereren.",
         "AuthenticationMethodSmtp": "Authenticatie methode voor SMTP",
@@ -401,7 +400,6 @@
         "YearsDays": "%1$s jaren %2$s dagen",
         "Yes": "Ja",
         "YouAreCurrentlyUsing": "U gebruikt momenteel Piwik %s.",
-        "YouAreViewingDemoShortMessage": "U bekijkt momenteel de demo versie van Piwik.",
         "YouMustBeLoggedIn": "U moet ingelogd zijn om deze functionaliteit te gebruiken.",
         "YourChangesHaveBeenSaved": "De wijzigingen zijn opgeslagen."
     },
diff --git a/lang/nn.json b/lang/nn.json
index e0ae721027d97f6a302a0b6d0ec9120304f7773c..79133a7493e404f745122e66d1db6b9acf67c580 100644
--- a/lang/nn.json
+++ b/lang/nn.json
@@ -7,7 +7,6 @@
         "AfterEntry": "etter inngang her",
         "AllWebsitesDashboard": "Styringspanel for alle nettstadene",
         "API": "API",
-        "ApplyDateRange": "Set periode",
         "ArchivingInlineHelp": "For nettstader med middels til høg trafikk, er det tilrådd å slå av arkivering via nettlesaren. Me oppmodar deg heller til å setja opp ein cron-jobb for å handsama rapportane til Piwik kvar time.",
         "ArchivingTriggerDescription": "For større installasjonar av Piwik er det tilrådd at du %ssett opp ein cron-jobb%s for å handsama rapportane automatisk.",
         "AuthenticationMethodSmtp": "Godkjenningsmetode for SMTP",
@@ -270,7 +269,6 @@
         "YearsDays": "%1$s år %2$s dagar",
         "Yes": "Ja",
         "YouAreCurrentlyUsing": "Du bruker no Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Dette er ein demo av Piwik",
         "YouMustBeLoggedIn": "Du må vera innlogga for å bruka denne funksjonen.",
         "YourChangesHaveBeenSaved": "Endringane dine er lagra."
     }
diff --git a/lang/pl.json b/lang/pl.json
index 3ee937eb5cc86b6efac84b26167ee31be794fa3f..816397d73ebf69e483d4baa1b920a193b51ceba1 100644
--- a/lang/pl.json
+++ b/lang/pl.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Tablica analiz wszystkich stron",
         "And": "i",
         "API": "API",
-        "ApplyDateRange": "Zastosuj dla tego zakresu dat",
         "ArchivingInlineHelp": "Dla serwisów o średnim i wysokim natężeniu ruchu, zalecane jest wyłączenie archiwizacji danych Piwik podczas przeglądania raportów w przeglądarce. Zamiast tego zaleca się skonfigurowanie żądania cron, by przetwarzanie raportów Piwik następowało co godzinę.",
         "ArchivingTriggerDescription": "Zalecany dla większych instalacji Piwik, musisz %sskonfigurować crona%s do przetwarzania raportów automatycznie.",
         "AuthenticationMethodSmtp": "Metoda uwierzytelnienie dla SMTP",
@@ -364,7 +363,6 @@
         "YearsDays": "%1$s lat %2$s dni",
         "Yes": "Tak",
         "YouAreCurrentlyUsing": "Aktualnie używasz Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Aktualnie oglÄ…dasz wersjÄ™ demonstracyjnÄ… statystyk Piwik",
         "YouMustBeLoggedIn": "Musisz się zalogować, by uzyskać dostęp do funkcji zasobów.",
         "YourChangesHaveBeenSaved": "Twoje modyfikacje zostały zapisane pomyślnie."
     },
diff --git a/lang/pt-br.json b/lang/pt-br.json
index ad5005b6da58105cf92cfca732cd4db1bb85f2ea..fd85406905d2d52dc2ec938b338bc1694979b421 100644
--- a/lang/pt-br.json
+++ b/lang/pt-br.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Painel de Todos os sites",
         "And": "e",
         "API": "API",
-        "ApplyDateRange": "Aplicar para este período",
         "ArchivingInlineHelp": "Para sites com tráfego de médio a alto, é recomendado desabilitar a trigger que salva do navegador. Em vez disso, nós recomendamos que instale um cron job para processar os relatorios Piwik a cada hora.",
         "ArchivingTriggerDescription": "Recomendado para instalações maiores do Piwik, precisa de %s configurar um cron job%s para processar os relatórios automaticamente.",
         "AuthenticationMethodSmtp": "Método de autenticação para SMTP",
@@ -402,7 +401,6 @@
         "YearsDays": "%1$s anos %2$s dias",
         "Yes": "Sim",
         "YouAreCurrentlyUsing": "Você está usando atualmente Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Você está vendo a demonstração do Piwik",
         "YouMustBeLoggedIn": "Tem de estar ligado para aceder a essa funcionalidade.",
         "YourChangesHaveBeenSaved": "Suas alterações foram salvas"
     },
diff --git a/lang/pt.json b/lang/pt.json
index ba2a0b422cbce0c1016cc8905bbffa0556777406..3d3b07c7d92b406d0fb78ac1efb4d05ba30012cc 100644
--- a/lang/pt.json
+++ b/lang/pt.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Painel de Controlo de Todos os Websites",
         "And": "e",
         "API": "API",
-        "ApplyDateRange": "Aplicar Intervalo de Datas",
         "ArchivingInlineHelp": "Para websites de tráfego médio ou elevado, é recomendado desactivar o arquivar de Piwik de ser accionado quando os relatórios são vistos no navegador. Em vez disso, recomendamos que configure uma tarefa cron para processar os relatórios de Piwik cada hora.",
         "ArchivingTriggerDescription": "Recomendado para instalações Piwik maiores, tem que %sconfigurar uma tarefa cron%s para processar os relatórios automaticamente.",
         "AuthenticationMethodSmtp": "Método de autenticação SMTP",
@@ -293,7 +292,6 @@
         "YearlyReports": "Relatórios Anuais",
         "YearsDays": "%1$s anos %2$s dias",
         "Yes": "Sim",
-        "YouAreViewingDemoShortMessage": "Está actualmente a visualizar a demo de Piwik.",
         "YouMustBeLoggedIn": "Tem que estar ligado para aceder a esta funcionalidade.",
         "YourChangesHaveBeenSaved": "As suas alterações foram guardadas."
     },
diff --git a/lang/ro.json b/lang/ro.json
index 45e76ee2ded71bf74799d76fc8dfc9c53a8de6a5..7d9ef6a296620ea331c6fb63e22516960211091d 100644
--- a/lang/ro.json
+++ b/lang/ro.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Panoul de control pentru toate site-urile",
         "And": "ÅŸi",
         "API": "API",
-        "ApplyDateRange": "Aplica interval",
         "ArchivingInlineHelp": "Pentru site-uri cu trafic mediu sau mare, este recomandata dezactivarea arhivari Piwik din browser. Recomandat sa faceti setup la un cron job pentru a procesa rapoarte Piwik in fiecare ora",
         "ArchivingTriggerDescription": "Recomandat pentru instalari mari, trebuie sa %ssetup un cron job%s pentru procesarea automata a rapoartelor",
         "AuthenticationMethodSmtp": "Metoda autentificare pentru SMTP",
@@ -372,7 +371,6 @@
         "YearsDays": "%1$s ani %2$s zile",
         "Yes": "Da",
         "YouAreCurrentlyUsing": "FoloseÅŸti Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Vizualizati o versiune demo a Piwik",
         "YouMustBeLoggedIn": "Trebuie sa fiti logat pentru a accesa aceasta functionalitate.",
         "YourChangesHaveBeenSaved": "Schimbarile au fost salvate"
     },
diff --git a/lang/ru.json b/lang/ru.json
index f163eb12b9974a1130f78471c2870b8a23f2809d..bbdd7f1e0ffb77c762a9e99ceb4db2e98b5eeea0 100644
--- a/lang/ru.json
+++ b/lang/ru.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Статистика всех сайтов",
         "And": "и",
         "API": "API-функции",
-        "ApplyDateRange": "Применить период",
         "ArchivingInlineHelp": "Для сайтов со средней или высокой нагрузкой рекомендуется отменить архивирование данных при входе в веб-аналитику через браузер. Вместо этого лучше назначить cron-задачу, чтобы Piwik автоматически формировал отчеты каждый час.",
         "ArchivingTriggerDescription": "Для сайтов с высокой нагрузкой настоятельно рекомендуется %sназначить cron-задачу%s, которая будет формировать отчеты автоматически.",
         "AuthenticationMethodSmtp": "Метод аутентификации SMTP",
@@ -391,7 +390,6 @@
         "YearsDays": "%1$s г. %2$s дн.",
         "Yes": "Да",
         "YouAreCurrentlyUsing": "Вы используете версию Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Вы сейчас работаете с демо системы Piwik",
         "YouMustBeLoggedIn": "Вы должны зайти на сайт, чтобы получить доступ к этому функционалу.",
         "YourChangesHaveBeenSaved": "Изменения сохранены."
     },
diff --git a/lang/sk.json b/lang/sk.json
index 5c19064dd2e57a109bc4a08e09c5919ce4ab8550..5bac8b9edfc94a3da8b2c26630a0761826d14f2a 100644
--- a/lang/sk.json
+++ b/lang/sk.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Nástenka pre všetky weby",
         "And": "a",
         "API": "API",
-        "ApplyDateRange": "Použiť časový rozsah",
         "ArchivingInlineHelp": "Pre stredné až vysoké návštevnosti webových stránok, sa odporúča vypnúť v Piwiku archiváciu spúšťanú prezeraním z prehliadača. Namiesto toho odporúčame nastaviť cron úlohu na spracovanie Piwik reportov každú hodinu.",
         "ArchivingTriggerDescription": "Odporúča sa pre väčšie inštalácie Piwiku, musíte %s nastaviť cron %s aby spracovával reporty automaticky.",
         "AuthenticationMethodSmtp": "Metóda overovania pre SMTP",
@@ -396,7 +395,6 @@
         "YearsDays": "%1$s rokov %2$s dní",
         "Yes": "Áno",
         "YouAreCurrentlyUsing": "Aktuálne používate Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Momentálne vidíte demo Piwiku",
         "YouMustBeLoggedIn": "Musíte byť prihlásený pre prístup k tejto functionnality.",
         "YourChangesHaveBeenSaved": "Vaše zmeny boli uložené."
     },
diff --git a/lang/sl.json b/lang/sl.json
index a5fdea267d55dc8f55989f0ff712b50d3b11f818..1e61e1b738862055c66270e8a667dfe9c4c8a715 100644
--- a/lang/sl.json
+++ b/lang/sl.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Vse nadzorne plošče spletnih strani",
         "And": "in",
         "API": "API",
-        "ApplyDateRange": "Uveljavi Datumski Razpon",
         "ArchivingInlineHelp": "Za srednje velike in velike spletne strani izklopite arhiviranje preko spletnega brskalnika. Namesto tega vam priporočamo, da nastavite \"cron job\" tako, da bodo poročila ustvarjena vsako uro.",
         "ArchivingTriggerDescription": "Priporočamo za večje namestitve. %sNastavite \"cron job\"%s za avtomatsko procesiranje.",
         "AuthenticationMethodSmtp": "Metoda potrditve verodostojnosti za SMTP",
@@ -389,7 +388,6 @@
         "YearsDays": "%1$s let %2$s dni",
         "Yes": "Da",
         "YouAreCurrentlyUsing": "Trenutno uporabljate Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Trenutno si ogledujete Piwik v demo načinu",
         "YouMustBeLoggedIn": "Za uporabo te funkcije morate biti vpisani.",
         "YourChangesHaveBeenSaved": "Vaše spremembe so bile shranjene."
     },
diff --git a/lang/sq.json b/lang/sq.json
index 59f9828e40415c5e0fc9a94fc77cf413ebd3c2df..1d2d71825e6f75e0e838a001a89fe40596d1bd5c 100644
--- a/lang/sq.json
+++ b/lang/sq.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Pult për krejt sajtet",
         "And": "dhe",
         "API": "API",
-        "ApplyDateRange": "Zbato Intervalin e Datave",
         "ArchivingInlineHelp": "Për sajte me trafik mesatar ose të shumtë këshillohet të çaktivizohet vënia në punë e arkivimit nga Piwik-u prej shfletuesit. Në vend të kësaj këshillojmë të rregulloni një akt cron që të përpunoni raporte Piwik-u çdo orë.",
         "ArchivingTriggerDescription": "E këshilluar për instalime më të ngarkuara të Piwik-ut, lypset të %s rregulloni një akt cron-i%s që të përpunohen raportet automatikisht.",
         "AuthenticationMethodSmtp": "Metodë mirëfilltësimi për SMTP",
@@ -395,7 +394,6 @@
         "YearsDays": "%1$s vite %2$s ditë",
         "Yes": "Po",
         "YouAreCurrentlyUsing": "Jeni duke përdorur Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Hëpërhë jeni duke parë një demonstrim të Piwik-ut",
         "YouMustBeLoggedIn": "Që të përdorni këtë funksion, duhet të keni bërë hyrjen.",
         "YourChangesHaveBeenSaved": "Ndryshimet tuaja u ruajtën."
     },
diff --git a/lang/sr.json b/lang/sr.json
index 15322e61223d1cf00d1dff7e7ac9ef6bf392ddd0..534b8e3a51aaf2e1a1835f2d790d1eba6146aeeb 100644
--- a/lang/sr.json
+++ b/lang/sr.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Svi sajtovi",
         "And": "i",
         "API": "API",
-        "ApplyDateRange": "Primeni opseg datuma",
         "ArchivingInlineHelp": "Za srednje i velike sajtove preporuka je da isključite ovu opciju i da podesite cron koji će procesirati Piwik izveštaje svaki sat",
         "ArchivingTriggerDescription": "Preporučljivo za velike Piwik instalacije; potrebno je da %spodesite cron%s da procesira izveštaje automatski",
         "AuthenticationMethodSmtp": "Način autentikacije za SMTP",
@@ -401,7 +400,6 @@
         "YearsDays": "%1$s godine %2$s dani",
         "Yes": "Da",
         "YouAreCurrentlyUsing": "Trenutno koristite Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Trenutno koristite demo verziju programa Piwik",
         "YouMustBeLoggedIn": "Morate se prijaviti da biste pristupili ovim funkcijama",
         "YourChangesHaveBeenSaved": "Vaše izmene su sačuvane"
     },
diff --git a/lang/sv.json b/lang/sv.json
index 5137f3ec926f5e8ddcef76dc88350240f2281515..ad1909fb09b0c98abdf2d754430f06b1e412ba74 100644
--- a/lang/sv.json
+++ b/lang/sv.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Alla webbplatsers instrumentpanel",
         "And": "och",
         "API": "API",
-        "ApplyDateRange": "Verkställ datumintervall",
         "ArchivingInlineHelp": "För webbplatser med medelhög till hög trafik rekommenderas det att du stänger av Piwik's funktion för arkivering att aktiveras från denna webbläsare.",
         "ArchivingTriggerDescription": "För större Piwik-installationer rekommenderas det att du %ssätta upp ett cron job%s för att behandla rapporterna automatiskt.",
         "AuthenticationMethodSmtp": "Autentiseringsmetod för SMTP",
@@ -401,7 +400,6 @@
         "YearsDays": "%1$s år %2$s dagar",
         "Yes": "Ja",
         "YouAreCurrentlyUsing": "Du använder för närvarande Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Du ser just nu en demo av Piwik",
         "YouMustBeLoggedIn": "Du måste vara inloggad för att komma åt denna funktion.",
         "YourChangesHaveBeenSaved": "Dina ändringar har sparats."
     },
diff --git a/lang/ta.json b/lang/ta.json
index b2313f28bd6c7b86b626ebc1c53d665bcbc0aca4..6a81e67828c1cf6a7a8d4528be079ad7a1613aa1 100644
--- a/lang/ta.json
+++ b/lang/ta.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "அனைத்து இணையதள கட்டுப்பாட்டு அறை",
         "And": "மற்றும்",
         "API": "ஏபிஐ",
-        "ApplyDateRange": "தேதி வரையை விண்ணப்பிக்க",
         "AuthenticationMethodSmtp": "SMTP க்கான உறுதிப்படுத்தும் முறை",
         "AverageOrderValue": "சராசரி ஒழுங்கு மதிப்பு",
         "AveragePrice": "சராசரி விலை",
diff --git a/lang/th.json b/lang/th.json
index d4c5d243f63c5e97e06a45b772862109aa0cf114..8ec90a69a9a93fd6d106ddcabb1b9c56256dca98 100644
--- a/lang/th.json
+++ b/lang/th.json
@@ -8,7 +8,6 @@
         "AfterEntry": "หลังจากที่กรอกลงที่นี่",
         "AllWebsitesDashboard": "แผงควบคุมเว็บไซต์ทั้งหมด",
         "API": "API",
-        "ApplyDateRange": "ช่วงวันที่สมัคร",
         "ArchivingInlineHelp": "เหมาะสำหรับเว็บไซต์ที่มีการจราจรสูง เราแนะนำให้ปิดการใช้งาน Piwik ในการเรียกเก็บจากเบราว์เซอร์ แต่เราขอแนะนำให้คุณติดตั้ง Cron job ในการประมวลผลเพื่อรายงาน Piwik ทุกชั่วโมง",
         "ArchivingTriggerDescription": "แนะนำสำหรับการติดตั้ง Piwik ขนาดใหญ่ที่คุณจะต้อง %s ติดตั้ง Cron job%s เพื่อดำเนินการรายงานโดยอัตโนมัติ",
         "AuthenticationMethodSmtp": "วิธีการตรวจสอบข้อมูลของ SMTP",
@@ -292,7 +291,6 @@
         "YearsDays": "%1$s ปี %2$s วัน",
         "Yes": "ใช่",
         "YouAreCurrentlyUsing": "คุณกำลังใช้ Piwik %s",
-        "YouAreViewingDemoShortMessage": "คุณกำลังดูการสาธิตของ Piwik",
         "YouMustBeLoggedIn": "คุณจะต้องเข้าสู่ระบบเพื่อเจ้าจัดการฟังก์ชั่นนี้",
         "YourChangesHaveBeenSaved": "บันทึกการเปลี่ยนแปลงของคุณแล้ว"
     },
diff --git a/lang/tl.json b/lang/tl.json
index 93bea0fb85b4d19e16f459b76a2022c38a188230..8f9ec11b2234e9442708367a82791a440443352e 100644
--- a/lang/tl.json
+++ b/lang/tl.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Lahat ng dashboard Websites",
         "And": "at",
         "API": "API",
-        "ApplyDateRange": "I-apply ang petsa",
         "ArchivingInlineHelp": "Para sa katam-tamang dami ng traffic websites inirerekomenda na huwag paganahin ang Piwik-archive upang ma-trigger mula sa browser. Sa halip aming nirerekomenda na mag setup ng cron job upang i-proseso ang mga ulat kada oras.",
         "ArchivingTriggerDescription": "Inirerekomenda para sa mas malakihang pag-install ng Piwik kailangan mong %ssetup ang cron job%s upang awtomatikong iproseso ang mga ulat.",
         "AuthenticationMethodSmtp": "Authentication method para sa SMTP",
diff --git a/lang/tr.json b/lang/tr.json
index 0800c83d578e4c0efc15a5df489f15105c1ff37c..9d980c802e6462f1e125abae836e9f8158319bbc 100644
--- a/lang/tr.json
+++ b/lang/tr.json
@@ -10,7 +10,6 @@
         "AllWebsitesDashboard": "Tüm Websitelerin Panosu",
         "And": "ve",
         "API": "API",
-        "ApplyDateRange": "Tarih Aralığını Uygula",
         "AuthenticationMethodSmtp": "SMTP için kimlik doğrulama yöntemi",
         "AverageOrderValue": "Ortalama SipariÅŸ DeÄŸeri",
         "AveragePrice": "Ortalama Fiyat",
diff --git a/lang/uk.json b/lang/uk.json
index e0c33ff1f3e340a3111f27d3153564389fd4b4e7..519aad1ad4dc598d679c9c9d3855331f1374c7fc 100644
--- a/lang/uk.json
+++ b/lang/uk.json
@@ -175,7 +175,6 @@
         "Widgets": "Віджет",
         "YearsDays": "%1$s років %2$s днів",
         "Yes": "Так",
-        "YouAreViewingDemoShortMessage": "Зараз переглядається демонстраційний варіант Piwik",
         "YouMustBeLoggedIn": "Треба увійти в систему щоб отримати доступ до цих функцій.",
         "YourChangesHaveBeenSaved": "Зміни збережено."
     }
diff --git a/lang/vi.json b/lang/vi.json
index 404960e60c1bf43bb98e2b69e21b6464e894e988..7cfb9a0c74231e02e9154dc316d75317461a4848 100644
--- a/lang/vi.json
+++ b/lang/vi.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "Bảng điều khiển tất cả các Website",
         "And": "và",
         "API": "API",
-        "ApplyDateRange": "Giới hạn thời gian",
         "ArchivingInlineHelp": "Đối với những trang web có mức độ truy cập trung bình và cao, chúng tôi khuyến cáo bạn bỏ chế độ cập nhật lên Piwik dựa vào trigger phía trình duyệt. Thay vào đó, bạn nên thiết lập lịch cho Piwik tự xử lý báo cáo sau mỗi giờ đồng hồ (để tránh quá tải server).",
         "ArchivingTriggerDescription": "Đề nghị cho cài đặt Piwik lớn hơn, bạn cần phải %s thiết lập một cron %s để xử lý các báo cáo tự động.",
         "AuthenticationMethodSmtp": "Phương thức xác thực SMTP",
@@ -368,7 +367,6 @@
         "YearsDays": "%1$s năm %2$s ngày",
         "Yes": "Có",
         "YouAreCurrentlyUsing": "Bạn đang sử dụng Piwik %s.",
-        "YouAreViewingDemoShortMessage": "Bạn đang xem phần giới thiệu Piwik",
         "YouMustBeLoggedIn": "Bạn phải đăng nhập để truy cập chức năng này.",
         "YourChangesHaveBeenSaved": "Các thay đổi của bạn đã được lưu."
     },
diff --git a/lang/zh-cn.json b/lang/zh-cn.json
index 6f53ff107ae977a388cf6a71ce0710966a606689..e9f526a20d1e0392a722fed89e60e0198ec8aa57 100644
--- a/lang/zh-cn.json
+++ b/lang/zh-cn.json
@@ -11,7 +11,6 @@
         "AllWebsitesDashboard": "所有网站报表",
         "And": "和",
         "API": "API",
-        "ApplyDateRange": "应用时间段",
         "ArchivingInlineHelp": "对于中高流量的网站,建议禁用Piwik浏览器触发处理。最好是设置定时任务(Cron job),每小时处理一次Piwik报表。",
         "ArchivingTriggerDescription": "适合大型的Piwik安装,需要%s设置定时任务(Cron job) %s来自动处理报表。",
         "AuthenticationMethodSmtp": "SMTP 验证方法",
@@ -365,7 +364,6 @@
         "YearsDays": "%1$s 年 %2$s 天",
         "Yes": "是",
         "YouAreCurrentlyUsing": "您正在使用 Piwik %s.",
-        "YouAreViewingDemoShortMessage": "您正在浏览 Piwik 演示",
         "YouMustBeLoggedIn": "您必须登录才能存取这个功能。",
         "YourChangesHaveBeenSaved": "修改已保存。"
     },
diff --git a/lang/zh-tw.json b/lang/zh-tw.json
index 5bf8aab1bc51a4c91eaec8f1f7c6e68fd6bc0c4b..431b52109a2e4ff318cdf516afd3780652647857 100644
--- a/lang/zh-tw.json
+++ b/lang/zh-tw.json
@@ -6,7 +6,8 @@
         "Add": "新增",
         "AfterEntry": "在這裡之後輸入",
         "All": "全部",
-        "AllWebsitesDashboard": "所有網站展示板",
+        "AllWebsitesDashboard": "所有網站的控制台",
+        "And": "和",
         "API": "API",
         "ArchivingInlineHelp": "對於中或高流量的網站,建議停用 Piwik 彙整觸發瀏覽器。反之,我們建議你設定一個工作排程(Cron job),每小時處理 Piwik 報告。",
         "ArchivingTriggerDescription": "推薦大型的 Piwik 安裝,你需要%s設定一個工作排程(Cron job)%s來自動處理報告。",
@@ -197,7 +198,6 @@
         "Widgets": "組件",
         "YearsDays": "%1$s 年 %2$s 天",
         "Yes": "是",
-        "YouAreViewingDemoShortMessage": "你正在瀏覽 Piwik 範例",
         "YouMustBeLoggedIn": "您必須登入才能存取這個功能!",
         "YourChangesHaveBeenSaved": "您的變更已儲存!"
     },
@@ -208,15 +208,26 @@
         "Accounts": "帳號",
         "AddAccount": "新增帳號",
         "AddPiwikDemo": "增加 Piwik 示範",
+        "Advanced": "進階",
         "AnonymousAccess": "匿名存取",
+        "AnonymousTracking": "匿名追蹤",
+        "ChooseHttpTimeout": "選擇HTTP多久之後超時",
+        "ChooseReport": "選擇一個報表",
         "EnableGraphsLabel": "顯示圖表",
         "MultiChartLabel": "顯示 sparklines",
         "NetworkNotReachable": "網路無法訪問",
+        "NoVisitorsShort": "沒有任何訪問者",
+        "NoWebsiteFound": "沒有網站",
+        "NoWebsitesShort": "沒有任何網站",
         "SaveSuccessError": "請確認設定",
         "YouAreOffline": "抱歉,您目前為離線狀態"
     },
     "RowEvolution": {
         "AvailableMetrics": "可用指標",
-        "CompareRows": "比較紀錄"
+        "CompareRows": "比較紀錄",
+        "ComparingRecords": "正在比較 %s 行",
+        "MetricBetweenText": "從 %s 到 %s",
+        "MetricChangeText": "在這段時間改變了 %s",
+        "PickAnotherRow": "選擇其他行來進行比較"
     }
 }
\ No newline at end of file
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 8245d0712eb345408f61a42e778081344c04f3bc..ae5e1b407ff75caa53fbaa7628b554ecd30a4af6 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -25,8 +25,6 @@ use Piwik\Metrics;
 use Piwik\Period;
 use Piwik\Period\Range;
 use Piwik\Piwik;
-use Piwik\Plugin\Dimension\VisitDimension;
-use Piwik\Plugin\Report;
 use Piwik\Plugins\API\DataTable\MergeDataTables;
 use Piwik\Plugins\CoreAdminHome\CustomLogo;
 use Piwik\Translation\Translator;
diff --git a/plugins/API/WidgetMetadata.php b/plugins/API/WidgetMetadata.php
index ef12800a39f982f5a12caee92a48b4d61d91ef6d..8f0fb0330f6fc4e514779fd34f95a0ebfa71b15d 100644
--- a/plugins/API/WidgetMetadata.php
+++ b/plugins/API/WidgetMetadata.php
@@ -154,6 +154,7 @@ class WidgetMetadata
             'id'    => (string) $category->getId(),
             'name'  => Piwik::translate($category->getId()),
             'order' => $category->getOrder(),
+            'icon' => $category->getIcon(),
         );
     }
 
diff --git a/plugins/API/lang/cs.json b/plugins/API/lang/cs.json
index 2d03c857bde959fb1834d12d143a5eeeaa0d42fc..68c93a8e58da43985b4227393fb2e93c89dd33f5 100644
--- a/plugins/API/lang/cs.json
+++ b/plugins/API/lang/cs.json
@@ -8,6 +8,8 @@
         "ReportingApiReference": "Reference API hlášení",
         "TopLinkTooltip": "Zpřístupněte Vaše Webové analýzy programově skrze jednoduché API pomocí json, xml a dalších.",
         "UserAuthentication": "Autentifikace uživatele",
-        "UsingTokenAuth": "Pokud chcete %s načíst data ze skriptu, cronu, atd. %s Potřebujete přidat parametr %s k voláním API, které vyžadují přihlášení"
+        "UsingTokenAuth": "Pokud chcete %s načíst data ze skriptu, cronu, atd. %s Potřebujete přidat parametr %s k voláním API, které vyžadují přihlášení",
+        "Glossary": "Glosář",
+        "LearnAboutCommonlyUsedTerms": "Zjistěte víc o nejčastějších termínech, abyste mohli využít Piwik naplno %s a %s."
     }
 }
\ No newline at end of file
diff --git a/plugins/API/templates/listAllAPI.twig b/plugins/API/templates/listAllAPI.twig
index 47a1327c36a0b85a9a985a28a6fcdc5063759f41..d3c551c997e36a058e69c35006c7bfd245a4725f 100644
--- a/plugins/API/templates/listAllAPI.twig
+++ b/plugins/API/templates/listAllAPI.twig
@@ -2,18 +2,17 @@
 
 {% set title %}{{ 'API_ReportingApiReference'|translate }}{% endset %}
 
+{% block topcontrols %}
+    {% include "@CoreHome/_siteSelectHeader.twig" %}
+    {% include "@CoreHome/_periodSelect.twig" %}
+{% endblock %}
+
 {% block content %}
 
 <div class="api-list">
 
     <h2>{{ title }}</h2>
 
-    {% include "@CoreHome/_siteSelectHeader.twig" %}
-
-    <div class="top_controls">
-        {% include "@CoreHome/_periodSelect.twig" %}
-    </div>
-
     <p>{{ 'API_PluginDescription'|translate }}</p>
 
     <p>
diff --git a/plugins/AnonymousPiwikUsageMeasurement b/plugins/AnonymousPiwikUsageMeasurement
new file mode 160000
index 0000000000000000000000000000000000000000..b3db172b25b06a92658b9848184f1bd4fa97e9b9
--- /dev/null
+++ b/plugins/AnonymousPiwikUsageMeasurement
@@ -0,0 +1 @@
+Subproject commit b3db172b25b06a92658b9848184f1bd4fa97e9b9
diff --git a/plugins/Contents/Columns/Metrics/InteractionRate.php b/plugins/Contents/Columns/Metrics/InteractionRate.php
index 64485fe0e67e0b254a0924cc808e3f9a70a1875c..513f0efe355a9ed59fd295088087357cdf2c2312 100644
--- a/plugins/Contents/Columns/Metrics/InteractionRate.php
+++ b/plugins/Contents/Columns/Metrics/InteractionRate.php
@@ -32,6 +32,11 @@ class InteractionRate extends ProcessedMetric
         return Piwik::translate('Contents_InteractionRate');
     }
 
+    public function getDocumentation()
+    {
+        return Piwik::translate('Contents_InteractionRateMetricDocumentation');
+    }
+
     public function compute(Row $row)
     {
         $interactions = $this->getMetric($row, 'nb_interactions');
diff --git a/plugins/Contents/Contents.php b/plugins/Contents/Contents.php
index 49df9a730bc5b1d30406051da6a758c933bcc9b5..df42522cb31e679a614282342cec3da16b00860d 100644
--- a/plugins/Contents/Contents.php
+++ b/plugins/Contents/Contents.php
@@ -8,6 +8,8 @@
  */
 namespace Piwik\Plugins\Contents;
 
+use Piwik\Piwik;
+
 class Contents extends \Piwik\Plugin
 {
     /**
@@ -17,6 +19,7 @@ class Contents extends \Piwik\Plugin
     {
         return array(
             'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
+            'Metrics.getDefaultMetricDocumentationTranslations' => 'addMetricDocumentationTranslations',
             'AssetManager.getJavaScriptFiles' => 'getJsFiles',
             'AssetManager.getStylesheetFiles' => 'getStylesheetFiles'
         );
@@ -39,4 +42,9 @@ class Contents extends \Piwik\Plugin
         $stylesheets[] = "plugins/Contents/stylesheets/datatable.less";
     }
 
+    public function addMetricDocumentationTranslations(&$translations)
+    {
+        $translations['nb_impressions'] = Piwik::translate('Contents_ImpressionsMetricDocumentation');
+        $translations['nb_interactions'] = Piwik::translate('Contents_InteractionsMetricDocumentation');
+    }
 }
diff --git a/plugins/Contents/lang/en.json b/plugins/Contents/lang/en.json
index e6a89ad64098d5233162ea4bf72fb6f29bd2bfa0..3873a7b2ac50dad05ee18beee9e88991e7de5b16 100644
--- a/plugins/Contents/lang/en.json
+++ b/plugins/Contents/lang/en.json
@@ -8,6 +8,9 @@
         "ContentName":"Content Name",
         "ContentPiece":"Content Piece",
         "ContentTarget":"Content Target",
-        "Contents":"Contents"
+        "Contents":"Contents",
+        "InteractionsMetricDocumentation": "The number of times a content block was interacted with (eg, a 'click' on a banner or ad).",
+        "ImpressionsMetricDocumentation": "The number of times a content block, such as a banner or an ad, was displayed on a page.",
+        "InteractionRateMetricDocumentation": "The ratio of content impressions to interactions."
     }
 }
\ No newline at end of file
diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml
index 8eed477e8b01b16705bfbfa28dbe133218b128c9..35ee103b17b11c9d3a4f569f1278a9fe82072bb4 100644
--- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentNames_lastN__API.getProcessedReport_day.xml
@@ -13,6 +13,11 @@
 			<nb_impressions>Impressions</nb_impressions>
 			<nb_interactions>Interactions</nb_interactions>
 		</metrics>
+		<metricsDocumentation>
+			<nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions>
+			<nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions>
+			<interaction_rate>The ratio of content impressions to interactions.</interaction_rate>
+		</metricsDocumentation>
 		<processedMetrics>
 			<interaction_rate>Interaction Rate</interaction_rate>
 		</processedMetrics>
diff --git a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml
index f0115ea581060912112c3e4045a8758cdb63b288..d7e5a543f89df4a082d7e4f0a4571d352d038264 100644
--- a/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml
+++ b/plugins/Contents/tests/System/expected/test_Contents_Contents.getContentPieces_lastN__API.getProcessedReport_day.xml
@@ -13,6 +13,11 @@
 			<nb_impressions>Impressions</nb_impressions>
 			<nb_interactions>Interactions</nb_interactions>
 		</metrics>
+		<metricsDocumentation>
+			<nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions>
+			<nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions>
+			<interaction_rate>The ratio of content impressions to interactions.</interaction_rate>
+		</metricsDocumentation>
 		<processedMetrics>
 			<interaction_rate>Interaction Rate</interaction_rate>
 		</processedMetrics>
diff --git a/plugins/CoreAdminHome/API.php b/plugins/CoreAdminHome/API.php
index 119d56d74f92b2a22da0349d7e68ad2b4e1c0039..18f5764a5a2c1441fa84fc1bc8ebf50aca53dfbb 100644
--- a/plugins/CoreAdminHome/API.php
+++ b/plugins/CoreAdminHome/API.php
@@ -17,9 +17,9 @@ use Piwik\CronArchive;
 use Piwik\Date;
 use Piwik\Db;
 use Piwik\Piwik;
+use Piwik\Segment;
 use Piwik\Scheduler\Scheduler;
 use Piwik\Site;
-use Psr\Log\LoggerInterface;
 
 /**
  * @method static \Piwik\Plugins\CoreAdminHome\API getInstance()
@@ -31,9 +31,15 @@ class API extends \Piwik\Plugin\API
      */
     private $scheduler;
 
-    public function __construct(Scheduler $scheduler)
+    /**
+     * @var ArchiveInvalidator
+     */
+    private $invalidator;
+
+    public function __construct(Scheduler $scheduler, ArchiveInvalidator $invalidator)
     {
         $this->scheduler = $scheduler;
+        $this->invalidator = $invalidator;
     }
 
     /**
@@ -50,28 +56,25 @@ class API extends \Piwik\Plugin\API
     }
 
     /**
-     * When tracking data in the past (using Tracking API), this function
-     * can be used to invalidate reports for the idSites and dates where new data
-     * was added.
-     * DEV: If you call this API, the UI should display the data correctly, but will process
-     *      in real time, which could be very slow after large data imports.
-     *      After calling this function via REST, you can manually force all data
-     *      to be reprocessed by visiting the script as the Super User:
-     *      http://example.net/piwik/misc/cron/archive.php?token_auth=$SUPER_USER_TOKEN_AUTH_HERE
-     * REQUIREMENTS: On large piwik setups, you will need in PHP configuration: max_execution_time = 0
-     *    We recommend to use an hourly schedule of the script.
-     *    More information: http://piwik.org/setup-auto-archiving/
+     * Invalidates report data, forcing it to be recomputed during the next archiving run.
      *
-     * @param string $idSites Comma separated list of idSite that have had data imported for the specified dates
-     * @param string $dates Comma separated list of dates to invalidate for all these websites
-     * @param string $period If specified (one of day, week, month, year, range) it will only invalidates archives for this period.
-     *                      Note: because week, month, year, range reports aggregate day reports then you need to specifically invalidate day reports to see
-     *                      other periods reports processed..
+     * Note: This is done automatically when tracking or importing visits in the past.
+     *
+     * @param string $idSites Comma separated list of site IDs to invalidate reports for.
+     * @param string $dates Comma separated list of dates of periods to invalidate reports for.
+     * @param string|bool $period The type of period to invalidate: either 'day', 'week', 'month', 'year', 'range'.
+     *                            The command will automatically cascade up, invalidating reports for parent periods as
+     *                            well. So invalidating a day will invalidate the week it's in, the month it's in and the
+     *                            year it's in, since those periods will need to be recomputed too.
+     * @param string|bool $segment Optional. The segment to invalidate reports for.
+     * @param bool $cascadeDown If true, child periods will be invalidated as well. So if it is requested to invalidate
+     *                          a month, then all the weeks and days within that month will also be invalidated. But only
+     *                          if this parameter is set.
      * @throws Exception
      * @return array
      * @hideExceptForSuperUser
      */
-    public function invalidateArchivedReports($idSites, $dates, $period = false)
+    public function invalidateArchivedReports($idSites, $dates, $period = false, $segment = false, $cascadeDown = false)
     {
         $idSites = Site::getIdSitesFromIdSitesString($idSites);
         if (empty($idSites)) {
@@ -80,19 +83,25 @@ class API extends \Piwik\Plugin\API
 
         Piwik::checkUserHasAdminAccess($idSites);
 
+        if (!empty($segment)) {
+            $segment = new Segment($segment, $idSites);
+        } else {
+            $segment = null;
+        }
+
         list($dateObjects, $invalidDates) = $this->getDatesToInvalidateFromString($dates);
 
-        $invalidator = new ArchiveInvalidator();
-        $output = $invalidator->markArchivesAsInvalidated($idSites, $dateObjects, $period);
+        $invalidationResult = $this->invalidator->markArchivesAsInvalidated($idSites, $dateObjects, $period, $segment, (bool)$cascadeDown);
 
+        $output = $invalidationResult->makeOutputLogs();
         if ($invalidDates) {
             $output[] = 'Warning: some of the Dates to invalidate were invalid: ' .
                 implode(", ", $invalidDates) . ". Piwik simply ignored those and proceeded with the others.";
         }
 
-        Site::clearCache();
+        Site::clearCache(); // TODO: is this needed? it shouldn't be needed...
 
-        return $output;
+        return $invalidationResult->makeOutputLogs();
     }
 
     /**
diff --git a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php b/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php
index fbfbcf1df05fc979da95578114d756636366ae85..cfbfdf82b148674432e55a6fa90d93a7ae1bc4ec 100644
--- a/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php
+++ b/plugins/CoreAdminHome/Commands/FixDuplicateLogActions.php
@@ -76,7 +76,7 @@ class FixDuplicateLogActions extends ConsoleCommand
     {
         parent::__construct();
 
-        $this->archiveInvalidator = $invalidator ?: new ArchiveInvalidator();
+        $this->archiveInvalidator = $invalidator ?: StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
         $this->duplicateActionRemover = $duplicateActionRemover ?: new DuplicateActionRemover();
         $this->actionsAccess = $actionsAccess ?: new Actions();
         $this->logger = $logger ?: StaticContainer::get('Psr\Log\LoggerInterface');
diff --git a/plugins/CoreAdminHome/Commands/InvalidateReportData.php b/plugins/CoreAdminHome/Commands/InvalidateReportData.php
new file mode 100644
index 0000000000000000000000000000000000000000..f424afc8e8fd7c8ed4d1eeb9ec3f4e7f9afadb89
--- /dev/null
+++ b/plugins/CoreAdminHome/Commands/InvalidateReportData.php
@@ -0,0 +1,200 @@
+<?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\CoreAdminHome\Commands;
+
+use Piwik\Container\StaticContainer;
+use Piwik\Date;
+use Piwik\Period;
+use Piwik\Period\Range;
+use Piwik\Piwik;
+use Piwik\Segment;
+use Piwik\Plugin\ConsoleCommand;
+use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
+use Piwik\Site;
+use Piwik\Period\Factory as PeriodFactory;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+
+/**
+ * Provides a simple interface for invalidating report data by date ranges, site IDs and periods.
+ */
+class InvalidateReportData extends ConsoleCommand
+{
+    const ALL_OPTION_VALUE = 'all';
+
+    protected function configure()
+    {
+        $this->setName('core:invalidate-report-data');
+        $this->setDescription('Invalidate archived report data by date range, site and period.');
+        $this->addOption('dates', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED,
+            'List of dates or date ranges to invalidate report data for, eg, 2015-01-03 or 2015-01-05,2015-02-12.');
+        $this->addOption('sites', null, InputOption::VALUE_REQUIRED,
+            'List of site IDs to invalidate report data for, eg, "1,2,3,4" or "all" for all sites.',
+            self::ALL_OPTION_VALUE);
+        $this->addOption('periods', null, InputOption::VALUE_REQUIRED,
+            'List of period types to invalidate report data for. Can be one or more of the following values: day, '
+            . 'week, month, year or "all" for all of them.',
+            self::ALL_OPTION_VALUE);
+        $this->addOption('segment', null, InputOption::VALUE_IS_ARRAY | InputOption::VALUE_REQUIRED,
+            'List of segments to invalidate report data for.');
+        $this->addOption('cascade', null, InputOption::VALUE_NONE,
+            'If supplied, invalidation will cascade, invalidating child period types even if they aren\'t specified in'
+            . ' --periods. For example, if --periods=week, --cascade will cause the days within those weeks to be '
+            . 'invalidated as well. If --periods=month, then weeks and days will be invalidated. Note: if a period '
+            . 'falls partly outside of a date range, then --cascade will also invalidate data for child periods '
+            . 'outside the date range. For example, if --dates=2015-09-14,2015-09-15 & --periods=week, --cascade will'
+            . ' also invalidate all days within 2015-09-13,2015-09-19, even those outside the date range.');
+        $this->addOption('dry-run', null, InputOption::VALUE_NONE, 'For tests. Runs the command w/o actually '
+            . 'invalidating anything.');
+        $this->setHelp('Invalidate archived report data by date range, site and period. Invalidated archive data will '
+            . 'be re-archived during the next core:archive run. If your log data has changed for some reason, this '
+            . 'command can be used to make sure reports are generated using the new, changed log data.');
+    }
+
+    protected function execute(InputInterface $input, OutputInterface $output)
+    {
+        $invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
+
+        $cascade = $input->getOption('cascade');
+        $dryRun = $input->getOption('dry-run');
+
+        $sites = $this->getSitesToInvalidateFor($input);
+        $periodTypes = $this->getPeriodTypesToInvalidateFor($input);
+        $dateRanges = $this->getDateRangesToInvalidateFor($input);
+        $segments = $this->getSegmentsToInvalidateFor($input, $sites);
+
+        foreach ($periodTypes as $periodType) {
+            foreach ($dateRanges as $dateRange) {
+                foreach ($segments as $segment) {
+                    $segmentStr = $segment ? $segment->getString() : '';
+
+                    $output->writeln("Invalidating $periodType periods in $dateRange [segment = $segmentStr]...");
+
+                    $dates = $this->getPeriodDates($periodType, $dateRange);
+
+                    if ($dryRun) {
+                        $output->writeln("[Dry-run] invalidating archives for site = [ " . implode(', ', $sites)
+                            . " ], dates = [ " . implode(', ', $dates) . " ], period = [ $periodType ], segment = [ "
+                            . "$segmentStr ], cascade = [ " . (int)$cascade . " ]");
+                    } else {
+                        $invalidationResult = $invalidator->markArchivesAsInvalidated($sites, $dates, $periodType, $segment, $cascade);
+
+                        if ($output->getVerbosity() > OutputInterface::VERBOSITY_NORMAL) {
+                            $output->writeln($invalidationResult->makeOutputLogs());
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private function getSitesToInvalidateFor(InputInterface $input)
+    {
+        $sites = $input->getOption('sites');
+
+        $siteIds = Site::getIdSitesFromIdSitesString($sites);
+        if (empty($siteIds)) {
+            throw new \InvalidArgumentException("Invalid --sites value: '$sites'.");
+        }
+
+        $allSiteIds = SitesManagerAPI::getInstance()->getAllSitesId();
+        foreach ($siteIds as $idSite) {
+            if (!in_array($idSite, $allSiteIds)) {
+                throw new \InvalidArgumentException("Invalid --sites value: '$sites', there are no sites with IDs = $idSite");
+            }
+        }
+
+        return $siteIds;
+    }
+
+    private function getPeriodTypesToInvalidateFor(InputInterface $input)
+    {
+        $periods = $input->getOption('periods');
+        if (empty($periods)) {
+            throw new \InvalidArgumentException("The --periods argument is required.");
+        }
+
+        if ($periods == self::ALL_OPTION_VALUE) {
+            $result = array_keys(Piwik::$idPeriods);
+            unset($result[4]); // remove 'range' period
+            return $result;
+        }
+
+        $periods = explode(',', $periods);
+        $periods = array_map('trim', $periods);
+
+        foreach ($periods as $periodIdentifier) {
+            if ($periodIdentifier == 'range') {
+                throw new \InvalidArgumentException(
+                    "Invalid period type: invalidating range periods is not currently supported.");
+            }
+
+            if (!isset(Piwik::$idPeriods[$periodIdentifier])) {
+                throw new \InvalidArgumentException("Invalid period type '$periodIdentifier' supplied in --periods.");
+            }
+        }
+
+        return $periods;
+    }
+
+    /**
+     * @param InputInterface $input
+     * @return Date[][]
+     */
+    private function getDateRangesToInvalidateFor(InputInterface $input)
+    {
+        $dateRanges = $input->getOption('dates');
+        if (empty($dateRanges)) {
+            throw new \InvalidArgumentException("The --dates option is required.");
+        }
+
+        return $dateRanges;
+    }
+
+    private function getPeriodDates($periodType, $dateRange)
+    {
+        if (!isset(Piwik::$idPeriods[$periodType])) {
+            throw new \InvalidArgumentException("Invalid period type '$periodType'.");
+        }
+
+        try {
+            $period = PeriodFactory::build($periodType, $dateRange);
+        } catch (\Exception $ex) {
+            throw new \InvalidArgumentException("Invalid date or date range specifier '$dateRange'", $code = 0, $ex);
+        }
+
+        $result = array();
+        if ($period instanceof Range) {
+            foreach ($period->getSubperiods() as $subperiod) {
+                $result[] = $subperiod->getDateStart();
+            }
+        } else {
+            $result[] = $period->getDateStart();
+        }
+        return $result;
+    }
+
+    private function getSegmentsToInvalidateFor(InputInterface $input, $idSites)
+    {
+        $segments = $input->getOption('segment');
+        $segments = array_map('trim', $segments);
+        $segments = array_unique($segments);
+
+        if (empty($segments)) {
+            return array(null);
+        }
+
+        $result = array();
+        foreach ($segments as $segmentString) {
+            $result[] = new Segment($segmentString, $idSites);
+        }
+        return $result;
+    }
+}
diff --git a/plugins/CoreAdminHome/CoreAdminHome.php b/plugins/CoreAdminHome/CoreAdminHome.php
index 75f1230cd68942a0e3635a2d758c77daa947b734..305506038a53234ebe979512c75e695f26bcdf94 100644
--- a/plugins/CoreAdminHome/CoreAdminHome.php
+++ b/plugins/CoreAdminHome/CoreAdminHome.php
@@ -38,7 +38,6 @@ class CoreAdminHome extends \Piwik\Plugin
     public function getStylesheetFiles(&$stylesheets)
     {
         $stylesheets[] = "libs/jquery/themes/base/jquery-ui.min.css";
-        $stylesheets[] = "plugins/CoreAdminHome/stylesheets/menu.less";
         $stylesheets[] = "plugins/Morpheus/stylesheets/base.less";
         $stylesheets[] = "plugins/Morpheus/stylesheets/main.less";
         $stylesheets[] = "plugins/CoreAdminHome/stylesheets/generalSettings.less";
diff --git a/plugins/CoreAdminHome/Menu.php b/plugins/CoreAdminHome/Menu.php
index 7994979450ade784fd8851bc0750acc506c8c1de..b4621e2f5e356e4fedc86531c03ade9666e7bd0a 100644
--- a/plugins/CoreAdminHome/Menu.php
+++ b/plugins/CoreAdminHome/Menu.php
@@ -23,10 +23,10 @@ class Menu extends \Piwik\Plugin\Menu
         $hasAdminAccess = Piwik::isUserHasSomeAdminAccess();
 
         if ($hasAdminAccess) {
-            $menu->addManageItem(null, "", $order = 1);
-            $menu->addSettingsItem(null, "", $order = 5);
-            $menu->addDiagnosticItem(null, "", $order = 10);
-            $menu->addDevelopmentItem(null, "", $order = 15);
+            $menu->addManageItem(null, array(), $order = 1);
+            $menu->addSettingsItem(null, array(), $order = 5);
+            $menu->addDiagnosticItem(null, array(), $order = 10);
+            $menu->addDevelopmentItem(null, array(), $order = 15);
 
             if (Piwik::hasUserSuperUserAccess()) {
                 $menu->addSettingsItem('General_General',
@@ -51,7 +51,8 @@ class Menu extends \Piwik\Plugin\Menu
                 $url = $this->urlForAction('generalSettings');
             }
 
-            $menu->addItem('CoreAdminHome_Administration', null, $url, 10);
+            $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-configure');
+            $menu->addItem('CoreAdminHome_Administration', null, $url, 980, Piwik::translate('CoreAdminHome_Administration'));
         }
     }
 
diff --git a/plugins/CoreAdminHome/lang/ko.json b/plugins/CoreAdminHome/lang/ko.json
index 9158cdfb30b629287aaa2409a0d52a4f1a4d810f..d44b2797a7795529e538fc6b46080f11d87e7fcc 100644
--- a/plugins/CoreAdminHome/lang/ko.json
+++ b/plugins/CoreAdminHome/lang/ko.json
@@ -1,7 +1,9 @@
 {
     "CoreAdminHome": {
         "Administration": "관리",
+        "ArchivingSettings": "아카이브 설정",
         "BrandingSettings": "브랜딩 설정",
+        "ReleaseChannel": "릴리즈 채널",
         "ClickHereToOptIn": "클릭하여 허용합니다.",
         "ClickHereToOptOut": "클릭하여 차단합니다.",
         "CustomLogoFeedbackInfo": "Piwik 로고를 변경하거나 상단 메뉴의 %s 링크도 숨길 수 있습니다. %s 플러그인 관리 %s 페이지에서 피드백 플러그인을 비활성화세요.",
@@ -21,10 +23,13 @@
         "OptOutExplanationBis": "HTML 코드는 방문자의 브라우저에 차단 Cookie를 설정하는 Piwik 차단 링크를 ​​포함 iFrame을 표시합니다. iFrame에서 표시되는 내용을 표시하려면 %s여기를 클릭%s합니다.",
         "OptOutForYourVisitors": "방문자의 Piwik 차단",
         "PiwikIsInstalledAt": "Piwik가 설치되어 있습니다",
+        "PluginSettings": "플러그인 설정",
+        "SystemPluginSettings": "시스템 플러그인 설정",
         "TrackAGoal": "목표 추적",
         "TrackingCode": "추적 코드",
         "TrustedHostConfirm": "신뢰할 수 있는 Piwik 호스트네임으로 변경하시겠습니까?",
         "TrustedHostSettings": "신뢰할 수 있는 Piwik 호스트네임",
+        "UpdateSettings": "업데이트 설정",
         "UseCustomLogo": "로고 변경하기",
         "ValidPiwikHostname": "유효한 Piwik 호스트네임",
         "YouAreOptedIn": "허용된 상태입니다.",
diff --git a/plugins/CoreAdminHome/stylesheets/generalSettings.less b/plugins/CoreAdminHome/stylesheets/generalSettings.less
index eac16b6c4c01bd7a1a8ddec95b4a7003167661e3..9d232f789b65bf2229115a06f3a0478328674229 100644
--- a/plugins/CoreAdminHome/stylesheets/generalSettings.less
+++ b/plugins/CoreAdminHome/stylesheets/generalSettings.less
@@ -13,9 +13,6 @@
 }
 
 #content.admin {
-    margin: 0 0 0 260px;
-    padding: 0 0 40px;
-    display: table;
     font-size: 13px;
 
     // Fix the <pre> blocks because of the display: table
@@ -25,8 +22,8 @@
 }
 
 .admin #header_message {
-    margin-top: 10px;
-    margin-right: 10px;
+    margin-top: 8px;
+    margin-right: 8px;
 }
 
 table.admin {
@@ -92,9 +89,9 @@ table.admin tbody td:hover, table.admin tbody th:hover {
     width: 100%;
 
     &:first-of-type:not(.secondary) {
-        margin-top: 17px;
+        margin-top: 7px;
         margin-bottom: 16px;
-        border-bottom: 1px solid #DADADA;
+        border-bottom: 1px solid @theme-color-background-tinyContrast;
     }
 }
 
@@ -162,11 +159,6 @@ table.admin tbody td:hover, table.admin tbody th:hover {
     margin-left: 0px;
 }
 
-/* to override .admin a */
-.admin .sites_autocomplete a {
-    color: #255792;
-}
-
 /* trusted host styles */
 #trustedHostSettings input {
     width: 238px;
diff --git a/plugins/CoreAdminHome/stylesheets/menu.less b/plugins/CoreAdminHome/stylesheets/menu.less
deleted file mode 100644
index af76bc82816fc42f784978fcd9f59b87521edd73..0000000000000000000000000000000000000000
--- a/plugins/CoreAdminHome/stylesheets/menu.less
+++ /dev/null
@@ -1,71 +0,0 @@
-#container {
-  clear: left;
-}
-
-.Menu--admin {
-    padding: 0;
-    float: left;
-    width: 240px;
-}
-
-.Menu--admin > .Menu-tabList {
-    -moz-background-size: 5px 100%;
-    background-size: 5px 100%;
-    background-position: 0 0, 100% 0;
-    background-repeat: no-repeat;
-}
-
-.Menu--admin > .Menu-tabList {
-    padding-left: 5px;
-    margin-bottom: 0;
-    margin-top: 0.1em;
-    border: 1px solid @theme-color-background-lowContrast;
-    border-radius: 5px;
-    border-left: 0px;
-}
-
-.Menu--admin > .Menu-tabList li {
-    list-style: none;
-    margin: 0;
-}
-
-.Menu--admin > .Menu-tabList > li {
-    padding-bottom: 5px;
-}
-
-.Menu--admin > .Menu-tabList > li > a,
-.Menu--admin > .Menu-tabList > li > span {
-    text-decoration: none;
-    border-bottom: 1px dotted #778;
-    display: block;
-    padding: 5px 10px;
-    font-size: 18px;
-    color: #7E7363;
-}
-
-.Menu--admin > .Menu-tabList li li a {
-    text-decoration: none;
-    padding: 0.6em 0.9em;
-    font-size: 14px;
-    display: block;
-}
-
-.Menu--admin > .Menu-tabList li li a:link,
-.Menu--admin > .Menu-tabList li li a:visited {
-    color: #000;
-}
-
-.Menu--admin > .Menu-tabList li li a:hover,
-.Menu--admin > .Menu-tabList li li a.active {
-    color: @theme-color-menu-contrast-textActive !important;
-    background: @theme-color-menu-contrast-background;
-    border-color: #000;
-}
-
-.Menu--admin > .Menu-tabList li li a:hover {
-    text-decoration: underline;
-}
-
-.Menu--admin > .Menu-tabList li li a.current {
-    background: #defdbb;
-}
diff --git a/plugins/CoreAdminHome/templates/_menu.twig b/plugins/CoreAdminHome/templates/_menu.twig
deleted file mode 100644
index 080f36e93c1ee47da52ccaba31992889b78adecf..0000000000000000000000000000000000000000
--- a/plugins/CoreAdminHome/templates/_menu.twig
+++ /dev/null
@@ -1,3 +0,0 @@
-{% import '@CoreHome/macros.twig' as corehome %}
-
-{{ corehome.sidebarMenu(adminMenu, currentModule, currentAction) }}
\ No newline at end of file
diff --git a/plugins/CoreAdminHome/tests/Framework/Mock/API.php b/plugins/CoreAdminHome/tests/Framework/Mock/API.php
index 70070c50e9b27855c6deacd23007b5b80a7f740f..0fc3f106b070c8258b9eaa75e7a794df245efb73 100644
--- a/plugins/CoreAdminHome/tests/Framework/Mock/API.php
+++ b/plugins/CoreAdminHome/tests/Framework/Mock/API.php
@@ -14,7 +14,7 @@ class API extends \Piwik\Plugins\CoreAdminHome\API
 {
     private $invalidatedReports = array();
 
-    public function invalidateArchivedReports($idSites, $dates, $period = false)
+    public function invalidateArchivedReports($idSites, $dates, $period = false, $segment = false, $cascadeDown = false)
     {
         $this->invalidatedReports[] = func_get_args();
     }
diff --git a/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f565b7105b5abf08b743531a5e8826db1110385a
--- /dev/null
+++ b/plugins/CoreAdminHome/tests/Integration/Commands/InvalidateReportDataTest.php
@@ -0,0 +1,239 @@
+<?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\CoreAdminHome\tests\Integration\Commands;
+
+use Piwik\Tests\Framework\Fixture;
+use Piwik\Tests\Framework\TestCase\ConsoleCommandTestCase;
+
+/**
+ * @group CoreAdminHome
+ * @group CoreAdminHome_Integration
+ */
+class InvalidateReportDataTest extends ConsoleCommandTestCase
+{
+    public static function setUpBeforeClass()
+    {
+        parent::setUpBeforeClass();
+
+        Fixture::createWebsite('2012-01-01 00:00:00');
+        Fixture::createWebsite('2012-01-01 00:00:00');
+        Fixture::createWebsite('2012-01-01 00:00:00');
+    }
+
+    /**
+     * @dataProvider getInvalidDateRanges
+     */
+    public function test_Command_FailsWhenAnInvalidDateRangeIsUsed($invalidDateRange)
+    {
+        $code = $this->applicationTester->run(array(
+            'command' => 'core:invalidate-report-data',
+            '--dates' => array($invalidDateRange),
+            '--periods' => 'day',
+            '--sites' => '1',
+            '--dry-run' => true,
+            '-vvv' => true,
+        ));
+
+        $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+        $this->assertContains("Invalid date or date range specifier", $this->applicationTester->getDisplay());
+    }
+
+    public function getInvalidDateRanges()
+    {
+        return array(
+            array('garbage'),
+            array('2012-01-03 2013-02-01'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidPeriodTypes
+     */
+    public function test_Command_FailsWhenAnInvalidPeriodTypeIsUsed($invalidPeriodType)
+    {
+        $code = $this->applicationTester->run(array(
+            'command' => 'core:invalidate-report-data',
+            '--dates' => '2012-01-01',
+            '--periods' => $invalidPeriodType,
+            '--sites' => '1',
+            '--dry-run' => true,
+            '-vvv' => true,
+        ));
+
+        $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+        $this->assertContains("Invalid period type", $this->applicationTester->getDisplay());
+    }
+
+    public function getInvalidPeriodTypes()
+    {
+        return array(
+            array('cranberries'),
+            array('range'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidSiteLists
+     */
+    public function test_Command_FailsWhenAnInvalidSiteListIsUsed($invalidSites)
+    {
+        $code = $this->applicationTester->run(array(
+            'command' => 'core:invalidate-report-data',
+            '--dates' => '2012-01-01',
+            '--periods' => 'day',
+            '--sites' => $invalidSites,
+            '--dry-run' => true,
+            '-vvv' => true,
+        ));
+
+        $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+        $this->assertContains("Invalid --sites value", $this->applicationTester->getDisplay());
+    }
+
+    public function getInvalidSiteLists()
+    {
+        return array(
+            array('wolfalice'),
+            array(','),
+            array('1,500'),
+        );
+    }
+
+    public function test_Command_FailsWhenAnInvalidSegmentIsUsed()
+    {
+        $code = $this->applicationTester->run(array(
+            'command' => 'core:invalidate-report-data',
+            '--dates' => '2012-01-01',
+            '--periods' => 'day',
+            '--sites' => '1',
+            '--segment' => array('ablksdjfdslkjf'),
+            '--dry-run' => true,
+            '-vvv' => true,
+        ));
+
+        $this->assertNotEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+        $this->assertContains("The segment 'ablksdjfdslkjf' is not valid", $this->applicationTester->getDisplay());
+    }
+
+    /**
+     * @dataProvider getTestDataForSuccessTests
+     */
+    public function test_Command_InvalidatesCorrectSitesAndDates($dates, $periods, $sites, $cascade, $segments, $expectedOutputs)
+    {
+        $code = $this->applicationTester->run(array(
+            'command' => 'core:invalidate-report-data',
+            '--dates' => $dates,
+            '--periods' => $periods,
+            '--sites' => $sites,
+            '--cascade' => $cascade,
+            '--segment' => $segments ?: array(),
+            '--dry-run' => true,
+            '-vvv' => true,
+        ));
+
+        $this->assertEquals(0, $code, $this->getCommandDisplayOutputErrorMessage());
+
+        foreach ($expectedOutputs as $output) {
+            $this->assertContains($output, $this->applicationTester->getDisplay());
+        }
+    }
+
+    public function getTestDataForSuccessTests()
+    {
+        return array(
+
+            array( // no cascade, single site + single day
+                array('2012-01-01'),
+                'day',
+                '1',
+                false,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [  ]',
+                ),
+            ),
+
+            array( // no cascade, single site + single day
+                array('2012-01-01'),
+                'day',
+                '1',
+                true,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2012-01-01 ], period = [ day ], segment = [  ]',
+                ),
+            ),
+
+            array( // no cascade, single site, date, period
+                array('2012-01-01'),
+                'week',
+                '1',
+                false,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1 ], dates = [ 2011-12-26 ], period = [ week ], segment = [  ]',
+                ),
+            ),
+
+            array( // no cascade, multiple site, date & period
+                array('2012-01-01,2012-02-05', '2012-01-26,2012-01-27', '2013-03-19'),
+                'month,week',
+                '1,3',
+                false,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01, 2012-02-01 ], period = [ month ], segment = [  ], cascade = [ 0 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-01 ], period = [ month ], segment = [  ], cascade = [ 0 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-01 ], period = [ month ], segment = [  ], cascade = [ 0 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09, 2012-01-16, 2012-01-23, 2012-01-30 ], period = [ week ], segment = [  ], cascade = [ 0 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2012-01-23 ], period = [ week ], segment = [  ], cascade = [ 0 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 3 ], dates = [ 2013-03-18 ], period = [ week ], segment = [  ], cascade = [ 0 ]',
+                ),
+            ),
+
+            array( // cascade, single site, date, period
+                array('2012-01-30,2012-02-10'),
+                'week',
+                '2',
+                true,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 2 ], dates = [ 2012-01-30, 2012-02-06 ], period = [ week ], segment = [  ], cascade = [ 1 ]',
+                ),
+            ),
+
+            array( // cascade, multiple site, date & period
+                array('2012-02-03,2012-02-04', '2012-03-15'),
+                'month,week,day',
+                'all',
+                true,
+                null,
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-01 ], period = [ month ], segment = [  ], cascade = [ 1 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-01 ], period = [ month ], segment = [  ], cascade = [ 1 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-01-30 ], period = [ week ], segment = [  ], cascade = [ 1 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-12 ], period = [ week ], segment = [  ], cascade = [ 1 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-02-03, 2012-02-04 ], period = [ day ], segment = [  ], cascade = [ 1 ]',
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2012-03-15 ], period = [ day ], segment = [  ], cascade = [ 1 ]',
+                ),
+            ),
+
+            array( // cascade, one week, date & period + segment
+                array('2012-01-01,2012-01-14'),
+                'week',
+                'all',
+                true,
+                array('browserCode==FF'),
+                array(
+                    '[Dry-run] invalidating archives for site = [ 1, 2, 3 ], dates = [ 2011-12-26, 2012-01-02, 2012-01-09 ], period = [ week ], segment = [ browserCode==FF ], cascade = [ 1 ]',
+                ),
+            ),
+        );
+    }
+}
diff --git a/plugins/CoreHome/Categories/ActionsCategory.php b/plugins/CoreHome/Categories/ActionsCategory.php
index e995df110d89255d7ca72ecb1c8a86f05b4c2af4..a7f1c57276c9a793960b9c6dca8aee4169653ffe 100644
--- a/plugins/CoreHome/Categories/ActionsCategory.php
+++ b/plugins/CoreHome/Categories/ActionsCategory.php
@@ -14,4 +14,5 @@ class ActionsCategory extends Category
 {
     protected $id = 'General_Actions';
     protected $order = 10;
+    protected $icon = 'icon-reporting-actions';
 }
diff --git a/plugins/CoreHome/Categories/VisitorsCategory.php b/plugins/CoreHome/Categories/VisitorsCategory.php
index c4604c40354af34d2cb0abafefedcbf5c2fddffd..1327c7b95564c157c173efb8ea3d528d3a3d8beb 100644
--- a/plugins/CoreHome/Categories/VisitorsCategory.php
+++ b/plugins/CoreHome/Categories/VisitorsCategory.php
@@ -14,4 +14,5 @@ class VisitorsCategory extends Category
 {
     protected $id = 'General_Visitors';
     protected $order = 5;
+    protected $icon = 'icon-reporting-visitors';
 }
diff --git a/plugins/CoreHome/Controller.php b/plugins/CoreHome/Controller.php
index a0866c0ff20e394ac7a0297638e60cead593c33a..cf4be9b446895e7a59ad7634805cbc79f68ef1d8 100644
--- a/plugins/CoreHome/Controller.php
+++ b/plugins/CoreHome/Controller.php
@@ -131,6 +131,7 @@ class Controller extends \Piwik\Plugin\Controller
     {
         $view = new View('@CoreHome/getDefaultIndexView');
         $this->setGeneralVariablesView($view);
+        $view->showMenu = true;
         $view->dashboardSettingsControl = new DashboardManagerControl();
         $view->content = '';
         return $view;
diff --git a/plugins/CoreHome/CoreHome.php b/plugins/CoreHome/CoreHome.php
index c8b2b428d0d8648ea01855ad1ba2edab81070ef8..519891acb043ff2da7d3c8242dbb0739e04b3832 100644
--- a/plugins/CoreHome/CoreHome.php
+++ b/plugins/CoreHome/CoreHome.php
@@ -68,7 +68,6 @@ class CoreHome extends \Piwik\Plugin
         $stylesheets[] = "plugins/Morpheus/stylesheets/base.less";
         $stylesheets[] = "plugins/Morpheus/stylesheets/main.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/coreHome.less";
-        $stylesheets[] = "plugins/CoreHome/stylesheets/menu.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/dataTable.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/cloud.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css";
@@ -79,9 +78,12 @@ class CoreHome extends \Piwik\Plugin
         $stylesheets[] = "plugins/CoreHome/stylesheets/sparklineColors.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/notification.less";
         $stylesheets[] = "plugins/CoreHome/stylesheets/zen-mode.less";
+        $stylesheets[] = "plugins/CoreHome/stylesheets/layout.less";
         $stylesheets[] = "plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less";
         $stylesheets[] = "plugins/CoreHome/angularjs/dialogtoggler/ngdialog.less";
         $stylesheets[] = "plugins/CoreHome/angularjs/notification/notification.directive.less";
+        $stylesheets[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.less";
+        $stylesheets[] = "plugins/CoreHome/angularjs/selector/selector.directive.less";
     }
 
     public function getJsFiles(&$jsFiles)
@@ -121,6 +123,7 @@ class CoreHome extends \Piwik\Plugin
         $jsFiles[] = "plugins/CoreHome/javascripts/color_manager.js";
         $jsFiles[] = "plugins/CoreHome/javascripts/notification.js";
         $jsFiles[] = "plugins/CoreHome/javascripts/notification_parser.js";
+        $jsFiles[] = "plugins/CoreHome/javascripts/numberFormatter.js";
 
         $jsFiles[] = "plugins/CoreHome/angularjs/piwikApp.config.js";
 
@@ -190,6 +193,11 @@ class CoreHome extends \Piwik\Plugin
         $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js";
         $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js";
         $jsFiles[] = "plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js";
+
+        $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.controller.js";
+        $jsFiles[] = "plugins/CoreHome/angularjs/quick-access/quick-access.directive.js";
+
+        $jsFiles[] = "plugins/CoreHome/angularjs/selector/selector.directive.js";
     }
 
     public function getClientSideTranslationKeys(&$translationKeys)
@@ -198,8 +206,11 @@ class CoreHome extends \Piwik\Plugin
         $translationKeys[] = 'General_Loading';
         $translationKeys[] = 'General_Show';
         $translationKeys[] = 'General_Hide';
+        $translationKeys[] = 'General_Website';
+        $translationKeys[] = 'General_ChooseWebsite';
         $translationKeys[] = 'Intl_Year_Short';
         $translationKeys[] = 'General_MultiSitesSummary';
+        $translationKeys[] = 'General_SearchNoResults';
         $translationKeys[] = 'CoreHome_YouAreUsingTheLatestVersion';
         $translationKeys[] = 'CoreHome_IncludeRowsWithLowPopulation';
         $translationKeys[] = 'CoreHome_ExcludeRowsWithLowPopulation';
@@ -211,6 +222,7 @@ class CoreHome extends \Piwik\Plugin
         $translationKeys[] = 'CoreHome_UnFlattenDataTable';
         $translationKeys[] = 'CoreHome_ExternalHelp';
         $translationKeys[] = 'CoreHome_ClickToEditX';
+        $translationKeys[] = 'CoreHome_Menu';
         $translationKeys[] = 'SitesManager_NotFound';
         $translationKeys[] = 'Annotations_ViewAndAddAnnotations';
         $translationKeys[] = 'General_RowEvolutionRowActionTooltipTitle';
@@ -265,6 +277,7 @@ class CoreHome extends \Piwik\Plugin
         $translationKeys[] = 'Intl_Day_Min_StandAlone_5';
         $translationKeys[] = 'Intl_Day_Min_StandAlone_6';
         $translationKeys[] = 'Intl_Day_Min_StandAlone_7';
+        $translationKeys[] = 'General_And';
         $translationKeys[] = 'General_Search';
         $translationKeys[] = 'General_Clear';
         $translationKeys[] = 'General_MoreDetails';
@@ -282,9 +295,14 @@ class CoreHome extends \Piwik\Plugin
         $translationKeys[] = 'General_LoadingData';
         $translationKeys[] = 'General_ErrorRequest';
         $translationKeys[] = 'General_YourChangesHaveBeenSaved';
+        $translationKeys[] = 'General_LearnMore';
         $translationKeys[] = 'CoreHome_UndoPivotBySubtable';
         $translationKeys[] = 'CoreHome_PivotBySubtable';
         $translationKeys[] = 'General_LearnMore';
         $translationKeys[] = 'CoreHome_NoSuchPage';
+        $translationKeys[] = 'CoreHome_QuickAccessTitle';
+        $translationKeys[] = 'CoreHome_Segments';
+        $translationKeys[] = 'CoreHome_MenuEntries';
+        $translationKeys[] = 'SitesManager_Sites';
     }
 }
diff --git a/plugins/CoreHome/DataTableRowAction/RowEvolution.php b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
index 9b80f92c87917e614cf8207615ce7015fa441cd8..d73c5c21580c7620240d70bac2ff108409d5f682 100644
--- a/plugins/CoreHome/DataTableRowAction/RowEvolution.php
+++ b/plugins/CoreHome/DataTableRowAction/RowEvolution.php
@@ -15,6 +15,7 @@ use Piwik\Common;
 use Piwik\DataTable;
 use Piwik\Date;
 use Piwik\Metrics;
+use Piwik\NumberFormatter;
 use Piwik\Period\Factory as PeriodFactory;
 use Piwik\Piwik;
 use Piwik\Plugins\CoreVisualizations\Visualizations\JqplotGraph\Evolution as EvolutionViz;
@@ -231,7 +232,10 @@ class RowEvolution
             $change = isset($metricData['change']) ? $metricData['change'] : false;
 
             list($first, $last) = $this->getFirstAndLastDataPointsForMetric($metric);
-            $details = Piwik::translate('RowEvolution_MetricBetweenText', array($first, $last));
+            $details = Piwik::translate('RowEvolution_MetricBetweenText', array(
+                NumberFormatter::getInstance()->format($first),
+                NumberFormatter::getInstance()->format($last)
+            ));
 
             if ($change !== false) {
                 $lowerIsBetter = Metrics::isLowerValueBetter($metric);
@@ -258,7 +262,11 @@ class RowEvolution
             $min = isset($metricData['min']) ? $metricData['min'] : 0;
             $min .= $unit;
             $max .= $unit;
-            $minmax = Piwik::translate('RowEvolution_MetricMinMax', array($metricData['name'], $min, $max));
+            $minmax = Piwik::translate('RowEvolution_MetricMinMax', array(
+                $metricData['name'],
+                NumberFormatter::getInstance()->formatNumber($min),
+                NumberFormatter::getInstance()->formatNumber($max)
+            ));
 
             $newMetric = array(
                 'label'     => $metricData['name'],
diff --git a/plugins/CoreHome/Menu.php b/plugins/CoreHome/Menu.php
index 83e5d053d66c38f87da1522f01fd18ba3d0580e3..20d9ac8eb8ba9d10801eb54db2f44ea38593b851 100644
--- a/plugins/CoreHome/Menu.php
+++ b/plugins/CoreHome/Menu.php
@@ -27,24 +27,29 @@ class Menu extends \Piwik\Plugin\Menu
         }
 
         if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) {
-            $menu->addItem('General_Help', null, array('module' => 'Feedback', 'action' => 'index'));
+            $menu->registerMenuIcon('General_Help', 'icon-help');
+            $menu->addItem('General_Help', null, array('module' => 'Feedback', 'action' => 'index'), $order = 990, Piwik::translate('General_Help'));
         }
 
+        $menu->registerMenuIcon($login, 'icon-user');
+
         if (Piwik::isUserIsAnonymous()) {
-            if (Plugin\Manager::getInstance()->isPluginActivated('Feedback')) {
-                $menu->addItem($login, null, array('module' => 'Feedback', 'action' => 'index'), 998);
+            if (Plugin\Manager::getInstance()->isPluginActivated('ScheduledReports')) {
+                $menu->addItem($login, null, array('module' => 'ScheduledReports', 'action' => 'index'), 970, $login);
             } else {
-                $menu->addItem($login, null, array('module' => 'API', 'action' => 'listAllAPI'), 998);
+                $menu->addItem($login, null, array('module' => 'API', 'action' => 'listAllAPI'), 970, $login);
             }
         } else {
-            $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 998);
+            $menu->addItem($login, null, array('module' => 'UsersManager', 'action' => 'userSettings'), 970, $login);
         }
 
         $module = $this->getLoginModule();
         if (Piwik::isUserIsAnonymous()) {
-            $menu->addItem('Login_LogIn', null, array('module' => $module, 'action' => false), 999);
+            $menu->registerMenuIcon('Login_LogIn', 'icon-sign-in');
+            $menu->addItem('Login_LogIn', null, array('module' => $module, 'action' => false), 1000, Piwik::translate('Login_LogIn'));
         } else {
-            $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 999);
+            $menu->registerMenuIcon('General_Logout', 'icon-sign-out');
+            $menu->addItem('General_Logout', null, array('module' => $module, 'action' => 'logout', 'idSite' => null), 1000, Piwik::translate('General_Logout'));
         }
     }
 
diff --git a/plugins/CoreHome/angularjs/common/services/piwik-api.js b/plugins/CoreHome/angularjs/common/services/piwik-api.js
index 9d4b3f8fc4803ebaca749f5f24f8b73e53607f0a..8bb14808c5d1ffc1c79efe2fd0b599544faa4474 100644
--- a/plugins/CoreHome/angularjs/common/services/piwik-api.js
+++ b/plugins/CoreHome/angularjs/common/services/piwik-api.js
@@ -4,6 +4,10 @@
  * @link http://piwik.org
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  */
+
+// see https://github.com/piwik/piwik/issues/5094 used to detect an ad blocker
+var hasBlockedContent = false;
+
 (function () {
     angular.module('piwikApp.service').factory('piwikApi', piwikApiService);
 
diff --git a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less
index 054c0bdba0024f8e90dd9888d8addbf886876639..4ffb8326f0ea06517a65731e6649307bdeb98684 100644
--- a/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less
+++ b/plugins/CoreHome/angularjs/enrichedheadline/enrichedheadline.directive.less
@@ -2,6 +2,16 @@
     display: none;
 }
 
+[piwik-enriched-headline] {
+    visibility: hidden;
+    height: 47px;
+}
+
+[piwik-enriched-headline].ng-isolate-scope {
+    visibility: visible;
+    height: auto;
+}
+
 .enrichedHeadline {
     min-height: 22px;
 
diff --git a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html
index 14191ac20ed48d900bd1fc74abfae73e78c1a137..b9084dbe1033a6c896e45b4cf07aa10873a9061f 100644
--- a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html
+++ b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.html
@@ -5,7 +5,7 @@
           title="{{ tooltip }}"
           ng-bind-html="menuTitle"/>
 
-    <div class="items" ng-show="view.showItems">
+    <div class="items borderedControl" ng-show="view.showItems">
         <div class="search" ng-if="showSearch && view.showItems">
             <input type="text"
                    piwik-focus-if="view.showItems"
diff --git a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less
index da8b79a1fc00a46f28767a33e39d5259bfbc864c..a36d00c0f5b5772291f4053d48cd6b8e6198da39 100644
--- a/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less
+++ b/plugins/CoreHome/angularjs/menudropdown/menudropdown.directive.less
@@ -25,9 +25,9 @@
   }
 
   .items {
-    z-index: 21;
+    z-index: 200;
     position: absolute;
-    border: 1px solid @color-silver-l80 !important;
+    border: 1px solid @color-silver-l80;
     background: @theme-color-background-base;
     max-height: 400px;
     overflow-y: auto;
@@ -41,7 +41,7 @@
       .search_ico {
         position: absolute;
         right: 25px;
-        top: 22px;
+        top: 27px;
         margin: 0px;
         left: initial;
       }
@@ -74,11 +74,11 @@
       text-align: left;
 
       &:hover {
-        background: @color-silver-l80;
+        background: @theme-color-background-tinyContrast;
       }
 
       &.active {
-        background-color: @color-silver-l80;
+        background-color: @theme-color-background-tinyContrast;
       }
 
       &.category {
diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js
new file mode 100644
index 0000000000000000000000000000000000000000..9e1fefba82c4960b7c532597922e67efb78446ab
--- /dev/null
+++ b/plugins/CoreHome/angularjs/quick-access/quick-access.controller.js
@@ -0,0 +1,78 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+(function () {
+    angular.module('piwikApp').controller('QuickAccessController', QuickAccessController);
+
+    QuickAccessController.$inject = ['$scope', '$filter', 'siteSelectorModel'];
+
+    function QuickAccessController($scope, $filter, siteSelectorModel){
+
+        this.menuItems = [];
+        this.numMenuItems = 0;
+        this.sitesModel = siteSelectorModel;
+
+        this.onKeypress = function (event) {
+            if (38 == event.which) {
+                $scope.highlightPreviousItem();
+                event.preventDefault();
+            } else if (40 == event.which) {
+                $scope.highlightNextItem();
+                event.preventDefault();
+            } else if (13 == event.which) {
+                $scope.clickQuickAccessMenuItem();
+            }
+        };
+
+        this.searchMenu = function (searchTerm) {
+            searchTerm = searchTerm.toLowerCase();
+
+            var index = -1;
+            var menuItemsIndex = {};
+            var menuItems = [];
+
+            var moveToCategory = function (i, submenuItem) {
+                submenuItem = angular.copy(submenuItem); // force rerender of element to prevent weird side effects
+                submenuItem.menuIndex = ++index; // needed for proper highlighting with arrow keys
+
+                var category = submenuItem.category;
+                if (!(category in menuItemsIndex)) {
+                    menuItems.push({title: category, items: []});
+                    menuItemsIndex[category] = menuItems.length - 1;
+                }
+
+                var indexOfCategory = menuItemsIndex[category];
+                menuItems[indexOfCategory].items.push(submenuItem);
+            };
+
+            $scope.resetSearchIndex();
+
+            if ($scope.hasSitesSelector) {
+                this.sitesModel.searchSite(searchTerm);
+            }
+
+            var topMenuItems  = $filter('filter')($scope.getTopMenuItems(), searchTerm);
+            var leftMenuItems = $filter('filter')($scope.getLeftMenuItems(), searchTerm);
+            var segmentItems  = $filter('filter')($scope.getSegmentItems(), searchTerm);
+
+            $.each(topMenuItems, moveToCategory);
+            $.each(leftMenuItems, moveToCategory);
+            $.each(segmentItems, moveToCategory);
+
+            this.numMenuItems = topMenuItems.length + leftMenuItems.length + segmentItems.length;
+            this.menuItems = menuItems;
+        };
+
+        this.selectSite = function (idsite) {
+            this.sitesModel.loadSite(idsite);
+        };
+
+        this.selectMenuItem = function (index) {
+            $scope.selectMenuItem(index);
+        };
+
+    }
+})();
diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html
new file mode 100644
index 0000000000000000000000000000000000000000..1e76f4fe7d16ff058d0f72f603939555db3d076d
--- /dev/null
+++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.html
@@ -0,0 +1,36 @@
+<div class="quick-access" title="{{ quickAccessTitle }}"
+     ng-class="{active: view.searchActive, expanded: view.searchActive}"
+     piwik-focus-anywhere-but-here="view.searchActive = false;">
+    <span class="icon-search" ng-hide="search.term || view.searchActive"
+          ng-mouseenter="view.searchActive=true"></span>
+    <input ng-keydown="quickAccess.onKeypress($event)"
+           ng-change="view.searchActive=true;quickAccess.searchMenu(search.term)"
+           ng-focus="view.searchActive=true"
+           ng-model="search.term" piwik-focus-if="view.searchActive"
+           type="text"/>
+    <ul ng-hide="!search.term || !view.searchActive || (quickAccess.numMenuItems > 0) || (quickAccess.sitesModel.sites | length)">
+        <li class="no-result">{{ 'General_SearchNoResults' | translate }}</li>
+    </ul>
+    <ul ng-show="search.term && view.searchActive" ng-repeat="subcategory in quickAccess.menuItems">
+        <li class="quick-access-category"
+            ng-click="search.term = subcategory.title;quickAccess.searchMenu(search.term)">{{ subcategory.title }}</li>
+        <li class="result"
+            ng-class="{selected: submenuEntry.menuIndex == search.index}"
+            ng-mouseenter="search.index=submenuEntry.menuIndex"
+            ng-click="quickAccess.selectMenuItem(submenuEntry.index)"
+            ng-repeat="submenuEntry in subcategory.items"><a>{{ submenuEntry.name | trim }}</a></li>
+    </ul>
+    <ul ng-show="search.term && view.searchActive">
+        <li class="quick-access-category websiteCategory"
+            ng-show="hasSitesSelector && ((quickAccess.sitesModel.sites | length) || quickAccess.sitesModel.isLoading)"
+                >{{ 'SitesManager_Sites' | translate }}</li>
+        <li class="no-result"
+            ng-show="hasSitesSelector && quickAccess.sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li>
+        <li class="result"
+            ng-show="hasSitesSelector && !quickAccess.sitesModel.isLoading"
+            ng-mouseenter="search.index=(quickAccess.numMenuItems + $index)"
+            ng-class="{selected: (quickAccess.numMenuItems + $index) == search.index}"
+            ng-click="quickAccess.selectSite(site.idsite)"
+            ng-repeat="site in quickAccess.sitesModel.sites"><a ng-bind-html="site.name"></a></li>
+    </ul>
+</div>
\ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js
new file mode 100644
index 0000000000000000000000000000000000000000..35df1d2ef0e03c43577ba31342cd07a4ec07975c
--- /dev/null
+++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.js
@@ -0,0 +1,282 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+/**
+ * Usage:
+ * <div piwik-dialog="showDialog">...</div>
+ * Will show dialog once showDialog evaluates to true.
+ *
+ * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed.
+ */
+(function () {
+    angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective);
+
+    QuickAccessDirective.$inject = ['$rootElement', '$timeout', 'piwik', '$filter'];
+
+    function QuickAccessDirective ($rootElement, $timeout, piwik, $filter) {
+
+        return {
+            restrict: 'A',
+            replace: true,
+            scope: {},
+            templateUrl: 'plugins/CoreHome/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster,
+            controller: 'QuickAccessController',
+            controllerAs: 'quickAccess',
+            link: function (scope, element, attrs) {
+
+                var menuIndex = -1; // the menu index is used to identify which element to click
+                var topMenuItems = []; // cache for top menu items
+                var leftMenuItems = []; // cache for left menu items
+                var segmentItems = []; // cache for segment items
+                var hasSegmentSelector = angular.element('.segmentEditorPanel').length;
+                scope.hasSitesSelector = angular.element('.top_controls [piwik-siteselector]').length;
+
+
+                var translate = $filter('translate');
+                var searchAreasTitle = '';
+                var searchAreas = [translate('CoreHome_MenuEntries')]
+
+                if (hasSegmentSelector) {
+                    searchAreas.push(translate('CoreHome_Segments'))
+                }
+
+                if (scope.hasSitesSelector) {
+                    searchAreas.push(translate('SitesManager_Sites'))
+                }
+
+                while (searchAreas.length) {
+                    searchAreasTitle += searchAreas.shift();
+                    if (searchAreas.length >= 2) {
+                        searchAreasTitle += ', ';
+                    } else if (searchAreas.length === 1) {
+                        searchAreasTitle += ' ' + translate('General_And') + ' ';
+                    }
+                }
+
+                scope.quickAccessTitle = translate('CoreHome_QuickAccessTitle', searchAreasTitle);
+
+                function trim(str) {
+                    return str.replace(/^\s+|\s+$/g,'');
+                }
+
+                scope.getTopMenuItems = function()
+                {
+                    if (topMenuItems && topMenuItems.length) {
+                        return topMenuItems;
+                    }
+
+                    var category = _pk_translate('CoreHome_Menu');
+
+                    $rootElement.find('#topRightBar .navbar-right li > a').each(function (index, element) {
+                        var $element = $(element);
+
+                        if ($element.is('#topmenu-usersmanager')) {
+                            // ignore languages manager
+                            return;
+                        }
+
+                        var text = trim($element.text());
+
+                        if (!text) {
+                            text = trim($element.attr('title')); // possibly a icon, use title instead
+                        }
+
+                        if (text) {
+                            topMenuItems.push({name: text, index: ++menuIndex, category: category});
+                            $element.attr('quick_access', menuIndex);
+                        }
+                    });
+
+                    return topMenuItems;
+                };
+
+                scope.getLeftMenuItems = function ()
+                {
+                    if (leftMenuItems && leftMenuItems.length) {
+                        return leftMenuItems;
+                    }
+
+                    $rootElement.find('#secondNavBar .menuTab').each(function (index, element) {
+                        var $element = angular.element(element);
+                        var category = trim($element.find('> .item').text());
+
+                        if (category && -1 !== category.lastIndexOf("\n")) {
+                            // remove "\n\nMenu"
+                            category = trim(category.substr(0, category.lastIndexOf("\n")));
+                        }
+
+                        $element.find('li .item').each(function (i, element) {
+                            var $element = angular.element(element);
+                            var text = trim($element.text());
+
+                            if (text) {
+                                leftMenuItems.push({name: text, category: category, index: ++menuIndex});
+                                $element.attr('quick_access', menuIndex);
+                            }
+                        })
+
+                    });
+
+                    return leftMenuItems;
+                };
+
+                scope.getSegmentItems = function()
+                {
+                    if (!hasSegmentSelector) {
+                        return [];
+                    }
+
+                    if (segmentItems && segmentItems.length) {
+                        return segmentItems;
+                    }
+
+                    var category = _pk_translate('CoreHome_Segments');
+
+                    $rootElement.find('.segmentList [data-idsegment]').each(function (index, element) {
+                        var $element = angular.element(element);
+                        var text = trim($element.find('.segname').text());
+
+                        if (text) {
+                            segmentItems.push({name: text, category: category, index: ++menuIndex});
+                            $element.attr('quick_access', menuIndex);
+                        }
+                    });
+
+                    return segmentItems;
+                };
+
+                scope.activateSearch = function()
+                {
+                    scope.$eval('view.searchActive = true');
+                    $timeout(function () {
+                        scope.$apply();
+                    }, 0);
+                };
+
+                scope.deactivateSearch = function()
+                {
+                    scope.$eval('search.term = ""');
+                    scope.$eval('view.searchActive = false');
+                    element.find('input').blur();
+                    $timeout(function () {
+                        scope.$apply();
+                    }, 0);
+                };
+
+                function isElementInViewport(element) {
+
+                    var rect = element.getBoundingClientRect();
+
+                    return (
+                        rect.top >= 0 &&
+                        rect.left >= 0 &&
+                        rect.bottom <= $(window).height() &&
+                        rect.right <= $(window).width()
+                    );
+                }
+
+                function getCurrentlySelectedElement(index)
+                {
+                    var results = element.find('li.result');
+                    if (results && results.length && results[scope.search.index]) {
+                        return $(results[scope.search.index]);
+                    }
+                }
+
+                function makeSureSelectedItemIsInViewport() {
+                    var element = getCurrentlySelectedElement();
+
+                    if (element && element[0] && !isElementInViewport(element[0])) {
+                        scrollFirstElementIntoView(element);
+                    }
+                }
+
+                function scrollFirstElementIntoView(element)
+                {
+                    if (element && element[0] && element[0].scrollIntoView) {
+                        // make sure search is visible
+                        element[0].scrollIntoView();
+                    }
+                }
+
+                scope.highlightPreviousItem = function()
+                {
+                    if (0 >= (scope.search.index - 1)) {
+                        scope.search.index = 0;
+                    } else {
+                        scope.search.index--;
+                    }
+                    makeSureSelectedItemIsInViewport();
+                };
+
+                scope.resetSearchIndex = function () {
+                    scope.search.index = 0;
+                    makeSureSelectedItemIsInViewport();
+                };
+
+                scope.highlightNextItem = function()
+                {
+                    var numTotal = element.find('li.result').length;
+
+                    if (numTotal <= (scope.search.index + 1)) {
+                        scope.search.index = numTotal - 1;
+                    } else {
+                        scope.search.index++;
+                    }
+
+                    makeSureSelectedItemIsInViewport();
+                };
+
+                scope.clickQuickAccessMenuItem = function()
+                {
+                    var selectedMenuElement = getCurrentlySelectedElement();
+                    if (selectedMenuElement) {
+                        $timeout(function () {
+                            selectedMenuElement.click();
+                        }, 20);
+                    }
+                };
+
+                scope.selectMenuItem = function(index)
+                {
+                    var target = $rootElement.find('[quick_access=' + index + ']');
+
+                    if (target && target.length && target[0]) {
+                        scope.deactivateSearch();
+
+                        var actualTarget = target[0];
+
+                        var href = $(actualTarget).attr('href');
+
+                        if (href && href.length > 10 && actualTarget && actualTarget.click) {
+                            try {
+                                actualTarget.click();
+                            } catch (e) {
+                                $(actualTarget).click();
+                            }
+                        } else {
+                            $(actualTarget).click();
+                        }
+                    }
+                };
+
+                Mousetrap.bind('f', function(event) {
+                    if (event.preventDefault) {
+                        event.preventDefault();
+                    } else {
+                        event.returnValue = false; // IE
+                    }
+
+                    scrollFirstElementIntoView(element);
+
+                    scope.activateSearch();
+                });
+
+            }
+        };
+    }
+})();
\ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less
new file mode 100644
index 0000000000000000000000000000000000000000..1c46c7533d19fa43332b1a3f0d7c383df29d0f4f
--- /dev/null
+++ b/plugins/CoreHome/angularjs/quick-access/quick-access.directive.less
@@ -0,0 +1,55 @@
+.quick-access {
+  position: relative;
+
+  li {
+    font-size: 11px;
+  }
+
+  li a {
+    padding: 10px 19px;
+    display: inline-block;
+    text-decoration: none;
+    word-break: break-all;
+  }
+
+  .icon-search {
+    position: absolute;
+    font-size: 14px;
+    top: 10px;
+    left: 10px;
+
+  }
+  input {
+    width:100%;
+    height: 100%;
+    border: 0 !important;
+    box-shadow: 0 0 !important;
+    border-radius: 0 !important;
+    font-size: 11px;
+    &:focus {
+      outline: none;
+    }
+  }
+  .selected {
+    background-color: @theme-color-background-tinyContrast !important;
+  }
+  .quick-access-category {
+    text-align: left !important;
+    font-size: 11px;
+    padding: 5px 5px 5px 10px;
+    cursor: pointer;
+  }
+  .result {
+    cursor: pointer;
+  }
+  .quick-access-category:hover {
+    background: none !important;
+  }
+  .no-result {
+    padding: 10px 19px;
+    cursor: default;
+  }
+  .websiteCategory {
+    cursor: default;
+  }
+}
\ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
index adc1b9793613b56295387a97d7b17955c9095784..1ac9e223f34815f378ece2bbbfdd970b9ae7c0c7 100644
--- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
+++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu-model.js
@@ -67,7 +67,6 @@
                 if (activeCategory && category.id === activeCategory) {
                     // this doesn't really belong here but placed it here for convenience
                     category.active = true;
-                    category.hover  = true;
                 }
 
                 category.subcategories = [];
@@ -94,6 +93,7 @@
 
                             if (subcategory.active) {
                                 goalsGroup.name = subcategory.name;
+                                goalsGroup.active = true;
                             }
 
                             var goalId = page.subcategory.id;
diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js
index 6e3a21e8516afa6d2502d3f02d18a45069b0f755..57d202b250eab222b5768c66fb58efee4f23f6da 100644
--- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js
+++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.controller.js
@@ -15,9 +15,15 @@
         {
             angular.forEach(menuModel.menu, function (cat) {
                 cat.active = false;
-                cat.hover = false;
                 angular.forEach(cat.subcategories, function (subcat) {
                     subcat.active = false;
+
+                    if (subcat.isGroup && subcat.subcategories) {
+                        angular.forEach(subcat.subcategories, function (sub) {
+                            sub.active = false;
+                        });
+
+                    }
                 });
             });
         }
@@ -33,42 +39,8 @@
 
         $scope.menuModel = menuModel;
 
-        var timeoutPromise = null;
-
-        // show subcategories of the currently hovered category
-        $scope.enterCategory = function (category) {
-
-            if (timeoutPromise) {
-                $timeout.cancel(timeoutPromise);
-            }
-
-            angular.forEach(menuModel.menu, function (cat) {
-                cat.hover = false;
-            });
-
-            category.hover = true;
-        };
-
-        // show subcategories of the current active category again (after 2 sec max)
-        $scope.leaveCategory = function (category) {
-
-            if (timeoutPromise) {
-                $timeout.cancel(timeoutPromise);
-            }
-
-            timeoutPromise = $timeout(function () {
-                angular.forEach(menuModel.menu, function (cat) {
-                    if (cat.active) {
-                        cat.hover = true;
-                    } else {
-                        cat.hover = false;
-                    }
-                });
-            }, 2000);
-        };
-
         // highlight the currently hovered subcategory (and category)
-        $scope.enterSubcategory = function (category, subcategory) {
+        function enterSubcategory(category, subcategory) {
             if (!category || !subcategory) {
                 return;
             }
@@ -76,7 +48,6 @@
             markAllCategoriesAsInactive();
 
             category.active = true;
-            category.hover = true;
             subcategory.active = true;
         };
 
@@ -110,7 +81,7 @@
         menuModel.fetchMenuItems().then(function (menu) {
             if (!$location.search().subcategory) {
                 // load first, initial page if no subcategory is present
-                $scope.enterSubcategory(menu[0], menu[0].subcategories[0]);
+                enterSubcategory(menu[0], menu[0].subcategories[0]);
                 $location.search($scope.makeUrl(menu[0], menu[0].subcategories[0]));
             }
         });
@@ -124,7 +95,7 @@
             }
 
             var found = menuModel.findSubcategory(category, subcategory);
-            $scope.enterSubcategory(found.category, found.subcategory);
+            enterSubcategory(found.category, found.subcategory);
         });
 
     }
diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html
index bbfd687517f222e5ba4dd59c28a9be37c57a2ca5..c31a66a602d17272f3dd3f7f1c716f874e0ead21 100644
--- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html
+++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html
@@ -1,40 +1,36 @@
-<div class="Menu--dashboard">
-    <ul class="Menu-tabList">
-        <li ng-repeat="category in menuModel.menu"
-            ng-class="{'sfActive': category.active, 'sfHover': category.hover}"
-            ng-mouseenter="enterCategory(category)"
-            ng-mouseleave="leaveCategory(category)">
-            <a class="menuItem"
-               ng-href="#?{{ makeUrl(category,category.subcategories[0]) }}"
-               ng-click="loadSubcategory(category, category.subcategories[0])">
-                {{ category.name }}
-            </a>
-            <ul ng-show="(category.subcategories|length) > 1">
-                <li ng-repeat="subcategory in category.subcategories"
-                    ng-class="{'sfHover': subcategory.active}">
-                    <div ng-if="subcategory.isGroup" piwik-menudropdown show-search="true" menu-title="{{ subcategory.name|escape }}">
-                        <a class="item"
-                           ng-repeat="subcat in subcategory.subcategories"
-                           title="{{ subcat.tooltip }}"
-                           ng-class="{'active': subcat.active}"
-                           ng-href="#?{{ makeUrl(category,subcat) }}"
-                           ng-click='loadSubcategory(category, subcat)'>
-                            {{ subcat.name }}
-                        </a>
-                    </div>
-
-                    <a ng-if="!subcategory.isGroup"
-                       ng-href="#?{{ makeUrl(category,subcategory) }}"
-                       class="menuItem"
-                       ng-click='loadSubcategory(category, subcategory)'>
-                        {{ subcategory.name }}
+<ul class="navbar">
+    <li ng-repeat="category in menuModel.menu"
+        class="menuTab"
+        ng-class="{'active': category.active}">
+        <a class="item"
+           ng-href="#?{{ makeUrl(category,category.subcategories[0]) }}"
+           ng-click="loadSubcategory(category, category.subcategories[0])">
+            <span class="menu-icon {{ category.icon ? category.icon : 'icon-arrow-right' }}"></span>{{ category.name }}
+            <span class="hidden">
+             {{ 'CoreHome_Menu'|translate }}
+           </span>
+        </a>
+        <ul>
+            <li ng-repeat="subcategory in category.subcategories"
+                ng-class="{'active': subcategory.active}">
+                <div ng-if="subcategory.isGroup" piwik-menudropdown show-search="true" menu-title="{{ subcategory.name|escape }}">
+                    <a class="item"
+                       ng-repeat="subcat in subcategory.subcategories"
+                       title="{{ subcat.tooltip }}"
+                       ng-class="{'active': subcat.active}"
+                       ng-href="#?{{ makeUrl(category,subcat) }}"
+                       ng-click='loadSubcategory(category, subcat)'>
+                        {{ subcat.name }}
                     </a>
-                </li>
-            </ul>
-        </li>
-        <li id="Searchmenu">
-            <span piwik-quick-access></span>
-        </li>
-    </ul>
+                </div>
 
-</div>
\ No newline at end of file
+                <a ng-if="!subcategory.isGroup"
+                   ng-href="#?{{ makeUrl(category,subcategory) }}"
+                   class="item"
+                   ng-click='loadSubcategory(category, subcategory)'>
+                    {{ subcategory.name }}
+                </a>
+            </li>
+        </ul>
+    </li>
+</ul>
\ No newline at end of file
diff --git a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js
index 7cdd9e951b45a95717b6e5bdedea15e3254cf86a..1b524d3e9b0fe343bc98b0aa0064153b0d06a7bf 100644
--- a/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js
+++ b/plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.js
@@ -23,6 +23,7 @@
 
         return {
             restrict: 'A',
+            replace: true,
             scope: {},
             templateUrl: 'plugins/CoreHome/angularjs/reporting-menu/reportingmenu.directive.html?cb=' + piwik.cacheBuster,
             controller: 'ReportingMenuController'
diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.js b/plugins/CoreHome/angularjs/selector/selector.directive.js
new file mode 100644
index 0000000000000000000000000000000000000000..37db1d5743e88c982e1634d3519a65493578fe4a
--- /dev/null
+++ b/plugins/CoreHome/angularjs/selector/selector.directive.js
@@ -0,0 +1,87 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+/**
+ *
+ */
+(function () {
+    angular.module('piwikApp').directive('piwikExpandOnClick', piwikExpandOnClick);
+
+    piwikExpandOnClick.$inject = ['$document'];
+
+    function piwikExpandOnClick($document){
+
+        return {
+            restrict: 'A',
+            link: function(scope, element, attr) {
+
+                element.find('.title').on('click', function () {
+                    element.toggleClass('expanded');
+                });
+
+                function onClickOutsideElement (event) {
+                    if (element.has(event.target).length === 0) {
+                        element.removeClass('expanded');
+                    }
+                }
+
+                function onEscapeHandler (event) {
+                    if (event.which === 27) {
+                        element.removeClass('expanded');
+                    }
+                }
+
+                $document.on('keyup', onEscapeHandler);
+                $document.on('mouseup', onClickOutsideElement);
+                scope.$on('$destroy', function() {
+                    $document.off('mouseup', onClickOutsideElement);
+                    $document.off('keyup', onEscapeHandler);
+                });
+            }
+        };
+    }
+
+    angular.module('piwikApp').directive('piwikExpandOnHover', piwikExpandOnHover);
+
+    piwikExpandOnHover.$inject = ['$document'];
+
+    function piwikExpandOnHover($document){
+
+        return {
+            restrict: 'A',
+            link: function(scope, element, attr) {
+
+                element.on('mouseenter', '.title', function () {
+                    element.addClass('expanded');
+                });
+
+                element.on('mouseleave', function () {
+                    element.removeClass('expanded');
+                });
+
+                function onClickOutsideElement (event) {
+                    if (element.has(event.target).length === 0) {
+                        element.removeClass('expanded');
+                    }
+                }
+
+                function onEscapeHandler (event) {
+                    if (event.which === 27) {
+                        element.removeClass('expanded');
+                    }
+                }
+
+                $document.on('keyup', onEscapeHandler);
+                $document.on('mouseup', onClickOutsideElement);
+                scope.$on('$destroy', function() {
+                    $document.off('mouseup', onClickOutsideElement);
+                    $document.off('keyup', onEscapeHandler);
+                });
+            }
+        };
+    }
+})();
diff --git a/plugins/CoreHome/angularjs/selector/selector.directive.less b/plugins/CoreHome/angularjs/selector/selector.directive.less
new file mode 100644
index 0000000000000000000000000000000000000000..9c0e207d4d0dec2d22d1b77a84ed636a41f296eb
--- /dev/null
+++ b/plugins/CoreHome/angularjs/selector/selector.directive.less
@@ -0,0 +1,59 @@
+.piwikSelector {
+  display: inline-block;
+  line-height: 0;
+
+  span.title,
+  a.title {
+    .font-default(11px, 12px);
+    display: inline-block;
+    width: 100%;
+    padding: 11px 19px 10px;
+    white-space: nowrap;
+    cursor: pointer;
+    text-transform: uppercase;
+    text-decoration: none;
+    color: @theme-color-text;
+
+    &.activityIndicator {
+      background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px;
+
+      .icon {
+        visibility: hidden;
+      }
+    }
+
+    .icon {
+      padding-left: 6px;
+      display: inline-block;
+      vertical-align: top;
+
+      &.iconHidden {
+        visibility: hidden;
+      }
+    }
+
+    .icon:not(.icon-fixed) {
+      float: right;
+      &:after {
+        clear:right;
+        content: ' ';
+      }
+    }
+
+    &:hover, &:focus {
+      text-decoration: none;
+    }
+  }
+
+  .dropdown {
+    .font-default(11px, 15px);
+    display: none;
+    padding: 5px 19px 11px 19px;
+  }
+
+  &.expanded {
+    .dropdown {
+      display: block;
+    }
+  }
+}
diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html
index 5f6a3cac8ad029ca3c96fbed82095c33e6e2cc74..3a4cbec8f29f9849858964e8ba0866d08d8cdd83 100644
--- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html
+++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.html
@@ -1,5 +1,6 @@
-<div piwik-focus-anywhere-but-here="view.showSitesList=false" class="custom_select"
-     ng-class="{'sites_autocomplete--dropdown': (model.hasMultipleWebsites || showAllSitesItem || !model.sites.length)}">
+<div piwik-focus-anywhere-but-here="view.showSitesList=false"
+     class="siteSelector piwikSelector borderedControl"
+     ng-class="{'expanded': view.showSitesList}">
 
     <script type="text/ng-template" id="siteselector_allsiteslink.html">
         <div ng-click="switchSite({idsite: 'all', name: allSitesText});view.showSitesList=false;"
@@ -13,13 +14,19 @@
     <input ng-if="inputName" type="hidden" name="{{ inputName }}" ng-value="selectedSite.id"/>
 
     <a ng-click="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();"
+       piwik-onenter="view.showSitesList=!view.showSitesList; view.showSitesList && model.loadInitialSites();"
        href="javascript:void(0)"
-       class="custom_select_main_link"
-       ng-class="{'loading': model.isLoading}">
-        <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span>
+       title="{{ 'General_ChooseWebsite'|translate }}"
+       ng-class="{'loading': model.isLoading}"
+       class="title">
+        <span class="icon icon-arrow-bottom"
+              ng-class="{'iconHidden': model.isLoading, 'collapsed': !view.showSitesList}"></span>
+        <span>{{ 'General_Website'| translate }}:
+            <span ng-bind-html="selectedSite.name || model.firstSiteName">?</span>
+        </span>
     </a>
 
-    <div ng-show="view.showSitesList" class="custom_select_block">
+    <div ng-show="view.showSitesList" class="dropdown">
         <div ng-if="allSitesLocation=='top' && showAllSitesItem"
              ng-include="'siteselector_allsiteslink.html'"></div>
 
@@ -49,10 +56,8 @@
                    ng-click="view.searchTerm=''"
                    ng-model="view.searchTerm"
                    ng-change="model.searchSite(view.searchTerm)"
+                   placeholder="{{ 'General_Search' | translate }}"
                    class="websiteSearch inp"/>
-            <input type="submit"
-                   ng-click="model.searchSite(view.searchTerm)"
-                   value="{{ 'General_Search' | translate }}" class="but"/>
             <img title="Clear"
                  ng-show="view.searchTerm"
                  ng-click="view.searchTerm=''; model.loadInitialSites()"
diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
index 450813f2e14a631705144688f91162769a172af6..ba5c492cb84f57d045807b317e69044a7b817ece 100644
--- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
+++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.js
@@ -26,9 +26,9 @@
 (function () {
     angular.module('piwikApp').directive('piwikSiteselector', piwikSiteselector);
 
-    piwikSiteselector.$inject = ['$document', 'piwik', '$filter'];
+    piwikSiteselector.$inject = ['$document', 'piwik', '$filter', '$timeout'];
 
-    function piwikSiteselector($document, piwik, $filter){
+    function piwikSiteselector($document, piwik, $filter, $timeout){
         var defaults = {
             name: '',
             siteid: piwik.idSite,
@@ -85,6 +85,10 @@
                     scope.$watch('view.showSitesList', function (newValue) {
                         element.toggleClass('expanded', !! newValue);
                     });
+
+                    $timeout(function () {
+                        initTopControls();
+                    });
                 };
             }
         };
diff --git a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less
index 8b38e556df88e8d52a3009be7edfac1a0369b11c..4afc63a8f9bbdb945d767396d814df04abcc7ac0 100644
--- a/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less
+++ b/plugins/CoreHome/angularjs/siteselector/siteselector.directive.less
@@ -1,155 +1,137 @@
-
-/*sites_autocomplete*/
-.sites_autocomplete {
-  position: absolute;
-  font-size: 12px;
-  display: inline-block;
-  height: 30px; /* Hack to not push the dashboard widget below */
-}
-
-table.dataTable tr td .sites_autocomplete a {
-  width: auto;
-}
-
-.sites_selector_in_dashboard {
-  margin-top:10px;
-}
-.top_bar_sites_selector {
-  float: right
-}
-
-.top_bar_sites_selector > label {
-  display: inline-block;
-  padding: 7px 0 6px 0;
-  float: left;
-  font-size: 12px;
-}
-
-.top_bar_sites_selector > .sites_autocomplete {
-  position: static;
-  margin-left: 12px;
-}
-
 .autocompleteMatched {
   color: #5256BE;
   font-weight: bold;
 }
-
-.sites_autocomplete .custom_select {
-  float: left;
-  position: relative;
-  z-index: 19;
-  background: @theme-color-background-base url(plugins/Morpheus/images/sites_selection.png) repeat-x 0 0;
-  border: 1px solid @color-silver-l85;
-  color: #255792;
-  border-radius: 4px;
-  cursor: pointer;
-  width: 205px;
-}
-
-.sites_autocomplete .custom_select_main_link {
-  display: block;
-  text-decoration: none;
-  background: none;
-  cursor: default;
-  padding: 9px 5px 7px 5px;
-}
-
-#content.admin .adminTable .sites_autocomplete a {
-  text-decoration: none;
-}
-
-.sites_autocomplete .custom_select_ul_list li a,
-.sites_autocomplete .custom_select_all a,
-.sites_autocomplete .custom_select_main_link > span {
+.siteSelector {
+  a.title {
+    .icon.collapsed.iconHidden {
+      visibility: visible;
+    }
+  }
+  .dropdown {
+    max-width: 210px;
+  }
+}
+
+#content {
+  .sites_autocomplete {
+    position: static !important;
+    height: 36px;
+    z-index: 99;
+    vertical-align: middle;
+
+    > .siteSelector {
+      position: absolute;
+      z-index: 9999;
+    }
+
+    a.title {
+      text-decoration: none;
+    }
+  }
+}
+
+.siteSelector.expanded {
+  .loading {
+    background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px;
+  }
+}
+
+.siteSelector a.title,
+.siteSelector .custom_select_ul_list li a,
+.siteSelector .custom_select_all a,
+.siteSelector .custom_select_main_link > span {
   display: inline-block;
-  max-width: 170px;
+  max-width: 210px;
   white-space: nowrap;
   overflow: hidden;
   text-overflow: ellipsis;
-  padding: 0 10px 0 4px;
-}
-
-.sites_autocomplete--dropdown .custom_select_main_link:not(.loading):before {
-  content: " \25BC";
-  position: absolute;
-  right: 0;
-  font-size: 0.8em;
-  margin-top: 0.2em;
-  color: @theme-color-text-light;
-  margin-top: 9px;
+  padding: 0;
+  color: @theme-color-text;
+  text-transform: uppercase;
+  width: 100%;
 }
 
-.sites_autocomplete--dropdown .custom_select_main_link {
-  cursor: pointer;
-  position: relative;
-}
+.siteSelector a.title {
+  > span {
+    max-width: 161px;
+    display: inline-block;
+    overflow: hidden;
+    text-overflow: ellipsis;
+  }
 
-.sites_autocomplete .custom_select_main_link.loading {
-  background: url(plugins/Morpheus/images/loading-blue.gif) no-repeat right 9px;
+  span {
+    vertical-align: top;
+  }
 }
 
-.sites_autocomplete .custom_select_ul_list,
-.sites_autocomplete ul.ui-autocomplete {
+.siteSelector .custom_select_ul_list,
+.siteSelector ul.ui-autocomplete {
   position: relative;
   list-style: none;
   line-height: 18px;
   padding: 0 0 15px 0;
+  box-shadow: none !important;
 }
 
-.sites_autocomplete .custom_select_ul_list li a,
-.sites_autocomplete .custom_select_all a {
+.siteSelector .custom_select_ul_list {
+  padding: 0 0 5px 0;
+}
+
+.siteSelector .dropdown {
+  padding-top: 0;
+}
+
+.siteSelector .custom_select_ul_list li a,
+.siteSelector .custom_select_all a {
   line-height: 18px;
   height: auto;
   display: block;
   text-decoration: none;
+  padding-left: 5px;
+  margin-left: -5px;
 }
 
-.sites_autocomplete .custom_select_ul_list li a:hover,
-.sites_autocomplete .custom_select_all a:hover {
+.siteSelector .custom_select_ul_list li a:hover,
+.siteSelector .custom_select_all a:hover {
   background: #ebeae6;
 }
 
-.sites_autocomplete .custom_select_all a {
+.siteSelector .custom_select_all a {
   text-decoration: none;
-  margin: 0 0 5px 0;
+  margin: 0 0 5px -5px;
 }
 
-.sites_autocomplete .custom_select_search {
-  margin: 0 0 0 4px;
-  height: 26px;
+.siteSelector .custom_select_search {
+  margin: 0;
+  height: 33px;
   display: block;
   white-space: nowrap;
-  background: url(plugins/Morpheus/images/search_bg.png) no-repeat 0 0;
-}
-
-.sites_autocomplete .custom_select_search .inp {
-  vertical-align: top;
-  width: 165px;
-  padding: 2px 6px !important;
-  border: 0 !important;
-  background: transparent !important;
-  font-size: 10px !important;
-  color: #454545 !important;
-
-}
-.sites_autocomplete {
-  width: 205px;
-}
-
-.sites_autocomplete .custom_select_search .but {
-  vertical-align: top;
-  font-size: 10px;
-  border: 0;
-  background: transparent;
-  width: 21px;
-  height: 17px;
-  overflow: hidden;
-  opacity: 0;
-  cursor: pointer;
+  position: relative;
+  padding-top: 4px;
+
+  .inp {
+    vertical-align: top;
+    width: 100%;
+    padding: 4px 6px !important;
+    border: 1px solid #d0d0d0 !important;
+    background: transparent !important;
+    font-size: 11px !important;
+    color: #454545 !important;
+  }
+  .reset {
+    position: absolute;
+    top: 10px;
+    right: 4px;
+    cursor: pointer;
+  }
+}
+
+.siteSelector {
+  width: auto;
 }
 
-.sites_selector_container>.sites_autocomplete {
+.sites_selector_container>.siteSelector {
   padding-left: 12px;
 }
 
@@ -158,17 +140,6 @@ table.dataTable tr td .sites_autocomplete a {
   float:none;position:static
 }
 
-.custom_select_search .reset {
-  position: relative; top: 3px; left: -50px; cursor: pointer;
-}
-
-.custom_select_block {
-  overflow: hidden;
-  max-width: inherit;
-  visibility: visible;
-  padding: 0 5px 7px 5px;
-}
-
 .custom_select_block_show {
   height: auto;
   overflow: visible;
diff --git a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html
index db98dee89552650992ed17f043b88a8a0d1c668f..32bb13331e999333700df64ad6f1b73ed221885e 100644
--- a/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html
+++ b/plugins/CoreHome/angularjs/widget-bydimension-container/widget-bydimension-container.directive.html
@@ -14,7 +14,7 @@
         </div>
     </div>
 
-    <div style="float:left;max-width:900px;">
+    <div style="float:left;max-width:730px;">
         <h2 ng-if="selectedWidget.name" class="noTopMargin">{{ selectedWidget.name }}</h2>
 
         <div ng-if="selectedWidget.parameters" class="dimensionReport"
diff --git a/plugins/CoreHome/javascripts/calendar.js b/plugins/CoreHome/javascripts/calendar.js
index 1c308fb74c3492ff9eba7f059df3994ac8a5c68b..004c15e0aad498092a6c6447614e13755012de36 100644
--- a/plugins/CoreHome/javascripts/calendar.js
+++ b/plugins/CoreHome/javascripts/calendar.js
@@ -294,7 +294,6 @@
         var togglePeriodPickers = function (showSingle) {
             $('#periodString').find('.period-date').toggle(showSingle);
             $('#periodString').find('.period-range').toggle(!showSingle);
-            $('#calendarRangeApply').toggle(!showSingle);
         };
 
         //
@@ -355,7 +354,24 @@
         });
 
         var reloading = false;
-        var changePeriodOnClick = function (periodInput) {
+
+        var changePeriodWithPageReload = function (periodInput) {
+            var url = periodInput.val(),
+                period = broadcast.getValueFromUrl('period', url);
+
+            // if clicking on the selected period, change the period but not the date
+            if (period != 'range' && !reloading) {
+                // only reload if current period is different from selected
+                reloading = true;
+                selectedPeriod = period;
+                updateDate(piwik.currentDateString);
+                return true;
+            }
+
+            return false;
+        };
+
+        var changePeriodOnClickIfPeriodChanged = function (periodInput) {
             if (reloading) // if a click event resulted in reloading, don't reload again
             {
                 return;
@@ -367,11 +383,10 @@
             // if clicking on the selected period, change the period but not the date
             if (selectedPeriod == period && selectedPeriod != 'range') {
                 // only reload if current period is different from selected
-                if (piwik.period != selectedPeriod && !reloading) {
-                    reloading = true;
-                    selectedPeriod = period;
-                    updateDate(piwik.currentDateString);
+                if (piwik.period != selectedPeriod) {
+                    return changePeriodWithPageReload(periodInput);
                 }
+
                 return true;
             }
 
@@ -380,16 +395,50 @@
 
         $("#otherPeriods").find("label,input").on('dblclick', function (e) {
             var id = $(e.target).attr('for');
-            changePeriodOnClick($('#' + id));
+            changePeriodOnClickIfPeriodChanged($('#' + id));
+        });
+
+        $("#otherPeriods").find("label,input").on('dblclick', function (e) {
+            var id = $(e.target).attr('for');
+            changePeriodOnClickIfPeriodChanged($('#' + id));
         });
 
+        // Apply date range button will reload the page with the selected range
+        $('#calendarApply')
+            .on('click', function () {
+                var $selectedPeriod = $('#periodMore [name=period]:checked');
+
+                if (!$selectedPeriod.is('#period_id_range')) {
+                    changePeriodWithPageReload($selectedPeriod);
+                    return true;
+                }
+
+                var dateFrom = $('#inputCalendarFrom').val(),
+                    dateTo = $('#inputCalendarTo').val(),
+                    oDateFrom = $.datepicker.parseDate('yy-mm-dd', dateFrom),
+                    oDateTo = $.datepicker.parseDate('yy-mm-dd', dateTo);
+
+                if (!isValidDate(oDateFrom)
+                    || !isValidDate(oDateTo)
+                    || oDateFrom > oDateTo) {
+                    $('#alert').find('h2').text(_pk_translate('General_InvalidDateRange'));
+                    piwikHelper.modalConfirm('#alert', {});
+                    return false;
+                }
+                piwikHelper.showAjaxLoading('ajaxLoadingCalendar');
+                broadcast.propagateNewPage('period=range&date=' + dateFrom + ',' + dateTo);
+            })
+            .show();
+
+
+
         // when non-range period is clicked, change the period & refresh the date picker
         $("#otherPeriods").find("input").on('click', function (e) {
             var request_URL = $(e.target).val(),
                 period = broadcast.getValueFromUrl('period', request_URL),
                 lastPeriod = selectedPeriod;
 
-            if (changePeriodOnClick($(e.target))) {
+            if (changePeriodOnClickIfPeriodChanged($(e.target))) {
                 return true;
             }
 
@@ -440,21 +489,6 @@
             toggleMonthDropdown(selectedPeriod == 'year');
         });
 
-        // reset date/period when opening calendar
-        $("#periodString").on('click', "#date,.calendar-icon", function () {
-            var periodMore = $("#periodMore").toggle();
-            if (periodMore.is(":visible")) {
-                periodMore.find(".ui-state-highlight").removeClass('ui-state-highlight');
-            }
-        });
-
-        $('body').on('click', function(e) {
-            var target = $(e.target);
-            if (target.closest('html').length && !target.closest('#periodString').length && !target.is('option') && $("#periodMore").is(":visible")) {
-                $("#periodMore").hide();
-            }
-        });
-
         function onDateRangeSelect(dateText, inst) {
             var toOrFrom = inst.id == 'calendarFrom' ? 'From' : 'To';
             $('#inputCalendar' + toOrFrom).val(dateText);
@@ -487,27 +521,6 @@
             // If not called, the first date appears light brown instead of dark brown
             $('.ui-state-hover').removeClass('ui-state-hover');
 
-            // Apply date range button will reload the page with the selected range
-            $('#calendarRangeApply')
-                .on('click', function () {
-                    var request_URL = $(e.target).val();
-                    var dateFrom = $('#inputCalendarFrom').val(),
-                        dateTo = $('#inputCalendarTo').val(),
-                        oDateFrom = $.datepicker.parseDate('yy-mm-dd', dateFrom),
-                        oDateTo = $.datepicker.parseDate('yy-mm-dd', dateTo);
-
-                    if (!isValidDate(oDateFrom)
-                        || !isValidDate(oDateTo)
-                        || oDateFrom > oDateTo) {
-                        $('#alert').find('h2').text(_pk_translate('General_InvalidDateRange'));
-                        piwikHelper.modalConfirm('#alert', {});
-                        return false;
-                    }
-                    piwikHelper.showAjaxLoading('ajaxLoadingCalendar');
-                    broadcast.propagateNewPage('period=range&date=' + dateFrom + ',' + dateTo);
-                })
-                .show();
-
             // Bind the input fields to update the calendar's date when date is manually changed
             $('#inputCalendarFrom, #inputCalendarTo')
                 .keyup(function (e) {
@@ -520,7 +533,7 @@
                     }
                     $("#calendar" + fromOrTo).datepicker("setDate", newDate);
                     if (e.keyCode == 13) {
-                        $('#calendarRangeApply').click();
+                        $('#calendarApply').click();
                     }
                 });
             return true;
@@ -534,6 +547,8 @@
         if (piwik.period == 'range') {
             $("#period_id_range").click();
         }
+
+        initTopControls();
     });
 
 }(jQuery));
diff --git a/plugins/CoreHome/javascripts/corehome.js b/plugins/CoreHome/javascripts/corehome.js
index 16a5abecbdac1256aaa4451655b4a0a4b71af672..f2a7468d6a82c5e2e69fadfd6b08de797d0243c3 100755
--- a/plugins/CoreHome/javascripts/corehome.js
+++ b/plugins/CoreHome/javascripts/corehome.js
@@ -27,17 +27,26 @@
                 module: 'CoreHome',
                 action: 'checkForUpdates'
             }, 'get');
+
             ajaxRequest.withTokenInUrl();
+
+            var $titleElement = $(this);
+            $titleElement.addClass('activityIndicator');
+
             ajaxRequest.setCallback(function (response) {
                 headerMessage.fadeOut('slow', function () {
                     response = $(response);
 
+                    $titleElement.removeClass('activityIndicator');
+
                     var newVersionAvailable = response.hasClass('header_alert');
                     if (newVersionAvailable) {
                         headerMessage.replaceWith(response);
+                        headerMessage.show();
                     }
                     else {
-                        headerMessage.html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion')).show();
+                        headerMessage.find('.title').html(_pk_translate('CoreHome_YouAreUsingTheLatestVersion'));
+                        headerMessage.show();
                         setTimeout(function () {
                             headerMessage.fadeOut('slow', function () {
                                 headerMessage.replaceWith(response);
@@ -55,7 +64,7 @@
         // when clicking the header message, show the long message w/o needing to hover
         headerMessageParent.on('click', '#header_message', function (e) {
             if (e.target.tagName.toLowerCase() != 'a') {
-                $(this).toggleClass('active');
+                $(this).toggleClass('expanded');
             }
         });
 
diff --git a/plugins/CoreHome/javascripts/numberFormatter.js b/plugins/CoreHome/javascripts/numberFormatter.js
new file mode 100644
index 0000000000000000000000000000000000000000..2d3bcc172b3f2bac4f1921a3175f9f50d02301eb
--- /dev/null
+++ b/plugins/CoreHome/javascripts/numberFormatter.js
@@ -0,0 +1,143 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+/**
+ *  Number Formatter for formatting numbers, percent and currencies values
+ *
+ * @type {object}
+ */
+var NumberFormatter = (function () {
+
+    var minimumFractionDigits = 0;
+    var maximumFractionDigits = 2;
+
+    /**
+     * Formats the given numeric value with the given pattern
+     *
+     * @param value
+     * @param pattern
+     * @returns {string}
+     */
+    function format(value, pattern) {
+
+        if (!$.isNumeric(value)) {
+            return value;
+        }
+        pattern = pattern || piwik.numbers.patternNumber;
+
+        var patterns = pattern.split(';');
+        if (patterns.length == 1) {
+            // No explicit negative pattern was provided, construct it.
+            patterns.push('-' + patterns[0])
+        }
+
+        // Ensure that the value is positive and has the right number of digits.
+        var negative = value < 0;
+        pattern = negative ? patterns[1] : patterns[0];
+
+        var usesGrouping = (pattern.indexOf(',') != -1);
+        // if pattern has number groups, parse them.
+        if (usesGrouping) {
+            var primaryGroupMatches = pattern.match(/#+0/);
+            var primaryGroupSize = primaryGroupMatches[0].length;
+            var secondaryGroupSize = primaryGroupMatches[0].length;
+            var numberGroups = pattern.split(',');
+            // check for distinct secondary group size.
+            if (numberGroups.length > 2) {
+                secondaryGroupSize = numberGroups[1].length;
+            }
+        }
+
+        var signMultiplier = negative ? '-1' : '1';
+        value = value * signMultiplier;
+        // Split the number into major and minor digits.
+        var valueParts = value.toString().split('.');
+        var majorDigits = valueParts[0];
+        // Account for maximumFractionDigits = 0, where the number won't
+        // have a decimal point, and $valueParts[1] won't be set.
+        minorDigits = valueParts[1] || '';
+        if (usesGrouping) {
+            // Reverse the major digits, since they are grouped from the right.
+            majorDigits = majorDigits.split('').reverse();
+            // Group the major digits.
+            var groups = [];
+            groups.push(majorDigits.splice(0, primaryGroupSize).reverse().join(''));
+            while (majorDigits.length) {
+                groups.push(majorDigits.splice(0, secondaryGroupSize).reverse().join(''));
+            }
+            // Reverse the groups and the digits inside of them.
+            groups = groups.reverse();
+            // Reconstruct the major digits.
+            majorDigits = groups.join(',');
+        }
+        if (minimumFractionDigits < maximumFractionDigits) {
+            // Strip any trailing zeroes.
+            var minorDigits = minorDigits.replace(/0+$/,'');
+            if (minorDigits.length < minimumFractionDigits) {
+                // Now there are too few digits, re-add trailing zeroes
+                // until the desired length is reached.
+                var neededZeroes = minimumFractionDigits - minorDigits.length;
+                minorDigits += (new Array(neededZeroes+1)).join('0');
+            }
+        }
+        // Assemble the final number and insert it into the pattern.
+        value = minorDigits ? majorDigits + '.' + minorDigits : majorDigits;
+        value = pattern.replace(/#(?:[\.,]#+)*0(?:[,\.][0#]+)*/, value);
+        // Localize the number.
+        return replaceSymbols(value);
+    }
+
+    /**
+     * Replaces the placeholders with real symbols
+     *
+     * @param value
+     * @returns {string}
+     */
+    function replaceSymbols(value) {
+        var replacements = {
+            '.': piwik.numbers.symbolDecimal,
+            ',': piwik.numbers.symbolGroup,
+            '+': piwik.numbers.symbolPlus,
+            '-': piwik.numbers.symbolMinus,
+            '%': piwik.numbers.symbolPercent
+        };
+
+        var newValue = '';
+        var valueParts = value.split('');
+
+        $.each(valueParts, function(index, value) {
+            $.each(replacements, function(char, replacement) {
+                if (value.indexOf(char) != -1) {
+                    value = value.replace(char, replacement);
+                    return false;
+                }
+            });
+            newValue += value;
+        });
+
+        return newValue;
+    }
+
+    /**
+     * Public available methods
+     */
+    return {
+
+        formatNumber: function (value) {
+            return format(value, piwik.numbers.patternNumber);
+        },
+
+        formatPercent: function (value) {
+            return format(value, piwik.numbers.patternPercent);
+        },
+
+        formatCurrency: function (value, currency) {
+            var formatted = format(value, piwik.numbers.patternCurrency);
+            return formatted.replace('¤', currency);
+        }
+    }
+})();
diff --git a/plugins/CoreHome/javascripts/top_controls.js b/plugins/CoreHome/javascripts/top_controls.js
index 62ce3ceccadf998982ef29a175b59952ac4b1a79..38b069d6c59e26b1de1552ce9eb4320c3ec508c7 100644
--- a/plugins/CoreHome/javascripts/top_controls.js
+++ b/plugins/CoreHome/javascripts/top_controls.js
@@ -5,9 +5,29 @@
  * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
  */
 function initTopControls() {
+    function getOverlap(element1, element2)
+    {
+        if (!element1 || !element1.getBoundingClientRect || !element2 || !element2.getBoundingClientRect) {
+            return 0;
+        }
+
+        var rect1 = element1.getBoundingClientRect();
+        var rect2 = element2.getBoundingClientRect();
+
+        var doOverlap = !(rect1.right < rect2.left || rect1.left > rect2.right);
+
+        if (doOverlap) {
+            return rect1.left - rect2.right;
+        }
+
+        return 0;
+    }
+
     var $topControlsContainer = $('.top_controls'),
         left = 0;
 
+    var allRendered = true;
+
     if ($topControlsContainer.length) {
         $('.piwikTopControl').each(function () {
             var $control = $(this);
@@ -16,12 +36,32 @@ function initTopControls() {
             }
 
             $control.css('left', left);
+            var width = $control.outerWidth(true);
 
-            if (!$.contains($topControlsContainer[0], this)) {
-                $control.detach().appendTo($topControlsContainer);
+            var isControlFullyRendered = width >= 30;
+            if (!isControlFullyRendered) {
+                allRendered = false;
             }
 
-            left += $control.outerWidth(true);
+            left += width;
         });
+
+        if (allRendered) {
+            // we make top controls visible only after all selectors are rendered
+            $('.top_controls').css('visibility', 'visible');
+            $('.top_controls').css('opacity', '1');
+        }
+
+        var header = $('#header_message.isPiwikDemo');
+        if (header.length) {
+            // make sure isPiwikDemo message is always fully visible, move it to the right if needed
+            var lastSelector = $('.top_controls .piwikTopControl:last');
+
+            var overlap = getOverlap(header[0], lastSelector[0]);
+            if (header[0] !== lastSelector[0] && overlap !== 0) {
+                header.css('right', (Math.abs(overlap) + 18) * -1);
+            }
+        }
+
     }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/lang/de.json b/plugins/CoreHome/lang/de.json
index 7d9e83a1db4650be03f4e4c4baa5df07ffe20f61..e0f2df25056106e4d9da85964e22cb3ba59f8fdc 100644
--- a/plugins/CoreHome/lang/de.json
+++ b/plugins/CoreHome/lang/de.json
@@ -48,6 +48,9 @@
         "YouAreUsingTheLatestVersion": "Sie verwenden die aktuelle Version von Piwik!",
         "ClickRowToExpandOrContract": "Klicken Sie auf diese Zeile um die Untertabelle anzuzeigen oder zu verbergen.",
         "UndoPivotBySubtable": "Pivot erstellt für diesen Bericht %s Pivot rückgängig machen",
-        "PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %s Pivot erstellen mit %s"
+        "PivotBySubtable": "Kein Pivot erstellt für diesen Bericht %s Pivot erstellen mit %s",
+        "QuickAccessTitle": "Suche nach Menüeinträgen, Segmenten und Websites. Tastenkürzel: Drücken Sie 'f' um zu suchen.",
+        "Segments": "Segmente",
+        "AdblockIsMaybeUsed": "Für den Fall, dass Sie einen Ad-Blocker verwenden, deaktivieren Sie diesen bitte für diese Seite um sicherzustellen, dass Piwik problemlos läuft."
     }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/lang/el.json b/plugins/CoreHome/lang/el.json
index 9fea9102c19f6495c176fb217ace5dadad9331c4..5f09a036d77b233af5168c23d4909059a7ba10fa 100644
--- a/plugins/CoreHome/lang/el.json
+++ b/plugins/CoreHome/lang/el.json
@@ -48,6 +48,9 @@
         "YouAreUsingTheLatestVersion": "Χρησιμοποιείτε την τελευταία έκδοση του Piwik!",
         "ClickRowToExpandOrContract": "Πατήστε στη γραμμή για να επεκταθεί ή να κρυφτεί ο υποπίνακας.",
         "UndoPivotBySubtable": "Η αναφορά θεμελιώθηκε %s Αναίρεση της θεμελίωσης",
-        "PivotBySubtable": "Η αναφορά αυτή δεν είναι θεμελιωμένη %s Να θεμελιωθεί από %s"
+        "PivotBySubtable": "Η αναφορά αυτή δεν είναι θεμελιωμένη %s Να θεμελιωθεί από %s",
+        "QuickAccessTitle": "Αναζήτηση για καταχωρήσεις μενού, τμήματα και ιστοτόπους. Πλήκτρο συντόμευσης: Πατήστε 'f' για αναζήτηση.",
+        "Segments": "Τμήματα",
+        "AdblockIsMaybeUsed": "Σε περίπτωση που χρησιμοποιείτε κάποια πρόγραμμα που μπλοκάρει τις διαφημίσεις, παρακαλούμε απενεργοποιήστε το για αυτόν τον ιστοτόπο για να είστε σίγουροι ότι το Piwik δουλεύει σωστά."
     }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/lang/en.json b/plugins/CoreHome/lang/en.json
index 7b3d4bbcf396a165c73b42969e899bb8ad3fe2df..6e38e1d0f28b64ab132e42723d35ad18aedefe4f 100644
--- a/plugins/CoreHome/lang/en.json
+++ b/plugins/CoreHome/lang/en.json
@@ -49,6 +49,10 @@
         "ClickRowToExpandOrContract": "Click this row to expand or contract the subtable.",
         "UndoPivotBySubtable": "This report has been pivoted %s Undo pivot",
         "PivotBySubtable": "This report is not pivoted %s Pivot by %s",
-        "NoSuchPage": "This page does not exist"
+        "NoSuchPage": "This page does not exist",
+        "QuickAccessTitle": "Search for %s. Shortcut: Press 'f' to search.",
+        "MenuEntries": "Menu entries",
+        "Segments": "Segments",
+        "AdblockIsMaybeUsed": "In case you are using an ad blocker, please disable it for this site to make sure Piwik works without any issues."
     }
 }
diff --git a/plugins/CoreHome/lang/it.json b/plugins/CoreHome/lang/it.json
index e2ad63bd98bf097ef072c613b22e4948fff57d16..d002b7d0574c6b25d355fd0fb4812e4609e9fa77 100644
--- a/plugins/CoreHome/lang/it.json
+++ b/plugins/CoreHome/lang/it.json
@@ -48,6 +48,8 @@
         "YouAreUsingTheLatestVersion": "Stai utilizzando l'ultima versione di Piwik!",
         "ClickRowToExpandOrContract": "Clicca su questa riga per espandere o restringere la sotto-tabella.",
         "UndoPivotBySubtable": "Questo report è stato imperniato al Pivot %s Undo",
-        "PivotBySubtable": "Questo report non è imperniato al Pivot %s da %s"
+        "PivotBySubtable": "Questo report non è imperniato al Pivot %s da %s",
+        "QuickAccessTitle": "Ricerca selezioni da menù, segmenti e siti web. Scorciatoia: Premi 'f' per la ricerca.",
+        "Segments": "Segmenti"
     }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/lang/pt-br.json b/plugins/CoreHome/lang/pt-br.json
index 24470d4b52955baa7920b1b2cb7eabc66bb59a60..61c4fe38192767e340d2e021c98982ce5c9bbd92 100644
--- a/plugins/CoreHome/lang/pt-br.json
+++ b/plugins/CoreHome/lang/pt-br.json
@@ -48,6 +48,8 @@
         "YouAreUsingTheLatestVersion": "Você está usando a última versão do Piwik!",
         "ClickRowToExpandOrContract": "Clique nesta linha para expandir ou contrair a subtabela.",
         "UndoPivotBySubtable": "Este relatório foi articulado %s desfazer articulação",
-        "PivotBySubtable": "Este relatório não foi articulado %s Articular por %s"
+        "PivotBySubtable": "Este relatório não foi articulado %s Articular por %s",
+        "QuickAccessTitle": "Procurar por entradas do menu, segmentos e websites. Atalho: Pressione 'f' para pesquisar.",
+        "Segments": "Segmentos"
     }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/stylesheets/coreHome.less b/plugins/CoreHome/stylesheets/coreHome.less
index 63607d749f5c4cdf779109c10c0f562d0e18c5d1..9be7d148797ceb272db1949ece74388731923402 100644
--- a/plugins/CoreHome/stylesheets/coreHome.less
+++ b/plugins/CoreHome/stylesheets/coreHome.less
@@ -1,8 +1,7 @@
 .home {
     h2 {
         font-size: 18px;
-        padding: 12px 0 7px 0;
-        clear: both;
+        padding: 16px 0 16px 0;
         border: none;
         margin: 0;
     }
@@ -18,21 +17,19 @@
     }
 }
 
-.nav_sep {
-    height: 39px;
-    border-radius: 0 4px 0 0;
-    border: 1px solid #DDD;
-}
-
-.pageWrap {
-    margin-top: 15px;
-    font-size: 13px;
-}
-
 /* Content */
 #content.home {
-    padding-top: 5px;
     font-size: 14px;
+    display: inline-block;
+    width: 100%;
+
+    > h2:first-child {
+        padding-top: 7px;
+    }
+}
+
+#content.admin {
+    display: inline-block;
 }
 
 /* 2 columns reports */
@@ -110,10 +107,8 @@ div.ui-datepicker {
     line-height: 12px;
 }
 
-#calendarRangeApply {
-    display: none;
+#calendarApply {
     margin-top: 10px;
-    margin-left: 10px;
 }
 
 #invalidDateRange {
@@ -211,10 +206,6 @@ a.Piwik_Popover_Error_Back {
     margin: 10px auto 5px !important;
 }
 
-.header_short #updateCheckLinkContainer .icon {
-  display: none;
-}
-
 .header_full #updateCheckLinkContainer {
   margin-top: -2px;
 }
@@ -230,39 +221,6 @@ a.Piwik_Popover_Error_Back {
   width: 160px;
 }
 
-#updateCheckLinkContainer {
-  opacity: 0.7;
-}
-
-#updateCheckLinkContainer:hover {
-  opacity: 1;
-}
-
-#updateCheckLinkContainer {
-    float: right;
-    cursor: pointer;
-}
-
-#updateCheckLinkContainer>* {
-    vertical-align: middle;
-}
-
-#header_message #checkForUpdates {
-    font-size: 10px;
-    line-height: 16px;
-    display: inline-block;
-    vertical-align: middle;
-    text-transform: uppercase;
-}
-
-#header_message #checkForUpdates {
-  text-decoration: none;
-}
-
-#header_message #checkForUpdates:hover {
-    text-decoration: underline;
-}
-
 /* Used to link within content text, without adding visual clutter */
 .linkContent { color:#333; text-decoration:none}
 .linkContent:hover { text-decoration:underline;}
@@ -271,4 +229,10 @@ a.Piwik_Popover_Error_Back {
   border-bottom: 0 none;
   margin:0;
   font-size:18px;
-}
\ No newline at end of file
+}
+
+#pluginSettings {
+    .settingIntroduction {
+        font-weight: bold;
+    } 
+}
diff --git a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less
index 5932fd0978286af7f04cba25c4d0205148580ccb..4b5f8321b2e6e73feedb93b7cb7e57f00e68a00a 100644
--- a/plugins/CoreHome/stylesheets/dataTable/_dataTable.less
+++ b/plugins/CoreHome/stylesheets/dataTable/_dataTable.less
@@ -42,6 +42,10 @@ table.dataTable img {
   margin-left: 0.5em;
 }
 
+table.subDataTable img.link {
+  transform: translateY(-50%);
+}
+
 table.dataTable tr.subDataTable {
   cursor: pointer;
 
@@ -164,7 +168,7 @@ div.dataTable, div.dataTable > .dataTableWrapper {
   color: #888;
   text-align: left;
   margin: 10px;
-  margin-left: 12px;
+  margin-left: 1px;
 }
 
 .dataTablePages {
@@ -589,7 +593,7 @@ tr td.label img.plusMinus {
 .pk-emptyDataTable {
   padding-top: 20px;
   padding-bottom: 10px;
-  padding-left: 11px;
+  padding-left: 1px;
 }
 
 .widget .pk-emptyDataTable {
diff --git a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css
index c3077b7b5fff731a34915d3c5b83e9a94e04d30a..8bac824f1c3f03b610b6749499d186d6d71c1de6 100644
--- a/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css
+++ b/plugins/CoreHome/stylesheets/jquery.ui.autocomplete.css
@@ -59,7 +59,7 @@
 }
 
 .ui-corner-all {
-    border-radius: 4px;
+    border-radius: 0;
 }
 
 .ui-menu .ui-menu-item a.ui-state-focus {
diff --git a/plugins/CoreHome/stylesheets/layout.less b/plugins/CoreHome/stylesheets/layout.less
new file mode 100644
index 0000000000000000000000000000000000000000..ac6d3ed8a6f38b138c13d8705dd87fd6f650f089
--- /dev/null
+++ b/plugins/CoreHome/stylesheets/layout.less
@@ -0,0 +1,397 @@
+ #header {
+  padding: 0 15px;
+  background-color: @theme-color-background-base;
+  height: 50px;
+
+  /* Clear fix */
+  &:after {
+    display: table;
+    clear: both;
+    content: "";
+  }
+
+  .icon-menu-hamburger {
+     display: none;
+  }
+
+  #logo {
+  }
+
+  #topRightBar {
+    li {
+      display: inline-block;
+    }
+
+    .topBarElem {
+      color: @theme-color-text;
+      text-decoration: none;
+      padding: 14px 12px;
+      display: inline-block;
+      height: 100%;
+      transition: background-color 150ms linear;
+
+      &:hover {
+        background-color: @theme-color-menu-contrast-background;
+      }
+
+      &.active {
+        color: @theme-color-brand;
+      }
+
+      .menuDropdown {
+        color: @theme-color-text;
+        .title:after {
+          color: @theme-color-text;
+          border-top-color: @theme-color-text;
+        }
+      }
+    }
+
+    .navbar-right {
+        height: 48px;
+        position: absolute;
+        right: 10px;
+        font-size: 13px;
+    }
+  }
+}
+
+ .navbar {
+   a {
+     text-decoration: none;
+     &:hover, &:focus, &:active {
+       text-decoration: none;
+     }
+   }
+ }
+
+ // start #secondNavBar fadeInLeft animation
+ @-webkit-keyframes fadeInLeft {
+   0% {
+     opacity: 0;
+     -webkit-transform: translateX(-20px);
+   }
+   100% {
+     opacity: 1;
+     -webkit-transform: translateX(0);
+   }
+ }
+ @keyframes fadeInLeft {
+   0% {
+     opacity: 0;
+     transform: translateX(-20px);
+   }
+   100% {
+     opacity: 1;
+     transform: translateX(0);
+   }
+ }
+ // end #secondNavBar fadeInLeft animation
+
+#root {
+
+  .pageWrap {
+    padding-left: 18px;
+    padding-right: 15px;
+  }
+
+  #secondNavBar + .pageWrap {
+    margin-left: 224px;
+  }
+
+  #root>.top_controls {
+    margin-left:15px;
+    margin-right:15px;
+  }
+
+  @media all and (max-width: 749px) {
+    .pageWrap {
+      margin-left: 0 !important;
+    }
+
+    #header {
+      min-height: 50px;
+      height: auto;
+    }
+
+    #topRightBar {
+      .navbar-right {
+        text-align: left;
+        margin-left: 2px;
+        display: inline-block;
+        position: relative;
+        height: auto;
+        min-height: 48px;
+      }
+    }
+
+    #navbar-collapse1 {
+      margin-left: 45px;
+    }
+
+    #secondNavBar {
+      z-index: 9999;
+      position: absolute;
+      border-right: 1px solid @theme-color-background-tinyContrast;
+      border-top: 1px solid @theme-color-background-tinyContrast;
+      -webkit-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75);
+      -moz-box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75);
+      box-shadow: 4px 4px 18px 1px rgba(0,0,0,0.75);
+      -webkit-animation-duration: 0.3s;
+      animation-duration: 0.3s;
+      -webkit-animation-fill-mode: both;
+      animation-fill-mode: both;
+      -webkit-animation-timing-function: linear;
+      animation-timing-function: linear;
+
+      display: none;
+      &.open {
+        display: block;
+        -webkit-animation-name: fadeInLeft;
+        animation-name: fadeInLeft;
+      }
+
+      #search {
+        display: none;
+      }
+    }
+
+
+    .top_controls {
+      height: auto;
+
+      .isPiwikDemo,
+      .piwikTopControl {
+        position: static !important;
+        margin: 0 0 10px;
+        float: none;
+        display: inline-block;
+      }
+      
+      .isPiwikDemo {
+        margin-top: 8px;
+      }
+    }
+
+    .icon-menu-hamburger {
+      padding: 10px 10px 10px;
+      display: inline-block;
+      float: left;
+      cursor: pointer;
+      font-size: 23px;
+    }
+
+    #logo {
+      display: none;
+    }
+
+  }
+
+  #ajaxLoadingDiv {
+    margin-top: 10px;
+  }
+
+  #secondNavBar {
+    width: 224px;
+    float:left;
+
+    #search {
+      padding: 8px 0 13px 8px;
+      height: 61px;
+
+      .quick-access {
+        z-index: 1000;
+        position: absolute;
+        width: 216px;
+        input {
+          height: 33px;
+          font-size: 11px;
+          padding: 10px 12px 10px 10px;
+        }
+      }
+    }
+
+    .navbar {
+      background-color: @theme-color-menu-contrast-background;
+      border-bottom: 1px solid @theme-color-menu-contrast-background;
+
+      .menu-icon {
+        padding-right: 13px;
+      }
+
+      > li {
+        display: inline-block;
+        width: 100%;
+        .border-radius(0px);
+        border: 0;
+        background: none;
+
+        .item {
+          display: inline-block;
+          width: 100%;
+          font-family: Verdana, sans-serif;
+          .font-default(13px, 21px);
+          padding: 12px 21px 12px 19px;
+          color: @theme-color-menu-contrast-text;
+          decoration: none !important;
+          word-break: break-word;
+
+          &:hover, &:focus {
+            decoration: none !important;
+          }
+        }
+
+        > .item {
+          cursor: default;
+          font-weight: bold;
+          &:hover {
+            text-decoration: none;
+          }
+        }
+
+        > ul {
+
+          li {
+            .item {
+              .font-default(13px, 16px);
+              padding: 11px 22px 11px 45px;
+              decoration: none;
+              transition: background-color 200ms linear;
+              &:hover {
+                text-decoration: none;
+                color: @theme-color-menu-contrast-textActive;
+              }
+            }
+
+            &.active {
+              > .menuDropdown,
+              > .item {
+                background-color: @theme-color-background-base;
+                decoration: none;
+              }
+            }
+          }
+        }
+      }
+
+
+      .menuDropdown {
+        width: 100%;
+
+        .items {
+          width: 224px;
+          box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);
+
+          .search {
+            margin: 15px 16px 10px 17px;
+          }
+
+          .item {
+            padding: 10px 16px 10px !important;
+            min-height: 25px;
+            height: auto;
+          }
+        }
+
+        .title {
+          color: @theme-color-menu-contrast-text;
+          display: block;
+          padding: 15px 22px 11px 45px;
+          font-size: 13px;
+          font-weight: normal;
+
+          &:hover {
+            color: @theme-color-menu-contrast-textActive;
+          }
+
+          &:after {
+            color: @theme-color-menu-contrast-text;
+            border-top: 5px solid @theme-color-menu-contrast-text;
+            top: 20px;
+            right: 3px;
+          }
+        }
+      }
+    }
+
+    &.Menu--dashboard .navbar > li {
+      > ul {
+        display: none;
+
+        @media all and (max-width: 749px) {
+          display: block;
+        }
+      }
+
+      > .item {
+        cursor: pointer;
+        &:hover {
+          color: @theme-color-menu-contrast-textActive;
+        }
+      }
+
+      &.active {
+        ul {
+          display: block;
+        }
+
+        .icon-arrow-right:before {
+          content: "\e63b";
+        }
+      }
+    }
+
+    &.Menu--admin .navbar > li {
+      > .item {
+        padding: 14px 21px 6px 19px;
+      }
+      .item .icon-arrow-right:before {
+        content: "\e63b";
+      }
+    }
+  }
+}
+
+#root {
+  .top_controls {
+    visibility: hidden;
+    opacity: 0;
+    .piwikTopControl {
+      margin-top: 8px;
+      margin-bottom: 8px;
+    }
+  }
+}
+
+#root, #standalone {
+  .top_controls {
+    min-height: 51px;
+    position: relative;
+    background-color: @theme-color-background-base;
+    height: auto;
+    margin-bottom: 10px;
+
+    .piwikTopControl {
+      display: inline-block;
+      float: none;
+      position: absolute;
+      margin-right: 18px;
+      vertical-align: top;
+      font-size: 11px;
+    }
+  }
+
+  .borderedControl {
+    background-color: @theme-color-background-base;
+    border: 1px solid @theme-color-background-tinyContrast;
+    transition: box-shadow 150ms linear;
+    &.expanded,
+    &:hover {
+      box-shadow: 0 1px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);
+    }
+  }
+}
+
+.widgetize {
+  width: auto;
+}
diff --git a/plugins/CoreHome/stylesheets/menu.less b/plugins/CoreHome/stylesheets/menu.less
deleted file mode 100644
index 76c8b9023808fa5a7673f78f672d547e4b918121..0000000000000000000000000000000000000000
--- a/plugins/CoreHome/stylesheets/menu.less
+++ /dev/null
@@ -1,177 +0,0 @@
-.Menu--dashboard {
-  position: relative;
-
-  .menuDropdown {
-
-    .items {
-      width: 250px;
-
-      .search {
-        margin: 15px 16px 10px 17px;
-      }
-
-      .item {
-        padding: 10px 16px 4px !important;
-        min-height: 25px;
-        height: auto;
-      }
-    }
-
-    .title {
-      color: @theme-color-menu-contrast-text;
-      display: block;
-      padding: 15px 22px 11px;
-      font-size: 15px;
-      font-weight: normal;
-
-      &:hover {
-        color: @theme-color-menu-contrast-textActive;
-      }
-
-      &:after {
-        color: @theme-color-menu-contrast-text;
-        border-top: 5px solid @theme-color-menu-contrast-text;
-        top: 20px;
-        right: 3px;
-      }
-    }
-  }
-}
-
-.Menu--dashboard > .Menu-tabList {
-    line-height: 1;
-    display: table;      // The nav has the height og his children
-    margin-bottom: -1px; // Allow tabs to merge with the submenu
-}
-
-.Menu--dashboard > .Menu-tabList ul {
-    background: @theme-color-background-base; /*IE6 needs this*/
-    float: left;
-    position: relative;
-}
-
-/* LEVEL1 NORMAL */
-.Menu--dashboard > .Menu-tabList > li {
-    background: #f1f1f1;
-    float: left;
-    list-style: none;
-    z-index: 49;
-    margin-right: -1px;
-    border: 1px solid #ddd;
-    border-bottom: 0;
-    border-radius: 4px 4px 0 0;
-}
-
-.Menu--dashboard > .Menu-tabList a {
-    color: @theme-color-text-light;
-    font-size: 18px;
-    display: block;
-    float: left;
-    padding: 8px 27px 0;
-    height: 50px;
-    text-decoration: none;
-    font-weight: normal;
-}
-
-/* LEVEL1 HOVER */
-.Menu--dashboard > .Menu-tabList > li:hover,
-.Menu--dashboard > .Menu-tabList > li.sfHover {
-    background: @theme-color-background-base;
-}
-
-.Menu--dashboard > .Menu-tabList > li:hover > a,
-.Menu--dashboard > .Menu-tabList > li.sfHover > a,
-.Menu--dashboard > .Menu-tabList > li.sfActive > a,
-.Menu--dashboard > .Menu-tabList a:hover {
-    color: @theme-color-link;
-}
-
-.Menu--dashboard > .Menu-tabList > li:hover > a {
-    text-decoration: underline;
-}
-
-.Menu--dashboard > .Menu-tabList > li.sfHover > a {
-    border-bottom: 1px solid #fff;
-}
-
-/* LEVEL2 NORMAL */
-.Menu--dashboard > .Menu-tabList > li ul {
-  padding: 9px 0 5px 0;
-  left: 0;
-  top: -999em;
-  position: absolute;
-  min-height: 25px;
-  width: 100%;
-  background: none;
-}
-
-.Menu--dashboard > .Menu-tabList > li li {
-    float: left;
-    background: none;
-    border: 0;
-    text-align: center;
-}
-
-.Menu--dashboard > .Menu-tabList > li li > a {
-    padding: 5px 15px;
-    font-size: 14px;
-    border: 0;
-    float: none;
-    display: inline-block;
-    height: auto;
-    background: none;
-    color: @theme-color-text-light;
-    text-decoration: none;
-}
-
-/* LEVEL2 HOVER */
-.Menu--dashboard > .Menu-tabList > li.sfHover ul,
-.Menu--dashboard > .Menu-tabList > li:hover ul {
-  z-index: 130;
-  top: 100%;
-  opacity: 1;
-  -webkit-transition: opacity 300ms ease-out 10ms; /* property duration timing-function delay */
-  -moz-transition: opacity 300ms ease-out 10ms;
-  -o-transition: opacity 300ms ease-out 10ms;
-  transition: opacity 300ms ease-out 10ms;
-}
-
-/* for screen readers */
-.Menu--dashboard a span.hidden {
-  height: 1px;
-  width: 1px;
-  position: absolute;
-  overflow: hidden;
-  top: 0;
-}
-
-
-.Menu--dashboard > .Menu-tabList > li li:hover > a,
-.Menu--dashboard > .Menu-tabList > li li.sfHover > a {
-    color: @theme-color-link;
-}
-
-.Menu--dashboard > .Menu-tabList > li li.sfHover > a {
-    font-weight: bold;
-    text-decoration: none !important;
-}
-
-@media all and (max-width: 949px) {
-  .nav {
-    clear: right;
-  }
-}
-
-@media all and (max-width: 749px) {
-  .Menu--dashboard > .Menu-tabList a {
-    padding-left: 8px;
-    padding-right: 8px;
-  }
-}
-
-@media all and (max-width: 549px) {
-  .Menu--dashboard > ul.Menu-tabList > li.sfHover > a,
-  .Menu--dashboard > ul.Menu-tabList > li.sfActive.sfHover > a {
-    border-bottom: 0;
-  }
-}
\ No newline at end of file
diff --git a/plugins/CoreHome/stylesheets/notification.less b/plugins/CoreHome/stylesheets/notification.less
index 36f7085f6f8263d1d8c8950a547446d05ebdd4ec..cab47a40a5f3f8bbb05ae292e5189eef86040d48 100644
--- a/plugins/CoreHome/stylesheets/notification.less
+++ b/plugins/CoreHome/stylesheets/notification.less
@@ -1,8 +1,5 @@
 #content.admin #notificationContainer {
-  width: 750px;
-  display: table-header-group; /* no overlap with About Piwik box */
-
   .notification {
-    margin: 10px;
+    margin: 0 0 10px 0;
   }
 }
\ No newline at end of file
diff --git a/plugins/CoreHome/stylesheets/zen-mode.less b/plugins/CoreHome/stylesheets/zen-mode.less
index 112c6b2da6cafc0d43f1555f38650972021a480c..520d501d32ca68af2cbb9dfaabb520206643c846 100644
--- a/plugins/CoreHome/stylesheets/zen-mode.less
+++ b/plugins/CoreHome/stylesheets/zen-mode.less
@@ -85,11 +85,12 @@
 
   h2 {
     margin-top: 40px;
-    padding-left: 10px;
-    font-size: 24px;
+    padding: 16px 0 12px 0;
+    font-size: 21px;
 
     &.noTopMargin {
-      margin-top: 0px;
+      margin-top: 0;
+      padding-top: 7px;
     }
   }
 
@@ -99,8 +100,13 @@
   }
 }
 
-.widget {
+#root #dashboard .widget {
+  h2 {
+    padding-left: 10px;
+  }
+}
 
+.widget {
   h2:nth-of-type(n+2) {
     padding-top: 40px!important;
     margin-top: 0!important;
diff --git a/plugins/CoreHome/templates/_adblockDetect.twig b/plugins/CoreHome/templates/_adblockDetect.twig
new file mode 100644
index 0000000000000000000000000000000000000000..ec69ffecf8e2f3e7e410b66dae6487396f14eac9
--- /dev/null
+++ b/plugins/CoreHome/templates/_adblockDetect.twig
@@ -0,0 +1,36 @@
+<div id="bottomAd" style="font-size: 2px;">&nbsp;</div>
+<script type="text/javascript">
+    if ('undefined' === (typeof hasBlockedContent) || hasBlockedContent !== false) {
+        {# if hasBlockedContent was "false" most likely nothing was blocked #}
+        (function () {
+            {# most likely jQuery is not available, have to use vanilla JS here #}
+            var body = document.getElementsByTagName('body');
+
+            if (!body || !body[0]) {
+                return;
+            }
+
+            var bottomAd = document.getElementById('bottomAd');
+            var wasMostLikelyCausedByAdblock = false;
+
+            if (!bottomAd) {
+                wasMostLikelyCausedByAdblock = true;
+            } else if (bottomAd.style && bottomAd.style.display === 'none') {
+                wasMostLikelyCausedByAdblock = true;
+            } else if ('undefined' !== (typeof bottomAd.clientHeight) && bottomAd.clientHeight === 0) {
+                wasMostLikelyCausedByAdblock = true;
+            }
+
+            if (wasMostLikelyCausedByAdblock) {
+                var warning = document.createElement('h3');
+                warning.innerHTML = '{{ 'CoreHome_AdblockIsMaybeUsed'|translate|e('js') }}';
+
+                body[0].appendChild(warning);
+                warning.style.color = 'red';
+                warning.style.fontWeight = 'bold';
+                warning.style.marginLeft = '16px';
+                warning.style.marginBottom = '16px';
+            }
+        })();
+    }
+</script>
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/_dataTableCell.twig b/plugins/CoreHome/templates/_dataTableCell.twig
index 40e61541f344333d1f9e7b19313256b35889bc3f..1bcd1bb0f2bdc4edb4675458ef4b114e57ea1011 100644
--- a/plugins/CoreHome/templates/_dataTableCell.twig
+++ b/plugins/CoreHome/templates/_dataTableCell.twig
@@ -25,7 +25,7 @@
 
     {% if siteTotal and siteTotal > reportTotal %}
         {% set totalPercentage   = row.getColumn(column)|percentage(siteTotal, 1) %}
-        {% set totalRatioTooltip = 'General_TotalRatioTooltip'|translate(totalPercentage, siteTotal, metricTitle) %}
+        {% set totalRatioTooltip = 'General_TotalRatioTooltip'|translate(totalPercentage, siteTotal|number(2,0), metricTitle) %}
     {% else %}
         {% set totalRatioTooltip = '' %}
     {% endif %}
@@ -41,7 +41,10 @@
         {{ piwik.logoHtml(row.getMetadata(), row.getColumn('label')) }}
         {% if row.getMetadata('html_label_prefix') %}<span class='label-prefix'>{{ row.getMetadata('html_label_prefix') | raw }}&nbsp;</span>{% endif -%}
         {%- if row.getMetadata('html_label_suffix') %}<span class='label-suffix'>{{ row.getMetadata('html_label_suffix') | raw }}</span>{% endif -%}
-{% endif %}<span class="value">{% if row.getColumn(column) %}{{- row.getColumn(column)|raw -}}{% else %}-{% endif %}</span>
+{% endif %}<span class="value">
+    {%- if row.getColumn(column) %}{% if column=='label' %}{{- row.getColumn(column)|raw -}}{% else %}{{- row.getColumn(column)|number(2,0)|raw -}}{% endif %}
+    {%- else -%}-
+    {%- endif -%}</span>
 {% if column=='label' %}</span>{% endif %}
 {% if not row.getIdSubDataTable() and column=='label' and row.getMetadata('url') %}
     </a>
diff --git a/plugins/CoreHome/templates/_headerMessage.twig b/plugins/CoreHome/templates/_headerMessage.twig
index c1d81b5cb0f0dc9e2a4234719728462b9ab4240f..bb4f8e760768b3a7700f87b98b4b796e823e6152 100644
--- a/plugins/CoreHome/templates/_headerMessage.twig
+++ b/plugins/CoreHome/templates/_headerMessage.twig
@@ -1,47 +1,59 @@
 {# testing, remove test_ from var names #}
 {% set test_latest_version_available="4.0.0" %}
 {% set test_piwikUrl='http://demo.piwik.org/' %}
-{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/'}}{% endset %}
+{% set isPiwikDemo %}{{ piwikUrl == 'http://demo.piwik.org/' or piwikUrl == 'https://demo.piwik.org/' }}{% endset %}
 
 {% set updateCheck %}
-<div id="updateCheckLinkContainer">
-    <span class='loadingPiwik' style="display:none;"><img src='plugins/Morpheus/images/loading-blue.gif'/></span>
-    <span class="icon icon-reload"></span>
-    <a href="#" id="checkForUpdates"><em>{{ 'CoreHome_CheckForUpdates'|translate }}</em></a>
-</div>
+    <span id="updateCheckLinkContainer">
+                {{ 'CoreHome_CheckForUpdates'|translate }}
+        <span class="icon icon-fixed icon-reload"></span>
+    </span>
 {% endset %}
 
 {% if isPiwikDemo or (latest_version_available and hasSomeViewAccess and not isUserIsAnonymous) or (isSuperUser and adminMenu is defined and adminMenu) %}
-<span id="header_message" class="{% if isPiwikDemo or not latest_version_available %}header_info{% else %}header_alert{% endif %}">
-    <span class="header_short">
+<div piwik-expand-on-hover
+     id="header_message"
+     class="piwikSelector borderedControl {% if isPiwikDemo or not latest_version_available %}header_info{% else %}{% endif %} {% if isPiwikDemo %}isPiwikDemo{% else %}piwikTopControl{% endif %} {% if latest_version_available %}update_available{% endif %}"
+        >
+
+    <a class="title" href="#">
         {% if isPiwikDemo %}
             {{ 'General_YouAreViewingDemoShortMessage'|translate }}
         {% elseif latest_version_available %}
             {{ 'General_NewUpdatePiwikX'|translate(latest_version_available) }}
+            <span class="icon-warning"></span>
         {% elseif isSuperUser and adminMenu is defined and adminMenu %}
             {{ updateCheck|raw }}
         {% endif %}
-    </span>
+    </a>
 
-    <span class="header_full">
+    <div class="dropdown">
         {% if isPiwikDemo %}
-            {{ 'General_YouAreViewingDemoShortMessage'|translate }}
-            <br />
             {{ 'General_DownloadFullVersion'|translate("<a href='http://piwik.org/'>","</a>","<a href='http://piwik.org'>piwik.org</a>")|raw }}
             <br/>
+            {% if isSuperUser and adminMenu is defined and adminMenu %}
+                <br/>
+            {% endif %}
         {% endif %}
         {% if latest_version_available and isSuperUser %}
             {{ 'General_PiwikXIsAvailablePleaseUpdateNow'|translate(latest_version_available,"<br /><a href='index.php?module=CoreUpdater&amp;action=newVersionAvailable'>","</a>","<a href='?module=Proxy&amp;action=redirect&amp;url=http://piwik.org/changelog/' target='_blank'>","</a>")|raw }}
+            <br />
         {% elseif latest_version_available and not isPiwikDemo and hasSomeViewAccess and not isUserIsAnonymous %}
             {% set updateSubject = 'General_NewUpdatePiwikX'|translate(latest_version_available)|e('url') %}
             {{ 'General_PiwikXIsAvailablePleaseNotifyPiwikAdmin'|translate("<a href='?module=Proxy&action=redirect&url=http://piwik.org/' target='_blank'>Piwik</a> <a href='?module=Proxy&action=redirect&url=http://piwik.org/changelog/' target='_blank'>" ~ latest_version_available ~ "</a>", "<a href='mailto:" ~ superUserEmails ~ "?subject=" ~ updateSubject ~ "'>", "</a>")|raw }}
-        {% endif %}
-        {% if isSuperUser and adminMenu is defined and adminMenu %}
             <br />
+        {% endif %}
+
+        {% if isPiwikDemo and isSuperUser and adminMenu is defined and adminMenu %}
+            <br/>
             {{ updateCheck|raw }}
+            <br/>
+            <br/>
         {% endif %}
-        <br />
+
         {{ 'General_YouAreCurrentlyUsing'|translate(piwik_version) }}
-    </span>
-</span>
+    </div>
+</div>
+
+<div style="clear:right"></div>
 {% endif %}
diff --git a/plugins/CoreHome/templates/_menu.twig b/plugins/CoreHome/templates/_menu.twig
index f4bfd7d902f2c14d8d79454a0550a589dfa997d4..b04b809405f487530ebc7767a7abddcaab6fc892 100644
--- a/plugins/CoreHome/templates/_menu.twig
+++ b/plugins/CoreHome/templates/_menu.twig
@@ -1,66 +1,43 @@
-{% macro submenuItem(name, url) %}
-    {% if name|slice(0,1) != '_' %}
-        <li>
-            <a class="menuItem" href='#{{ url|urlRewriteWithParameters|slice(1) }}'>
-                {{ name|translate }}
-            </a>
-        </li>
-    {% endif %}
-{% endmacro %}
-
-{% macro groupedItem(name, group) %}
-    <li>
-        <div piwik-menudropdown show-search="true" menu-title="{{ name|translate|e('html_attr') }}">
-            {% for item in group.getItems %}
-                <a class="item menuItem"
-                   href='#?{{ item.url|urlRewriteWithParameters|slice(1) }}'
-                   {% if item.tooltip %}title="{{ item.tooltip|e('html_attr') }}"{% endif %}>
-                    {{ item.name|translate }}
-                </a>
-            {% endfor %}
+{% macro menu(menu, anchorlink, cssClass, currentModule, currentAction) %}
+    <div id="secondNavBar" class="{{ cssClass }}">
+        <div id="search">
+            <div piwik-quick-access class="borderedControl"></div>
         </div>
-    </li>
-{% endmacro %}
-
-{% macro getId(urlParameters) -%}
-    {% if urlParameters is iterable -%}
-        {{ urlParameters|urlRewriteWithParameters }}
-    {%- endif %}
-{%- endmacro %}
+        <ul class="navbar">
+            {% for level1,level2 in menu %}
 
-{% macro getFirstUrl(urlParameters) -%}
-    {% if urlParameters is iterable -%}
-        {{ urlParameters|urlRewriteWithParameters|slice(1)  }}
-    {%- endif %}
-{%- endmacro %}
-
-<div class="Menu--dashboard">
-
-    <ul class="Menu-tabList">
-        {% for level1,level2 in menu %}
-            <li id="{% if level2._url is defined %}{{ _self.getId(level2._url) }}{% endif %}" class="menuTab">
-                <a class="menuItem" {% if level2._url is defined %}href="#{{ _self.getFirstUrl(level2._url) }}"{% endif %}>
-                    {{ level1|translate }}
-                   <span class="hidden">
-                     {{ 'CoreHome_Menu'|translate }}
-                   </span>
-                </a>
-                <ul>
+                {% set hasSubmenuItem = false %}
                 {% for name,urlParameters in level2 %}
-                    {% if urlParameters._url is defined and urlParameters._url is not iterable %}
-                        {{ _self.groupedItem(name,urlParameters._url) }}
-                    {% elseif name|slice(0,1) != '_' %}
-                        {{ _self.submenuItem(name,urlParameters._url) }}
+                    {% if name|slice(0,1) != '_' %}
+                        {% set hasSubmenuItem = true %}
                     {% endif %}
                 {% endfor %}
 
-                </ul>
-            </li>
-        {% endfor %}
-        <li id="Searchmenu">
-            <span piwik-quick-access></span>
-        </li>
-    </ul>
+                {% if hasSubmenuItem %}
+                    <li class="menuTab">
 
-</div>
-<div class="nav_sep"></div>
+                        <a class="item">
+                            <span class="menu-icon {{ level2._icon|default('icon-arrow-right') }}"></span>{{ level1|translate }}
+                            <span class="hidden">
+                             {{ 'CoreHome_Menu'|translate }}
+                           </span>
+                        </a>
+                        <ul>
+                            {% for name,urlParameters in level2 %}
+                                {% if name|slice(0,1) != '_' %}
+                                    <li {% if urlParameters._url.module is defined and urlParameters._url.module == currentModule and urlParameters._url.action is defined and urlParameters._url.action == currentAction %}class="active"{% endif %}
+                                        >
+                                        <a class="item"
+                                           href="index.php?{{ urlParameters._url|urlRewriteWithParameters|slice(1) }}">
+                                            {{ name|translate }}
+                                        </a>
+                                    </li>
+                                {% endif %}
+                            {% endfor %}
+                        </ul>
+                    </li>
+                {% endif %}
+            {% endfor %}
+        </ul>
+    </div>
+{% endmacro %}
diff --git a/plugins/CoreHome/templates/_periodSelect.twig b/plugins/CoreHome/templates/_periodSelect.twig
index 14ca6d707f30b424d24be9a3b470f1fc30a872c3..67b30183d3484b431661403a005554dd269f9ba9 100644
--- a/plugins/CoreHome/templates/_periodSelect.twig
+++ b/plugins/CoreHome/templates/_periodSelect.twig
@@ -1,7 +1,9 @@
-<div id="periodString" class="piwikTopControl periodSelector">
-    <div id="date">{{ 'General_DateRange'|translate }} <strong>{{ prettyDate }}</strong></div>
-    <div class="calendar-icon"></div>
-    <div id="periodMore">
+<div id="periodString" piwik-expand-on-click class="piwikTopControl piwikSelector borderedControl periodSelector">
+    <a id="date" class="title" title="{{ 'General_ChooseDate'|translate|e('html_attr') }}">
+        <span class="icon icon-calendar"></span>
+        {{ prettyDate }}
+    </a>
+    <div id="periodMore" class="dropdown">
         <div class="period-date">
             <div id="datepicker"></div>
         </div>
@@ -26,7 +28,7 @@
                 <br/>
             {% endfor %}
 			</span>
-            <input tabindex="3" type="submit" value="{{ 'General_ApplyDateRange'|translate }}" id="calendarRangeApply" class="btn"/>
+            <input tabindex="3" type="submit" value="{{ 'General_Apply'|translate }}" id="calendarApply" class="btn"/>
             {% import 'ajaxMacros.twig' as ajax %}
             {{ ajax.loadingDiv('ajaxLoadingCalendar') }}
         </div>
diff --git a/plugins/CoreHome/templates/_siteSelectHeader.twig b/plugins/CoreHome/templates/_siteSelectHeader.twig
index 547f2e41297b5afc74e9e680866e586d6aa16afe..7353e2e07a794f2c2138a403d56fcd4c11265865 100644
--- a/plugins/CoreHome/templates/_siteSelectHeader.twig
+++ b/plugins/CoreHome/templates/_siteSelectHeader.twig
@@ -1,5 +1,3 @@
-<div class="top_bar_sites_selector {% if currentModule == 'CoreHome' %}sites_selector_in_dashboard{% endif %}">
-    <label>{{ 'General_Website'|translate }}</label>
+<div class="top_bar_sites_selector piwikTopControl">
     <div piwik-siteselector class="sites_autocomplete"></div>
-
 </div>
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/_topBar.twig b/plugins/CoreHome/templates/_topBar.twig
index 41bd5da7a11af039e3b4ad268810419b614cebdb..e69e9c1978b840c8b8fb669d1a3ba601693f1350 100644
--- a/plugins/CoreHome/templates/_topBar.twig
+++ b/plugins/CoreHome/templates/_topBar.twig
@@ -1,4 +1,34 @@
 {{ postEvent("Template.beforeTopBar", userAlias, userLogin, topMenu, userMenu) }}
-<div id="topBars">
-    {% include "@CoreHome/_topBarTopMenu.twig" %}
-</div>
+<ul class="navbar-right">
+
+    {% macro menuItemLabel(label, icon) %}
+        {% if icon is defined and icon and icon starts with 'icon-' %}
+            <span class="{{ icon|striptags }}"></span>
+        {% else %}
+            {{ label|translate }}
+        {% endif %}
+    {% endmacro %}
+
+    {% macro topMenuItem(label, menu, currentModule, currentAction) %}
+        {% if menu._html is defined %}
+            {{ menu._html|raw }}
+        {% else %}
+            <a {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %}
+               class="topBarElem {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}"
+               id="topmenu-{{ menu._url.module|lower }}"
+               href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ _self.menuItemLabel(label, menu._icon) }}</a>
+        {% endif %}
+    {% endmacro %}
+
+    {% if topMenuModule is not defined %}
+        {% set topMenuModule = currentModule %}
+        {% set topMenuAction = currentAction %}
+    {% endif %}
+
+    {% spaceless %}
+        {% for label,menu in topMenu %}
+            <li>{{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }}</li>
+        {% endfor %}
+    {% endspaceless %}
+
+</ul>
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/_topBarTopMenu.twig b/plugins/CoreHome/templates/_topBarTopMenu.twig
deleted file mode 100644
index 459ccb611e268f2c116adb1f6f8bf0faa42ca774..0000000000000000000000000000000000000000
--- a/plugins/CoreHome/templates/_topBarTopMenu.twig
+++ /dev/null
@@ -1,37 +0,0 @@
-<div id="topRightBar">
-
-    {% macro topMenuItem(label, menu, currentModule, currentAction) %}
-        {% if menu._html is defined %}
-            {{ menu._html|raw }}
-        {% elseif (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}
-            <span class="topBarElem topBarElemActive"><strong>{{ label|translate }}</strong></span>
-        {% else %}
-            <span class="topBarElem" {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %}>
-            <a id="topmenu-{{ menu._url.module|lower }}" href="index.php{{ menu._url|urlRewriteWithParameters }}">{{ label|translate }}</a>
-        </span>
-        {% endif %}
-    {% endmacro %}
-
-    {% macro userMenuItem(label, menu, currentModule, currentAction) %}
-
-        <a class="item {% if (menu._url.module == currentModule and (menu._url.action is empty or menu._url.action == currentAction)) %}active{% endif %}"
-           href="index.php{{ menu._url|urlRewriteWithParameters }}"
-           id="usermenu-{{ menu._url.module|lower }}-{{ menu._url.action|default('index')|lower }}"
-           {% if menu._tooltip is defined %}title="{{ menu._tooltip }}"{% endif %}
-                >{{ label|translate }}</a>
-
-    {% endmacro %}
-
-    {% if topMenuModule is not defined %}
-        {% set topMenuModule = currentModule %}
-        {% set topMenuAction = currentAction %}
-    {% endif %}
-
-    {% for label,menu in topMenu %}
-        {% if not loop.first %}
-                |
-        {% endif %}
-        {{ _self.topMenuItem(label, menu, topMenuModule, topMenuAction) }}
-    {% endfor %}
-
-</div>
diff --git a/plugins/CoreHome/templates/_topScreen.twig b/plugins/CoreHome/templates/_topScreen.twig
index 2aebf1254e1fbe9733a0fdcfa7bfbe1ab0813989..805619814c4fce55ee26a0650399410c2f4e9d4d 100644
--- a/plugins/CoreHome/templates/_topScreen.twig
+++ b/plugins/CoreHome/templates/_topScreen.twig
@@ -1,5 +1,15 @@
-<div id="header">
-    <a href='#main' tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a>
-    {% include "@CoreHome/_logo.twig" %}
-    {% include "@CoreHome/_topBar.twig" %}
-</div>
+<div id="header" class="container-fluid">
+    <a href="#main" tabindex="0" class="accessibility-skip-to-content">{{'CoreHome_SkipToContent'|translate}}</a>
+    <div id="topRightBar" class="navbar row">
+        <div class="navbar-header col-md-3">
+            <span class="toggle-second-menu icon-menu-hamburger"></span>
+            {% include "@CoreHome/_logo.twig" %}
+
+            <!-- we need to put button to toggle nav for responsiveness here -->
+
+        </div>
+        <div class="collapse navbar-collapse col-md-9" id="navbar-collapse1">
+            {% include "@CoreHome/_topBar.twig" %}
+        </div>
+    </div>
+</div>
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/_uiControl.twig b/plugins/CoreHome/templates/_uiControl.twig
index 856f1afac0441632a87ffa25d1f8b625d863a682..1f188cb691c744ba6ce6f6b5e70adf9b977bca7c 100644
--- a/plugins/CoreHome/templates/_uiControl.twig
+++ b/plugins/CoreHome/templates/_uiControl.twig
@@ -1,6 +1,9 @@
 <div class="{{ cssIdentifier }} {{ cssClass }}"
-     data-props="{{ clientSideProperties|json_encode }}"
-     data-params="{{ clientSideParameters|json_encode }}">
-     {% render implView with implOverride %}
+    {% for name,value in htmlAttributes %}
+         {{ name }}="{{ value|e('html_attr') }}"
+    {% endfor %}
+    data-props="{{ clientSideProperties|json_encode }}"
+    data-params="{{ clientSideParameters|json_encode }}">
+{% render implView with implOverride %}
 </div>
 <script>$(document).ready(function () { require('{{ jsNamespace }}').{{ jsClass }}.initElements(); });</script>
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/_userMenu.twig b/plugins/CoreHome/templates/_userMenu.twig
deleted file mode 100644
index 67076af75599094b5cda985a3397371cf0a54db4..0000000000000000000000000000000000000000
--- a/plugins/CoreHome/templates/_userMenu.twig
+++ /dev/null
@@ -1,3 +0,0 @@
-{% import '@CoreHome/macros.twig' as corehome %}
-
-{{ corehome.sidebarMenu(userMenu, currentModule, currentAction) }}
\ No newline at end of file
diff --git a/plugins/CoreHome/templates/getDefaultIndexView.twig b/plugins/CoreHome/templates/getDefaultIndexView.twig
index 4efd45315906b07d467f783f23c20d2712749abe..d685977971c6ccedbdba30b91f755c1bec54bc69 100644
--- a/plugins/CoreHome/templates/getDefaultIndexView.twig
+++ b/plugins/CoreHome/templates/getDefaultIndexView.twig
@@ -1,13 +1,23 @@
 {% extends "dashboard.twig" %}
-{% block notification %}{% endblock %}
-{% block content %}
+{% import 'ajaxMacros.twig' as ajax %}
 
-{% include "@CoreHome/_siteSelectHeader.twig" %}
+{% block topcontrols %}
+    {% include "@CoreHome/_siteSelectHeader.twig" %}
+    {% include "@CoreHome/_periodSelect.twig" %}
+    {{ postEvent("Template.nextToCalendar") }}
+    {% render dashboardSettingsControl %}
+    {% include "@CoreHome/_headerMessage.twig" %}
+{% endblock %}
 
-<div piwik-reporting-menu></div>
-<div class="nav_sep"></div>
+{% block content %}
+    {{ ajax.requestErrorDiv(emailSuperUser|default('')) }}
+    {{ ajax.loadingDiv() }}
 
-{% include "@CoreHome/_indexContent.twig" %}
+    <div id="content" class="home">
+        {% if content %}{{ content }}{% endif %}
+        <div piwik-reporting-page ng-cloak></div>
+    </div>
+    <div class="clear"></div>
 
 {% endblock %}
 
diff --git a/plugins/CoreHome/templates/macros.twig b/plugins/CoreHome/templates/macros.twig
deleted file mode 100644
index 05638568568572281498bf47be68120f9d1dbe19..0000000000000000000000000000000000000000
--- a/plugins/CoreHome/templates/macros.twig
+++ /dev/null
@@ -1,26 +0,0 @@
-{% macro sidebarMenu(sidebarMenu, currentModule, currentAction) %}
-    {% if sidebarMenu|length > 1 %}
-        <div class="Menu Menu--admin">
-            <ul class="Menu-tabList">
-                {% for name,submenu in sidebarMenu %}
-                    {% if submenu._hasSubmenu %}
-                        <li>
-                            <span>{{ name|translate }}</span>
-                            <ul>
-                                {% for sname,url in submenu %}
-                                    {% if sname|slice(0,1) != '_' %}
-                                        <li>
-                                            <a href='index.php{{ url._url|urlRewriteWithParameters }}'
-                                               target="_self"
-                                               {% if url._url.module == currentModule and (url._url.action is empty or url._url.action == currentAction) %}class='active'{% endif %}>{{ sname|translate }}</a>
-                                        </li>
-                                    {% endif %}
-                                {% endfor %}
-                            </ul>
-                        </li>
-                    {% endif %}
-                {% endfor %}
-            </ul>
-        </div>
-    {% endif %}
-{% endmacro %}
diff --git a/plugins/CorePluginsAdmin/Menu.php b/plugins/CorePluginsAdmin/Menu.php
index 97ec818a59b6703eaa3eb1f4588615b14569ced3..415ace73a6ceee39dafbef5ef30dc538c5e46c0c 100644
--- a/plugins/CorePluginsAdmin/Menu.php
+++ b/plugins/CorePluginsAdmin/Menu.php
@@ -49,7 +49,7 @@ class Menu extends \Piwik\Plugin\Menu
 
         if (Piwik::hasUserSuperUserAccess() && CorePluginsAdmin::isMarketplaceEnabled()) {
             $menu->addManageItem('CorePluginsAdmin_Marketplace',
-                $this->urlForAction('browsePlugins', array('activated' => '')),
+                $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'admin')),
                 $order = 12);
         }
     }
@@ -66,7 +66,7 @@ class Menu extends \Piwik\Plugin\Menu
     {
         if ($this->isAllowedToSeeMarketPlace()) {
             $menu->addPlatformItem('CorePluginsAdmin_Marketplace',
-                                   $this->urlForAction('userBrowsePlugins', array('activated' => '')),
+                                   $this->urlForAction('marketplace', array('activated' => '', 'mode' => 'user')),
                                    $order = 5);
         }
     }
diff --git a/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less b/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less
index d506e60f04e0d64339e6f59e36a6709846807200..4d43e0e600b0b68293700218bc5443cefa0df413 100644
--- a/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less
+++ b/plugins/CorePluginsAdmin/stylesheets/plugins_admin.less
@@ -93,6 +93,14 @@ table.entityTable tr td a.uninstall {
 
 #plugins {
 
+    .inactive-plugin,
+    .active-plugin {
+        .name {
+            max-width: 200px;
+            word-wrap: break-word;
+        }
+    }
+
     .plugin-desc-missingrequirements {
         font-weight:bold;
         font-style: italic;
diff --git a/plugins/CorePluginsAdmin/templates/macros.twig b/plugins/CorePluginsAdmin/templates/macros.twig
index 0c0ea9e27910cca9da5ac0519498f702c2ac5997..d7e7c459b0ddda44c6bacaccfa201b35982ea5c7 100644
--- a/plugins/CorePluginsAdmin/templates/macros.twig
+++ b/plugins/CorePluginsAdmin/templates/macros.twig
@@ -153,7 +153,7 @@
             {% set isDefaultTheme = isTheme and name == 'Morpheus' %}
             {% if (plugin.alwaysActivated is defined and not plugin.alwaysActivated) or isTheme %}
                 <tr {% if plugin.activated %}class="active-plugin"{% else %}class="inactive-plugin"{% endif %} data-filter-status="{% if plugin.activated %}active{% else %}inactive{% endif %}" data-filter-origin="{% if plugin.isCorePlugin %}core{% else %}noncore{% endif %}">
-                    <td class="name" style="white-space:nowrap;">
+                    <td class="name">
                         <a name="{{ name|e('html_attr') }}"></a>
                         {% if not plugin.isCorePlugin and name in marketplacePluginNames -%}
                             <a href="javascript:void(0);" class="plugin-details"
diff --git a/plugins/CoreVisualizations/javascripts/jqplot.js b/plugins/CoreVisualizations/javascripts/jqplot.js
index 5392dc986cbb6895bb4adab424302b5020e366b1..6e5d2135d1e731f467d6a1ddfc448d800a78aecd 100644
--- a/plugins/CoreVisualizations/javascripts/jqplot.js
+++ b/plugins/CoreVisualizations/javascripts/jqplot.js
@@ -114,7 +114,8 @@
                 axes: {
                     yaxis: {
                         tickOptions: {
-                            formatString: '%d'
+                            formatString: '%s',
+                            formatter: $.jqplot.NumberFormatter
                         }
                     }
                 }
@@ -384,7 +385,7 @@
             // TODO: this code destroys plots when a page is switched. there must be a better way of managing memory.
             if (typeof $.jqplot.visiblePlots == 'undefined') {
                 $.jqplot.visiblePlots = [];
-                $('.nav').on('piwikSwitchPage', function () {
+                $('#secondNavBar').on('piwikSwitchPage', function () {
                     for (var i = 0; i < $.jqplot.visiblePlots.length; i++) {
                         if ($.jqplot.visiblePlots[i] == null) {
                             continue;
@@ -528,7 +529,7 @@
             var axisId = this.jqplotParams.series[seriesIndex].yaxis;
             var formatString = this.jqplotParams.axes[axisId].tickOptions.formatString;
 
-            return formatString.replace('%s', value);
+            return $.jqplot.NumberFormatter(formatString, value);
         },
 
         /**
@@ -746,6 +747,22 @@ RowEvolutionSeriesToggle.prototype.beforeReplot = function () {
     }
 };
 
+// ------------------------------------------------------------
+//  PIWIK NUMBERFORMATTER PLUGIN FOR JQPLOT
+// ------------------------------------------------------------
+(function($){
+
+    $.jqplot.NumberFormatter = function (format, value) {
+
+        if (!$.isNumeric(value)) {
+            return format.replace(/%s/, value);
+        }
+        return format.replace(/%s/, NumberFormatter.formatNumber(value));
+    }
+
+})(jQuery);
+
+
 // ------------------------------------------------------------
 //  PIWIK TICKS PLUGIN FOR JQPLOT
 //  Handle ticks the piwik way...
diff --git a/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js b/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js
index 69996cd4b7204d624a43c514ca3034bdc1128e99..cd21308f739b35e7c983db7e404cd4d7bbd2c681 100644
--- a/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js
+++ b/plugins/CoreVisualizations/javascripts/jqplotBarGraph.js
@@ -62,7 +62,7 @@
             var percentage = '';
             if (typeof this.tooltip.percentages != 'undefined') {
                 percentage = this.tooltip.percentages[seriesIndex][valueIndex];
-                percentage = ' (' + percentage + '%)';
+                percentage = ' (' + NumberFormatter.formatPercent(percentage) + ')';
             }
 
             var label = this.jqplotParams.axes.xaxis.labels[valueIndex];
diff --git a/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js b/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js
index df0a7f9b2f7e0b2175418b115b563591649f61b8..7169e32af4ff1b75ce486fcb8fff709a964e5db8 100644
--- a/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js
+++ b/plugins/CoreVisualizations/javascripts/jqplotPieGraph.js
@@ -67,7 +67,7 @@
 
             var label = this.data[0][valueIndex][0];
 
-            var text = '<strong>' + percentage + '%</strong> (' + value + ' ' + series + ')';
+            var text = '<strong>' + NumberFormatter.formatPercent(percentage) + '</strong> (' + value + ' ' + series + ')';
             $(element).tooltip({
                 track:   true,
                 items:   '*',
diff --git a/plugins/CustomAlerts b/plugins/CustomAlerts
index eeaa41b2ac0aa559caf2ef7c1be3b893de69c795..6c05ca43d7c83dd795eb713b9feb624d8d6d2eb1 160000
--- a/plugins/CustomAlerts
+++ b/plugins/CustomAlerts
@@ -1 +1 @@
-Subproject commit eeaa41b2ac0aa559caf2ef7c1be3b893de69c795
+Subproject commit 6c05ca43d7c83dd795eb713b9feb624d8d6d2eb1
diff --git a/plugins/Dashboard/Categories/DashboardCategory.php b/plugins/Dashboard/Categories/DashboardCategory.php
index 99a3785c840edbe5f9606bc1e564b8aedb19e604..4fb99523858e94d5f96619afc6af903b5e8b877d 100644
--- a/plugins/Dashboard/Categories/DashboardCategory.php
+++ b/plugins/Dashboard/Categories/DashboardCategory.php
@@ -14,4 +14,5 @@ class DashboardCategory extends Category
 {
     protected $id = 'Dashboard_Dashboard';
     protected $order = 0;
+    protected $icon = 'icon-reporting-dashboard';
 }
diff --git a/plugins/Dashboard/Dashboard.php b/plugins/Dashboard/Dashboard.php
index 5a0a7cc0ec6af802e73f23440aa7fec746bb6ce4..f46bf1526f100972424af009a86ea2efb086d097 100644
--- a/plugins/Dashboard/Dashboard.php
+++ b/plugins/Dashboard/Dashboard.php
@@ -35,35 +35,73 @@ class Dashboard extends \Piwik\Plugin
 
     public function addWidgetConfigs(&$widgets)
     {
-        $dashboards = API::getInstance()->getDashboards();
-
-        foreach ($dashboards as $dashboard) {
-            $config = new WidgetConfig();
-            $config->setIsNotWidgetizable();
-            $config->setModule('Dashboard');
-            $config->setAction('embeddedIndex');
-            $config->setCategoryId('Dashboard_Dashboard');
-            $config->setSubcategoryId($dashboard['id']);
-            $config->setParameters(array('idDashboard' => $dashboard['id']));
-            $widgets[] = $config;
+        if (Piwik::isUserIsAnonymous()) {
+            $this->addDefaultDashboard($widgets);
+        } else {
+            $dashboards = API::getInstance()->getDashboards();
+
+            if (empty($dashboards)) {
+                $this->addDefaultDashboard($widgets);
+            } else {
+                foreach ($dashboards as $dashboard) {
+                    $config = new WidgetConfig();
+                    $config->setIsNotWidgetizable();
+                    $config->setModule('Dashboard');
+                    $config->setAction('embeddedIndex');
+                    $config->setCategoryId('Dashboard_Dashboard');
+                    $config->setSubcategoryId($dashboard['id']);
+                    $config->setParameters(array('idDashboard' => $dashboard['id']));
+                    $widgets[] = $config;
+                }
+            }
         }
     }
 
+    private function addDefaultDashboard(&$widgets)
+    {
+        $config = new WidgetConfig();
+        $config->setIsNotWidgetizable();
+        $config->setModule('Dashboard');
+        $config->setAction('embeddedIndex');
+        $config->setCategoryId('Dashboard_Dashboard');
+        $config->setSubcategoryId('1');
+        $config->setParameters(array('idDashboard' => 1));
+        $widgets[] = $config;
+    }
+
     public function addSubcategories(&$subcategories)
     {
-        $dashboards = API::getInstance()->getDashboards();
-
-        $order = 0;
-        foreach ($dashboards as $dashboard) {
-            $subcategory = new Subcategory();
-            $subcategory->setName($dashboard['name']);
-            $subcategory->setCategoryId('Dashboard_Dashboard');
-            $subcategory->setId($dashboard['id']);
-            $subcategory->setOrder($order++);
-            $subcategories[] = $subcategory;
+        if (Piwik::isUserIsAnonymous()) {
+            $this->addDefaultSubcategory($subcategories);
+        } else {
+            $dashboards = API::getInstance()->getDashboards();
+
+            if (empty($dashboards)) {
+                $this->addDefaultSubcategory($subcategories);
+            } else {
+                $order = 0;
+                foreach ($dashboards as $dashboard) {
+                    $subcategory = new Subcategory();
+                    $subcategory->setName($dashboard['name']);
+                    $subcategory->setCategoryId('Dashboard_Dashboard');
+                    $subcategory->setId($dashboard['id']);
+                    $subcategory->setOrder($order++);
+                    $subcategories[] = $subcategory;
+                }
+            }
         }
     }
 
+    private function addDefaultSubcategory(&$subcategories)
+    {
+        $subcategory = new Subcategory();
+        $subcategory->setName('Dashboard_Dashboard');
+        $subcategory->setCategoryId('Dashboard_Dashboard');
+        $subcategory->setId('1');
+        $subcategory->setOrder(1);
+        $subcategories[] = $subcategory;
+    }
+
     /**
      * Returns the layout in the DB for the given user, or false if the layout has not been set yet.
      * Parameters must be checked BEFORE this function call
@@ -258,6 +296,7 @@ class Dashboard extends \Piwik\Plugin
         $translationKeys[] = 'Dashboard_LoadingWidget';
         $translationKeys[] = 'Dashboard_WidgetNotFound';
         $translationKeys[] = 'Dashboard_DashboardCopied';
+        $translationKeys[] = 'Dashboard_Dashboard';
         $translationKeys[] = 'General_Close';
         $translationKeys[] = 'General_Refresh';
     }
diff --git a/plugins/Dashboard/DashboardManagerControl.php b/plugins/Dashboard/DashboardManagerControl.php
index fb119e008367e75359d0ae2ca0deab30a2e59770..df573903b34014b891d4c6523406c01f40b1d830 100644
--- a/plugins/Dashboard/DashboardManagerControl.php
+++ b/plugins/Dashboard/DashboardManagerControl.php
@@ -20,7 +20,7 @@ class DashboardManagerControl extends DashboardSettingsControlBase
         parent::__construct();
 
         $this->jsClass = "DashboardManagerControl";
-        $this->cssIdentifier = "dashboard-manager";
+        $this->cssIdentifier = "dashboard-manager piwikSelector";
 
         $this->addDashboardActions();
         $this->addGeneralActions();
diff --git a/plugins/Dashboard/DashboardSettingsControlBase.php b/plugins/Dashboard/DashboardSettingsControlBase.php
index 72752240829b6c83eaf31efe221662420dca0882..c47ece211af382efe7ea8a2dce69b24d70f1a5ee 100644
--- a/plugins/Dashboard/DashboardSettingsControlBase.php
+++ b/plugins/Dashboard/DashboardSettingsControlBase.php
@@ -23,7 +23,8 @@ abstract class DashboardSettingsControlBase extends UIControl
     {
         parent::__construct();
 
-        $this->cssClass = "piwikTopControl dashboardSettings";
+        $this->cssClass = "borderedControl piwikTopControl dashboardSettings";
+        $this->htmlAttributes = array('piwik-expand-on-click' => '');
         $this->dashboardActions = array();
         $this->generalActions = array();
     }
diff --git a/plugins/Dashboard/javascripts/dashboard.js b/plugins/Dashboard/javascripts/dashboard.js
index 039f243c428f6a7b2f7edb78f8281454055ec17e..5a0396e6b3e535a2e2fe71c20a3251078f2cc792 100644
--- a/plugins/Dashboard/javascripts/dashboard.js
+++ b/plugins/Dashboard/javascripts/dashboard.js
@@ -161,7 +161,7 @@ function copyDashboardToUser() {
         // on menu item click, trigger action event on this
         var self = this;
         this.$element.on('click', 'ul.submenu li[data-action]', function (e) {
-            self.$element.toggleClass('visible');
+            self.$element.toggleClass('expanded');
 
             $(self).trigger($(this).attr('data-action'));
         });
@@ -169,7 +169,7 @@ function copyDashboardToUser() {
         // open manager on open
         this.$element.on('click', function (e) {
             if ($(e.target).is('.dashboardSettings,.dashboardSettings>span')) {
-                self.$element.toggleClass('visible');
+                self.$element.toggleClass('expanded');
 
                 // fix position
                 self.$element
@@ -186,7 +186,7 @@ function copyDashboardToUser() {
                 && !$(e.target).is('.dashboardSettings')
             ) {
                 self.$element.widgetPreview('reset');
-                self.$element.removeClass('visible');
+                self.$element.removeClass('expanded');
             }
         };
 
@@ -199,7 +199,7 @@ function copyDashboardToUser() {
             },
             onSelect: function (widgetUniqueId) {
                 var widget = widgetsHelper.getWidgetObjectFromUniqueId(widgetUniqueId);
-                self.$element.removeClass('visible');
+                self.$element.removeClass('expanded');
 
                 self.widgetSelected(widget);
             },
@@ -280,7 +280,7 @@ function copyDashboardToUser() {
         },
 
         hide: function () {
-            this.$element.removeClass('visible');
+            this.$element.removeClass('expanded');
         },
 
         isWidgetAvailable: function (widgetUniqueId) {
diff --git a/plugins/Dashboard/javascripts/dashboardObject.js b/plugins/Dashboard/javascripts/dashboardObject.js
index 32c6c01a94ae944da45bd79f847f3edacfd0e92b..beb590c4f666d335cc18733fad6c4e01ee239c8d 100644
--- a/plugins/Dashboard/javascripts/dashboardObject.js
+++ b/plugins/Dashboard/javascripts/dashboardObject.js
@@ -509,24 +509,26 @@
                 return $(this).attr('id').indexOf('Dashboard_embeddedIndex') == 0;
             }).remove();
 
+            if (dashboards.length === 0) {
+                dashboards = [{iddashboard: 1, name: _pk_translate('Dashboard_Dashboard')}];
+            }
+
             if (dashboards.length > 1
                 || dashboardMenuListItems.length >= 1
             ) {
                 var items = [];
                 for (var i = 0; i < dashboards.length; i++) {
-                    var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name);
+                    var $link = $('<a/>').attr('data-idDashboard', dashboards[i].iddashboard).text(dashboards[i].name).addClass('item title');
                     var $li = $('<li/>').attr('id', 'Dashboard_embeddedIndex_' + dashboards[i].iddashboard)
                         .addClass('dashboardMenuItem').append($link);
                     items.push($li);
 
                     if (dashboards[i].iddashboard == dashboardId) {
                         dashboardName = dashboards[i].name;
-                        $li.addClass('sfHover');
+                        $li.addClass('active');
                     }
                 }
                 dashboardMenuList.prepend(items);
-            } else {
-                dashboardMenuList.hide();
             }
 
             dashboardMenuList.find('a[data-idDashboard]').click(function (e) {
diff --git a/plugins/Dashboard/javascripts/widgetMenu.js b/plugins/Dashboard/javascripts/widgetMenu.js
index 169768eb0353935cc1da888255283cdc1f12c966..7190f342a5b66d02f533b027066c796c11d1531b 100644
--- a/plugins/Dashboard/javascripts/widgetMenu.js
+++ b/plugins/Dashboard/javascripts/widgetMenu.js
@@ -288,7 +288,12 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid
 
                 if ($('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).length) {
                     var position = $('.' + settings.categorylistClass + ' .' + settings.choosenClass, widgetPreview).position().top -
-                        $('.' + settings.categorylistClass, widgetPreview).position().top;
+                        $('.' + settings.categorylistClass, widgetPreview).position().top +
+                        $('.dashboard-manager .addWidget').outerHeight();
+
+                    if (!$('#content.admin').length) {
+                        position += 10; // + padding defined in dashboard view
+                    }
 
                     $('.' + settings.widgetlistClass, widgetPreview).css('top', position);
                     $('.' + settings.widgetlistClass, widgetPreview).css('marginBottom', position);
@@ -344,6 +349,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid
                 $('li', widgetList).on('click', function () {
                     if (!$('.widgetLoading', widgetPreview).length) {
                         settings.onSelect($(this).attr('uniqueid'));
+                        $(widgetPreview).closest('.dashboard-manager').removeClass('expanded');
                         if (settings.resetOnSelect) {
                             resetWidgetPreview(widgetPreview);
                         }
@@ -405,6 +411,7 @@ widgetsHelper.loadWidgetAjax = function (widgetUniqueId, widgetParameters, onWid
                     settings.onPreviewLoaded(widgetUniqueId, widgetElement);
                     $('.' + settings.widgetpreviewClass + ' .widgetTop', widgetPreview).on('click', function () {
                         settings.onSelect(widgetUniqueId);
+                        $(widgetPreview).closest('.dashboard-manager').removeClass('expanded');
                         if (settings.resetOnSelect) {
                             resetWidgetPreview(widgetPreview);
                         }
diff --git a/plugins/Dashboard/lang/ko.json b/plugins/Dashboard/lang/ko.json
index 995d08d2f33c0a7d05bc83a8e91d13891a9be56d..535fe103191ffb332b16a95ac013864cd8341777 100644
--- a/plugins/Dashboard/lang/ko.json
+++ b/plugins/Dashboard/lang/ko.json
@@ -10,7 +10,7 @@
         "DashboardEmptyNotification": "대시보드에 위젯이 하나도 없습니다. 대시 보드 위젯을 추가하거나 대시 보드를 기본 위젯으로 재설정하세요.",
         "DashboardName": "대시보드 이름:",
         "DashboardOf": "%s의 대시보드",
-        "DefaultDashboard": "기본 대시보드 - 기본 위젯과 열로 구성된 레이아웃을 사용합니다",
+        "DefaultDashboard": "기본 대시보드 - 기본 위젯으로 구성된 레이아웃을 사용합니다",
         "DeleteWidgetConfirm": "대시보드에서 이 위젯을 삭제하시겠습니까?",
         "EmptyDashboard": "빈 대시보드 - 원하는 위젯을 선택하세요",
         "LoadingWidget": "위젯 로딩중, 잠시만 기다리세요...",
@@ -18,6 +18,7 @@
         "Maximise": "최대화",
         "Minimise": "최소화",
         "NotUndo": "이 작업은 취소할 수 없습니다.",
+        "PluginDescription": "당신의 사이트를 분석한 대시보드입니다. 드래그 앤 드롭으로 새로운 위젯을 추가하거나 대시보드 레이아웃을 바꾸는 기능을 통해 당신만의 대시보드를 꾸며보세요. 모든 사용자들은 자신만의 대시보드를 가질 수 있습니다.",
         "RemoveDashboard": "대시보드 삭제",
         "RemoveDashboardConfirm": "정말 대시보드 \"%s\"를 삭제 하시겠습니까?",
         "RenameDashboard": "대시보드 이름 변경",
diff --git a/plugins/Dashboard/stylesheets/dashboard.less b/plugins/Dashboard/stylesheets/dashboard.less
index fad10183e7d19adaa407caee790d583792a152e8..39ad2e3ed77c4afcc935e46ecfa252c3ceb62390 100644
--- a/plugins/Dashboard/stylesheets/dashboard.less
+++ b/plugins/Dashboard/stylesheets/dashboard.less
@@ -1,40 +1,21 @@
 #dashboard {
-  margin: 0 -7px;
+  margin: 0 -6px;
 }
 
-#root>.top_controls {
-  margin-left:15px;
-  margin-right:15px;
+#standalone #dashboard {
+  margin: -10px -6px 0;
 }
-.top_controls {
-  position: relative;
-  height: 32px;
-  clear: left;
-}
-
-@media all and (max-width: 749px) {
-  .top_controls {
-    height: auto;
-  }
 
-  .top_controls #periodString,
-  .top_controls .dashboardSettings,
-  .top_controls .segmentEditorPanel {
-    position: static !important;
-    margin: 0 0 10px;
-    float: none;
-  }
-}
 
 #dashboard {
   .col {
     min-height: 100px;
     // Customize Bootstrap gutter between columns
-    padding-right: 7px;
-    padding-left: 7px;
+    padding-right: 6px;
+    padding-left: 6px;
 
     >.sortable {
-      padding: 5px 0 10px 0;
+      padding: 5px 0 8px 0;
     }
   }
 }
@@ -152,10 +133,8 @@
   z-index: 120;
   background: #f7f7f7;
   border: 1px solid #e4e5e4;
-  padding: 5px 10px 6px 10px;
   border-radius: 4px;
   color: @theme-color-text-light;
-  font-size: 14px;
   cursor: pointer;
   overflow: hidden;
 }
@@ -165,9 +144,9 @@
   border-color: #a9a399;
 }
 
-.dashboardSettings.visible {
+.dashboardSettings.expanded {
   z-index: 1020; /* More than .jqplot-seriespicker-popover (1010) */
-  min-width: 700px;
+  min-width: 800px;
 }
 
 .dashboardSettings > span {
@@ -182,10 +161,9 @@
   float: left;
 }
 
-.dashboardSettings.visible ul.submenu {
+.dashboardSettings.expanded ul.submenu {
   display: block;
   list-style: square outside none;
-  margin-left: 15px;
 }
 
 .dashboardSettings > ul.submenu > li {
@@ -328,7 +306,6 @@ div.widgetpreview-preview {
   min-height: 0;
   height: auto;
   margin-right: 10px;
-  min-width: 180px;
 }
 
 .dashboardSettings .submenu {
@@ -372,8 +349,8 @@ div.widgetpreview-preview {
   display: none;
 }
 
-.dashboardSettings.visible .widgetpreview-widgetlist,
-.dashboardSettings.visible .widgetpreview-preview {
+.dashboardSettings.expanded .widgetpreview-widgetlist,
+.dashboardSettings.expanded .widgetpreview-preview {
   display: block;
 }
 
@@ -416,7 +393,7 @@ div.widgetpreview-preview {
 }
 
 #dashboardWidgetsArea {
-  margin-top: 5px;
+  margin-top: -5px;
 }
 
 @media all and (max-width: 749px) {
diff --git a/plugins/Dashboard/stylesheets/standalone.css b/plugins/Dashboard/stylesheets/standalone.css
index 5a2b0d90d9f436516d31da145ed5d15c9002b7b2..292d3e63c0d2cca73b7320acabaceb52544c7688 100644
--- a/plugins/Dashboard/stylesheets/standalone.css
+++ b/plugins/Dashboard/stylesheets/standalone.css
@@ -45,17 +45,10 @@ body {
 }
 
 #Dashboard > ul > li:hover,
-#Dashboard > ul > li:hover a,
-#Dashboard > ul > li.sfHover,
-#Dashboard > ul > li.sfHover a {
+#Dashboard > ul > li:hover a {
     color: #e87500;
 }
 
-#Dashboard > ul > li.sfHover,
-#Dashboard > ul > li.sfHover a {
-    font-weight: bold;
-}
-
 .top_controls > #Dashboard,
 .top_controls > #periodString,
 .top_controls > .dashboardSettings {
diff --git a/plugins/Dashboard/stylesheets/widget.less b/plugins/Dashboard/stylesheets/widget.less
index a06564f033aedd13b9e4e8021ad4542162e77ee9..558da41ab9d32b8e48c3edd2a509ec06b91ffa95 100644
--- a/plugins/Dashboard/stylesheets/widget.less
+++ b/plugins/Dashboard/stylesheets/widget.less
@@ -16,7 +16,7 @@
         font-weight: normal;
         font-size: 15px;
         margin: 0;
-        color: #0D0D0D;
+        color: @theme-color-text;
         text-shadow: none;
         padding: 15px 15px 10px 12px;
     }
diff --git a/plugins/Dashboard/templates/_dashboardSettings.twig b/plugins/Dashboard/templates/_dashboardSettings.twig
index dc05a6dae1ca366fa3a104b1c6bd17bebd4f3ea6..b82e9137430d09556673948d19f012f314ef5df6 100644
--- a/plugins/Dashboard/templates/_dashboardSettings.twig
+++ b/plugins/Dashboard/templates/_dashboardSettings.twig
@@ -1,12 +1,12 @@
-<span>{{ 'Dashboard_Dashboard'|translate }}</span>
-<ul class="submenu">
+<a class="title" title="{{ 'Dashboard_ManageDashboard'|translate|e('html_attr') }}"><span class="icon icon-arrow-bottom"></span>{{ 'Dashboard_Dashboard'|translate }} </a>
+<ul class="dropdown submenu">
     <li>
-        <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }} &darr;</div>
+        <div class="addWidget">{{ 'Dashboard_AddAWidget'|translate }}</div>
         <ul class="widgetpreview-categorylist"></ul>
     </li>
     {% if dashboardActions|length > 0 %}
     <li>
-        <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }} &darr;</div>
+        <div class="manageDashboard">{{ 'Dashboard_ManageDashboard'|translate }}</div>
         <ul>
             {% for action, title in dashboardActions %}
             <li data-action="{{ action }}">{{ title|translate }}</li>
diff --git a/plugins/Dashboard/templates/index.twig b/plugins/Dashboard/templates/index.twig
index 0a8831fe3fcfdbbe5c567e580c238eaba1a8fe31..ddaac2428cb2c5f3a13056665025cb06433043b6 100644
--- a/plugins/Dashboard/templates/index.twig
+++ b/plugins/Dashboard/templates/index.twig
@@ -3,11 +3,12 @@
     {% include "@CoreHome/_periodSelect.twig" %}
     {{ postEvent("Template.nextToCalendar") }}
     {% render dashboardSettingsControl %}
-    <div id="Dashboard" class="piwikTopControl">
+    <div id="Dashboard" class="piwikTopControl borderedControl piwikSelector">
         <ul>
             {% for dashboard in dashboards %}
                 <li class="dashboardMenuItem" id="Dashboard_embeddedIndex_{{ dashboard.iddashboard }}">
-                    <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});">{{ dashboard.name|escape }}</a>
+                    <a href="javascript:$('#dashboardWidgetsArea').dashboard('loadDashboard', {{ dashboard.iddashboard }});"
+                       class="title">{{ dashboard.name|escape }}</a>
                 </li>
             {% endfor %}
         </ul>
diff --git a/plugins/DevicePlugins/DevicePlugins.php b/plugins/DevicePlugins/DevicePlugins.php
index 3ac882e8ceec9bb53bf389520d437c3d0da39860..5ddc6d15d32340a7bed04e1707924b13717ab242 100644
--- a/plugins/DevicePlugins/DevicePlugins.php
+++ b/plugins/DevicePlugins/DevicePlugins.php
@@ -25,6 +25,7 @@ class DevicePlugins extends \Piwik\Plugin
         return array(
             'Metrics.getDefaultMetricTranslations' => 'addMetricTranslations',
             'Live.getAllVisitorDetails'            => 'extendVisitorDetails',
+            'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction',
         );
     }
 
@@ -45,4 +46,10 @@ class DevicePlugins extends \Piwik\Plugin
         $translations = array_merge($translations, $metrics);
     }
 
+    public function renameUserSettingsModuleAndAction(&$module, &$action)
+    {
+        if ($module == 'UserSettings' && $action == 'getPlugin') {
+            $module = 'DevicePlugins';
+        }
+    }
 }
diff --git a/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php b/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1901960abbd85bd7c3d44f0efefc61e93750e7ca
--- /dev/null
+++ b/plugins/DevicePlugins/tests/System/UserSettingsBCTest.php
@@ -0,0 +1,78 @@
+<?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\DevicePlugins\tests\System;
+
+use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group DevicePlugins
+ * @group DevicePlugins_System
+ */
+class UserSettingsBCTest extends SystemTestCase
+{
+    /**
+     * @var OneVisitorTwoVisits
+     */
+    public static $fixture;
+
+    /**
+     * @dataProvider getApiForTesting
+     */
+    public function test_Api($api, $params)
+    {
+        $this->runApiTests($api, $params);
+    }
+
+    public function getApiForTesting()
+    {
+        $idSite = self::$fixture->idSite;
+        $dateTime = self::$fixture->dateTime;
+
+        $api = array(
+            'UserSettings.getPlugin',
+        );
+
+        $result = array();
+
+
+        foreach ($api as $method) {
+            list($module, $action) = explode('.', $method);
+
+            // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing
+            // against DevicePlugins & overwrite the module & action w/ otherRequestParameters)
+            $result[] = array('DevicePlugins.getPlugin', array('idSite' => $idSite,
+                'date' => $dateTime,
+                'periods' => array('day'),
+                'testSuffix' => $module . '_' . $method . '_',
+                'otherRequestParameters' => array(
+                    'method' => $method,
+                ),
+            ));
+
+            // api metadata tests
+            $result[] = array('API.getMetadata', array(
+                'idSite' => $idSite,
+                'date' => $dateTime,
+                'apiModule' => $module,
+                'apiAction' => $action,
+                'testSuffix' => $module . '_' . $method . '_',
+            ));
+        }
+
+        return $result;
+    }
+
+    public static function getPathToTestDirectory()
+    {
+        return dirname(__FILE__);
+    }
+}
+
+UserSettingsBCTest::$fixture = new OneVisitorTwoVisits();
\ No newline at end of file
diff --git a/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9a4f40396328a93cdc60e99fb98e4c3a5a898827
--- /dev/null
+++ b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___API.getMetadata_day.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Settings</category>
+		<name>Browser Plugins</name>
+		<module>DevicePlugins</module>
+		<action>getPlugin</action>
+		<dimension>Plugin</dimension>
+		<documentation>This report shows which browser plugins your visitors had enabled. This information might be important for choosing the right way to deliver your content.</documentation>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_visits_percentage>% Visits</nb_visits_percentage>
+		</processedMetrics>
+		<constantRowsCount>1</constantRowsCount>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicePlugins&amp;apiAction=getPlugin&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<uniqueId>DevicePlugins_getPlugin</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..72728977e1a14514399c39119d67ece38f14a71c
--- /dev/null
+++ b/plugins/DevicePlugins/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getPlugin___DevicePlugins.getPlugin_day.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Cookie</label>
+		<nb_visits>2</nb_visits>
+		<nb_visits_percentage>100%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/cookie.gif</logo>
+	</row>
+	<row>
+		<label>Flash</label>
+		<nb_visits>2</nb_visits>
+		<nb_visits_percentage>100%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/flash.gif</logo>
+	</row>
+	<row>
+		<label>Java</label>
+		<nb_visits>2</nb_visits>
+		<nb_visits_percentage>100%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/java.gif</logo>
+	</row>
+	<row>
+		<label>Director</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/director.gif</logo>
+	</row>
+	<row>
+		<label>Gears</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/gears.gif</logo>
+	</row>
+	<row>
+		<label>Pdf</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/pdf.gif</logo>
+	</row>
+	<row>
+		<label>Quicktime</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/quicktime.gif</logo>
+	</row>
+	<row>
+		<label>Realplayer</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/realplayer.gif</logo>
+	</row>
+	<row>
+		<label>Silverlight</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/silverlight.gif</logo>
+	</row>
+	<row>
+		<label>Windowsmedia</label>
+		<nb_visits>0</nb_visits>
+		<nb_visits_percentage>0%</nb_visits_percentage>
+		<logo>plugins/DevicePlugins/images/plugins/windowsmedia.gif</logo>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/DevicesDetection.php b/plugins/DevicesDetection/DevicesDetection.php
index 5385b29354ca899085a56ef900ae5487959d2cbc..2fd7b59fd2e6826fb2cc39d66e53f459fe355ea0 100644
--- a/plugins/DevicesDetection/DevicesDetection.php
+++ b/plugins/DevicesDetection/DevicesDetection.php
@@ -23,7 +23,8 @@ class DevicesDetection extends \Piwik\Plugin
     public function registerEvents()
     {
         return array(
-            'Live.getAllVisitorDetails' => 'extendVisitorDetails'
+            'Live.getAllVisitorDetails' => 'extendVisitorDetails',
+            'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction',
         );
     }
 
@@ -49,4 +50,21 @@ class DevicesDetection extends \Piwik\Plugin
         $visitor['browserVersion']           = $instance->getBrowserVersion();
     }
 
+    public function renameUserSettingsModuleAndAction(&$module, &$action)
+    {
+        $movedMethods = array(
+            'index' => 'software',
+            'getBrowser' => 'getBrowsers',
+            'getBrowserVersion' => 'getBrowserVersions',
+            'getMobileVsDesktop' => 'getType',
+            'getOS' => 'getOsVersions',
+            'getOSFamily' => 'getOsFamilies',
+            'getBrowserType' => 'getBrowserEngines',
+        );
+
+        if ($module == 'UserSettings' && array_key_exists($action, $movedMethods)) {
+            $module = 'DevicesDetection';
+            $action = $movedMethods[$action];
+        }
+    }
 }
diff --git a/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php b/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e86887780d63cefac9d26c0d49f0ad831a9a0300
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/UserSettingsBCTest.php
@@ -0,0 +1,83 @@
+<?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\DevicesDetection\tests\System;
+
+use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group DevicesDetection
+ * @group DevicesDetection_System
+ */
+class UserSettingsBCTest extends SystemTestCase
+{
+    /**
+     * @var OneVisitorTwoVisits
+     */
+    public static $fixture;
+
+    /**
+     * @dataProvider getApiForTesting
+     */
+    public function test_Api($api, $params)
+    {
+        $this->runApiTests($api, $params);
+    }
+
+    public function getApiForTesting()
+    {
+        $idSite = self::$fixture->idSite;
+        $dateTime = self::$fixture->dateTime;
+
+        $api = array(
+            'UserSettings.getBrowser',
+            'UserSettings.getBrowserVersion',
+            'UserSettings.getMobileVsDesktop',
+            'UserSettings.getOS',
+            'UserSettings.getOSFamily',
+            'UserSettings.getBrowserType',
+        );
+
+        $result = array();
+
+
+        foreach ($api as $method) {
+            list($module, $action) = explode('.', $method);
+
+            // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing
+            // against DevicesDetection & overwrite the module & action w/ otherRequestParameters)
+            $result[] = array('DevicesDetection.getBrowsers', array('idSite' => $idSite,
+                'date' => $dateTime,
+                'periods' => array('day'),
+                'testSuffix' => $module . '_' . $method . '_',
+                'otherRequestParameters' => array(
+                    'method' => $method,
+                ),
+            ));
+
+            // api metadata tests
+            $result[] = array('API.getMetadata', array(
+                'idSite' => $idSite,
+                'date' => $dateTime,
+                'apiModule' => $module,
+                'apiAction' => $action,
+                'testSuffix' => $module . '_' . $method . '_',
+            ));
+        }
+
+        return $result;
+    }
+
+    public static function getPathToTestDirectory()
+    {
+        return dirname(__FILE__);
+    }
+}
+
+UserSettingsBCTest::$fixture = new OneVisitorTwoVisits();
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..59301a5809fca76c93aa32941ce06bec7d3a49d4
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___API.getMetadata_day.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Browser engines</name>
+		<module>DevicesDetection</module>
+		<action>getBrowserEngines</action>
+		<dimension>Browser engine</dimension>
+		<documentation>This report shows your visitors' browsers broken down into browser engines. &lt;br /&gt; The most important information for web developers is what kind of rendering engine their visitors are using. The labels contain the names of the engines followed by the most common browser using that engine in brackets.</documentation>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowserEngines&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowserEngines&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getBrowserEngines</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7e5e262294b635bb177510b24ec335698c9d7336
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserType___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Gecko (Firefox)</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>browserEngine==Gecko</segment>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ae5eedde5290ebf4871826f5e0500be05f56c9e3
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Browser version</name>
+		<module>DevicesDetection</module>
+		<action>getBrowserVersions</action>
+		<dimension>Browser version</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowserVersions&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowserVersions&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getBrowserVersions</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3c2fe50a07e7aecd2dc8a8f511ad9244e19a8218
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowserVersion___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Firefox 3.6</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>browserCode==FF;browserVersion==3.6</segment>
+		<logo>plugins/DevicesDetection/images/browsers/FF.gif</logo>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5c5b2df10ae4b58d6b1a00dae3c71c7145e740c9
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___API.getMetadata_day.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Visitor Browser</name>
+		<module>DevicesDetection</module>
+		<action>getBrowsers</action>
+		<dimension>Browser</dimension>
+		<documentation>This report contains information about what kind of browser your visitors were using. Each browser version is listed separately.</documentation>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowsers&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getBrowsers&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getBrowsers</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..68128919afa8a1571728e089d355d13f1c34d8e7
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getBrowser___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Firefox</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<logo>plugins/DevicesDetection/images/browsers/FF.gif</logo>
+		<segment>browserCode==FF</segment>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..377949b52e6a27f7bb709d3f9053c2e3595c75c2
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Device type</name>
+		<module>DevicesDetection</module>
+		<action>getType</action>
+		<dimension>Device type</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getType&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getType&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getType</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e2c2f35414cbe899635c6fa0f7d4de8d9114c688
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getMobileVsDesktop___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Desktop</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>deviceType==desktop</segment>
+		<logo>plugins/DevicesDetection/images/screens/normal.gif</logo>
+	</row>
+	<row>
+		<label>Camera</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==camera</segment>
+		<logo>plugins/DevicesDetection/images/screens/camera.png</logo>
+	</row>
+	<row>
+		<label>Car browser</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==car+browser</segment>
+		<logo>plugins/DevicesDetection/images/screens/carbrowser.png</logo>
+	</row>
+	<row>
+		<label>Console</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==console</segment>
+		<logo>plugins/DevicesDetection/images/screens/console.gif</logo>
+	</row>
+	<row>
+		<label>Feature phone</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==feature+phone</segment>
+		<logo>plugins/DevicesDetection/images/screens/mobile.gif</logo>
+	</row>
+	<row>
+		<label>Phablet</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==phablet</segment>
+		<logo>plugins/DevicesDetection/images/screens/unknown.gif</logo>
+	</row>
+	<row>
+		<label>Portable media player</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==portable+media+player</segment>
+		<logo>plugins/DevicesDetection/images/screens/unknown.gif</logo>
+	</row>
+	<row>
+		<label>Smart display</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==smart+display</segment>
+		<logo>plugins/DevicesDetection/images/screens/unknown.gif</logo>
+	</row>
+	<row>
+		<label>Smartphone</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==smartphone</segment>
+		<logo>plugins/DevicesDetection/images/screens/smartphone.png</logo>
+	</row>
+	<row>
+		<label>Tablet</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==tablet</segment>
+		<logo>plugins/DevicesDetection/images/screens/tablet.png</logo>
+	</row>
+	<row>
+		<label>Tv</label>
+		<nb_visits>0</nb_visits>
+		<segment>deviceType==tv</segment>
+		<logo>plugins/DevicesDetection/images/screens/tv.png</logo>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..23934c7263cd0bfdda53d39791c92f64175e7cba
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Operating System families</name>
+		<module>DevicesDetection</module>
+		<action>getOsFamilies</action>
+		<dimension>Operating system family</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getOsFamilies&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getOsFamilies&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getOsFamilies</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1883e1f03ee4f834b04431841fa1bcaa22ca9089
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOSFamily___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Windows</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<logo>plugins/DevicesDetection/images/os/WIN.gif</logo>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7d6d669f04d772b9d4f14b16bbe7dba63ebbdcf0
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Devices</category>
+		<name>Operating System versions</name>
+		<module>DevicesDetection</module>
+		<action>getOsVersions</action>
+		<dimension>Operating System versions</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getOsVersions&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=DevicesDetection&amp;apiAction=getOsVersions&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>DevicesDetection_getOsVersions</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..ee964d53f1eaffd0660eaf46ba2e42f25325a240
--- /dev/null
+++ b/plugins/DevicesDetection/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getOS___DevicesDetection.getBrowsers_day.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Windows XP</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>operatingSystemCode==WIN;operatingSystemVersion==XP</segment>
+		<logo>plugins/DevicesDetection/images/os/WIN.gif</logo>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/Ecommerce/Categories/EcommerceCategory.php b/plugins/Ecommerce/Categories/EcommerceCategory.php
index 39cd5bb3eaff78aa9917ea958ef5e2b7b7a89e4f..0e14470cfb01a3a231c774f6cc036e02c51c553e 100644
--- a/plugins/Ecommerce/Categories/EcommerceCategory.php
+++ b/plugins/Ecommerce/Categories/EcommerceCategory.php
@@ -14,4 +14,5 @@ class EcommerceCategory extends Category
 {
     protected $id = 'Goals_Ecommerce';
     protected $order = 20;
+    protected $icon = 'icon-reporting-ecommerce';
 }
diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png
index abda1cb32078cbac45acd55b29b52bfa65ccef68..f4f72b1c11c4b2f34eef6c88146512fbb3696bc2 100644
Binary files a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png and b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePage.png differ
diff --git a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png
index 3543e6596a5fe86860832f070e81d5922ad7e2ca..fff1b50d89ec73c1ef2025d13e2da4554009c3f2 100644
Binary files a/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png and b/plugins/ExamplePlugin/tests/UI/expected-ui-screenshots/SimpleUITest_simplePagePartial.png differ
diff --git a/plugins/Goals/Categories/GoalsCategory.php b/plugins/Goals/Categories/GoalsCategory.php
index 7ba4b4df58823584ca111ff7c481d614483f7212..043a51fd0b4bb2d2eae8a2ae1cd1d05270a6b5c7 100644
--- a/plugins/Goals/Categories/GoalsCategory.php
+++ b/plugins/Goals/Categories/GoalsCategory.php
@@ -14,4 +14,5 @@ class GoalsCategory extends Category
 {
     protected $id = 'Goals_Goals';
     protected $order = 25;
+    protected $icon = 'icon-reporting-goal';
 }
diff --git a/plugins/Goals/templates/_listTopDimension.twig b/plugins/Goals/templates/_listTopDimension.twig
index 8de4594f58aa9a104144e4f2a6001c634c5f3704..2d63e077b59ee6f83182a950c8b5ef82eaf1f0eb 100644
--- a/plugins/Goals/templates/_listTopDimension.twig
+++ b/plugins/Goals/templates/_listTopDimension.twig
@@ -1,8 +1,8 @@
 {% for element in topDimension %}
     {% set goal_nb_conversion=element.nb_conversions %}
     {% set goal_conversion_rate=element.conversion_rate %}
-    <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion~"</b>")|raw }},
-		{{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate~"</b>")|raw }}'>
+    <span class='goalTopElement' title='{{ 'Goals_Conversions'|translate("<b>"~goal_nb_conversion|number~"</b>")|raw }},
+		{{ 'Goals_ConversionRate'|translate("<b>"~goal_conversion_rate|number~"</b>")|raw }}'>
 	    {{ element.name }}
     </span>
 
diff --git a/plugins/Goals/templates/manageGoals.twig b/plugins/Goals/templates/manageGoals.twig
index 4e3a4ce855ee0ea031b00dcecf29def5beecec28..72124faf72d3c1e6ab4407dd6e25da7aed1e7e32 100644
--- a/plugins/Goals/templates/manageGoals.twig
+++ b/plugins/Goals/templates/manageGoals.twig
@@ -2,6 +2,10 @@
 
 {% set title %}{{ 'Goals_ManageGoals'|translate }}{% endset %}
 
+{% block topcontrols %}
+    {% include "@CoreHome/_siteSelectHeader.twig" %}
+{% endblock %}
+
 {% block content %}
 
     <h2 piwik-enriched-headline>
@@ -20,8 +24,6 @@
         {{ title }}
     </h2>
 
-    {% include "@CoreHome/_siteSelectHeader.twig" %}
-
     {% include "@Goals/_addEditGoal.twig" %}
 
     <style type="text/css">
diff --git a/plugins/ImageGraph/StaticGraph.php b/plugins/ImageGraph/StaticGraph.php
index eb4d0a1289e1324221c9607470d77b06d949f53e..e70e4f8fbe264e050773074daadb2e0b090d92ac 100644
--- a/plugins/ImageGraph/StaticGraph.php
+++ b/plugins/ImageGraph/StaticGraph.php
@@ -13,6 +13,7 @@ use Exception;
 use pData;
 use pImage;
 use Piwik\Container\StaticContainer;
+use Piwik\NumberFormatter;
 use Piwik\Piwik;
 use Piwik\BaseFactory;
 
@@ -249,6 +250,8 @@ abstract class StaticGraph extends BaseFactory
             }
         }
 
+        $this->pData->setAxisDisplay(0, AXIS_FORMAT_CUSTOM, '\\Piwik\\Plugins\\ImageGraph\\formatYAxis');
+
         $this->pData->addPoints($this->abscissaSeries, self::ABSCISSA_SERIE_NAME);
         $this->pData->setAbscissa(self::ABSCISSA_SERIE_NAME);
     }
@@ -341,3 +344,15 @@ abstract class StaticGraph extends BaseFactory
         }
     }
 }
+
+/**
+ * Global format method
+ *
+ * required to format y axis values using pcharts internal format callbacks
+ * @param $value
+ * @return mixed
+ */
+function formatYAxis($value)
+{
+    return NumberFormatter::getInstance()->format($value);
+}
diff --git a/plugins/ImageGraph/templates/testAllSizes.twig b/plugins/ImageGraph/templates/testAllSizes.twig
index c00c023d09db0290e697ee0890482c21d67f7bd1..c4df9672ecb29c119605befb30c17ba9849c908d 100644
--- a/plugins/ImageGraph/templates/testAllSizes.twig
+++ b/plugins/ImageGraph/templates/testAllSizes.twig
@@ -1,15 +1,15 @@
 {% extends 'dashboard.twig' %}
 
+{% block topcontrols %}
+    {% include '@CoreHome/_periodSelect.twig' %}
+{% endblock %}
+
 {% block content %}
     {% set showSitesSelection=true %}
 
     <div>
         <h2>{{ 'ImageGraph_ImageGraph'|translate }} ::: {{ siteName }}</h2>
 
-        <div class="top_controls">
-            {% include '@CoreHome/_periodSelect.twig' %}
-        </div>
-
         <div class="entityContainer" style="width:100%;">
             <div class="entityAddContainer">
                 <table class="dataTable entityTable">
diff --git a/plugins/Installation/stylesheets/installation.css b/plugins/Installation/stylesheets/installation.css
index 5621ae98df5bd4ea980cb0579e7252709642b282..feb21be950e1ba46a48b7fbd5f9b8402914e6ed3 100644
--- a/plugins/Installation/stylesheets/installation.css
+++ b/plugins/Installation/stylesheets/installation.css
@@ -4,7 +4,7 @@ body {
 
 /* Header */
 .header {
-    padding: 50px 0 12px;
+    padding: 50px 0 22px;
     margin-bottom: 40px;
     border-bottom: solid 1px #ccc;
 }
@@ -20,7 +20,7 @@ body {
 }
 .language-selector {
     float: left;
-    margin-left: 15px;
+    margin-left: 20px;
     margin-top: 10px;
 }
 .installation-progress {
diff --git a/plugins/Intl/Commands/GenerateIntl.php b/plugins/Intl/Commands/GenerateIntl.php
index b6a57b957a5c7437ee5deeee2112c9079130e213..45637452a8d33096a4fcf66d219d6f8cf4489006 100644
--- a/plugins/Intl/Commands/GenerateIntl.php
+++ b/plugins/Intl/Commands/GenerateIntl.php
@@ -98,6 +98,7 @@ class GenerateIntl extends ConsoleCommand
             $this->fetchCalendarData($output, $transformedLangCode, $requestLangCode, $translations);
             $this->fetchLayoutDirection($output, $transformedLangCode, $requestLangCode, $translations);
             $this->fetchUnitData($output, $transformedLangCode, $requestLangCode, $translations);
+            $this->fetchNumberFormattingData($output, $transformedLangCode, $requestLangCode, $translations);
 
             ksort($translations['Intl']);
 
@@ -324,6 +325,32 @@ class GenerateIntl extends ConsoleCommand
         return $dateFormat;
     }
 
+    protected function fetchNumberFormattingData(OutputInterface $output, $langCode, $requestLangCode, &$translations)
+    {
+        $unitsUrl = 'https://raw.githubusercontent.com/unicode-cldr/cldr-numbers-full/master/main/%s/numbers.json';
+
+        try {
+            $unitsData = Http::fetchRemoteFile(sprintf($unitsUrl, $requestLangCode));
+            $unitsData = json_decode($unitsData, true);
+            $unitsData = $unitsData['main'][$requestLangCode]['numbers'];
+
+            $numberingSystem = $unitsData['defaultNumberingSystem'];
+
+            $translations['Intl']['NumberSymbolDecimal']  = $unitsData['symbols-numberSystem-' . $numberingSystem]['decimal'];
+            $translations['Intl']['NumberSymbolGroup']    = $unitsData['symbols-numberSystem-' . $numberingSystem]['group'];
+            $translations['Intl']['NumberSymbolPercent']  = $unitsData['symbols-numberSystem-' . $numberingSystem]['percentSign'];
+            $translations['Intl']['NumberSymbolPlus']     = $unitsData['symbols-numberSystem-' . $numberingSystem]['plusSign'];
+            $translations['Intl']['NumberSymbolMinus']    = $unitsData['symbols-numberSystem-' . $numberingSystem]['minusSign'];
+            $translations['Intl']['NumberFormatNumber']   = $unitsData['decimalFormats-numberSystem-' . $numberingSystem]['standard'];
+            $translations['Intl']['NumberFormatCurrency']   = $unitsData['currencyFormats-numberSystem-' . $numberingSystem]['standard'];
+            $translations['Intl']['NumberFormatPercent']  = $unitsData['percentFormats-numberSystem-' . $numberingSystem]['standard'];
+
+            $output->writeln('Saved number formatting data for ' . $langCode);
+        } catch (\Exception $e) {
+            $output->writeln('Unable to import number formatting data for ' . $langCode);
+        }
+    }
+
     protected function fetchUnitData(OutputInterface $output, $langCode, $requestLangCode, &$translations)
     {
         $unitsUrl = 'https://raw.githubusercontent.com/unicode-cldr/cldr-units-full/master/main/%s/units.json';
diff --git a/plugins/Intl/lang/am.json b/plugins/Intl/lang/am.json
index 551304d5d6621327a8a153d4b12891d8ffd606bc..49992598502e773df97aa110aeb9bb6d4c0410cd 100644
--- a/plugins/Intl/lang/am.json
+++ b/plugins/Intl/lang/am.json
@@ -174,7 +174,7 @@
         "Country_NG": "ናይጄሪያ",
         "Country_NI": "ኒካራጓ",
         "Country_NL": "ኔዘርላንድ",
-        "Country_NO": "ኖርዌ",
+        "Country_NO": "ኖርዌይ",
         "Country_NP": "ኔፓል",
         "Country_NR": "ናኡሩ",
         "Country_NU": "ኒኡይ",
@@ -198,7 +198,7 @@
         "Country_RE": "ሪዩኒየን",
         "Country_RO": "ሮሜኒያ",
         "Country_RS": "ሰርብያ",
-        "Country_RU": "ራሺያ",
+        "Country_RU": "ራሽያ",
         "Country_RW": "ሩዋንዳ",
         "Country_SA": "ሳውድአረቢያ",
         "Country_SB": "ሰሎሞን ደሴት",
@@ -300,10 +300,10 @@
         "Day_Short_StandAlone_6": "ቅዳሜ",
         "Day_Short_StandAlone_7": "እሑድ",
         "EnglishLanguageName": "Amharic",
-        "Format_DateTime_Long": "EEEE, d MMMM y h:mm:ss a",
+        "Format_DateTime_Long": "EEEE ፣d MMMM y h:mm:ss a",
         "Format_DateTime_Short": "d MMM y h:mm:ss a",
-        "Format_Date_Day_Month": "E, MMM d",
-        "Format_Date_Long": "EEEE, d MMMM y",
+        "Format_Date_Day_Month": "E፣ MMM d",
+        "Format_Date_Long": "EEEE ፣d MMMM y",
         "Format_Date_Short": "d MMM y",
         "Format_Interval_Long_D": "MMMM d–d፣ y",
         "Format_Interval_Long_M": "MMMM d – MMMM d፣ y",
@@ -318,11 +318,14 @@
         "Hours": "ሰዓቶች",
         "Language_aa": "አፋርኛ",
         "Language_ab": "አብሐዚኛ",
+        "Language_ae": "አቬስታን",
         "Language_af": "አፍሪካንኛ",
         "Language_ak": "አካንኛ",
         "Language_am": "አማርኛ",
+        "Language_an": "አራጎንስ",
         "Language_ar": "ዓረብኛ",
         "Language_as": "አሳሜዛዊ",
+        "Language_av": "አቫሪክ",
         "Language_ay": "አያማርኛ",
         "Language_az": "አዘርባጃንኛ",
         "Language_ba": "ባስኪርኛ",
@@ -335,8 +338,13 @@
         "Language_br": "ብሬቶንኛ",
         "Language_bs": "ቦስኒያንኛ",
         "Language_ca": "ካታላንኛ",
+        "Language_ce": "ችችን",
+        "Language_ch": "ቻሞሮ",
         "Language_co": "ኮርሲካኛ",
+        "Language_cr": "ክሪ",
         "Language_cs": "ቼክኛ",
+        "Language_cu": "ቸርች ስላቪክ",
+        "Language_cv": "ቹቫሽ",
         "Language_cy": "ወልሽ",
         "Language_da": "ዴኒሽ",
         "Language_de": "ጀርመን",
@@ -346,7 +354,7 @@
         "Language_el": "ግሪክኛ",
         "Language_en": "እንግሊዝኛ",
         "Language_eo": "ኤስፐራንቶ",
-        "Language_es": "ስፓኒሽ",
+        "Language_es": "ስፓንሽኛ",
         "Language_et": "ኢስቶኒያንኛ",
         "Language_eu": "ባስክኛ",
         "Language_fa": "ፐርሺያኛ",
@@ -428,7 +436,7 @@
         "Language_rm": "ሮማንሽ",
         "Language_rn": "ሩንዲኛ",
         "Language_ro": "ሮማኒያን",
-        "Language_ru": "ራሽኛ",
+        "Language_ru": "ራሽያኛ",
         "Language_rw": "ኪንያርዋንድኛ",
         "Language_sa": "ሳንስክሪትኛ",
         "Language_sd": "ሲንድሂኛ",
@@ -531,6 +539,14 @@
         "NMinutesShort": "%s ደቂቃ",
         "NSeconds": "%s ሰከንዶች",
         "NSecondsShort": "%s ሰ",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ቀናት",
         "OneMinute": "1 ደቂቃ",
         "OneMinuteShort": "1 ደቂ",
diff --git a/plugins/Intl/lang/ar.json b/plugins/Intl/lang/ar.json
index 4adbcfa7a4926a63543a096aa4f876531c8b692f..481c4e62ce3364a608f3958ccb9806b4d3ac1304 100644
--- a/plugins/Intl/lang/ar.json
+++ b/plugins/Intl/lang/ar.json
@@ -21,7 +21,7 @@
         "Country_AS": "ساموا الأمريكية",
         "Country_AT": "النمسا",
         "Country_AU": "أستراليا",
-        "Country_AW": "آروبا",
+        "Country_AW": "أروبا",
         "Country_AX": "جزر آلاند",
         "Country_AZ": "أذربيجان",
         "Country_BA": "البوسنة والهرسك",
@@ -39,21 +39,21 @@
         "Country_BO": "بوليفيا",
         "Country_BQ": "هولندا الكاريبية",
         "Country_BR": "البرازيل",
-        "Country_BS": "الباهاما",
+        "Country_BS": "البهاما",
         "Country_BT": "بوتان",
         "Country_BV": "جزيرة بوفيه",
         "Country_BW": "بتسوانا",
-        "Country_BY": "روسيا البيضاء",
+        "Country_BY": "بيلاروس",
         "Country_BZ": "بليز",
         "Country_CA": "كندا",
-        "Country_CC": "جزر كوكوس",
+        "Country_CC": "جزر كوكوس (كيلينغ)",
         "Country_CD": "الكونغو - كينشاسا",
         "Country_CF": "جمهورية أفريقيا الوسطى",
         "Country_CG": "الكونغو - برازافيل",
         "Country_CH": "سويسرا",
         "Country_CI": "ساحل العاج",
         "Country_CK": "جزر كوك",
-        "Country_CL": "شيلي",
+        "Country_CL": "تشيلي",
         "Country_CM": "الكاميرون",
         "Country_CN": "الصين",
         "Country_CO": "كولومبيا",
@@ -71,10 +71,10 @@
         "Country_DO": "جمهورية الدومينيك",
         "Country_DZ": "الجزائر",
         "Country_EC": "الإكوادور",
-        "Country_EE": "أستونيا",
+        "Country_EE": "إستونيا",
         "Country_EG": "مصر",
         "Country_EH": "الصحراء الغربية",
-        "Country_ER": "أريتريا",
+        "Country_ER": "إريتريا",
         "Country_ES": "إسبانيا",
         "Country_ET": "إثيوبيا",
         "Country_FI": "فنلندا",
@@ -94,7 +94,7 @@
         "Country_GL": "غرينلاند",
         "Country_GM": "غامبيا",
         "Country_GN": "غينيا",
-        "Country_GP": "جوادلوب",
+        "Country_GP": "غوادلوب",
         "Country_GQ": "غينيا الإستوائية",
         "Country_GR": "اليونان",
         "Country_GS": "جورجيا الجنوبية وجزر ساندويتش الجنوبية",
@@ -108,7 +108,7 @@
         "Country_HR": "كرواتيا",
         "Country_HT": "هايتي",
         "Country_HU": "هنغاريا",
-        "Country_ID": "أندونيسيا",
+        "Country_ID": "إندونيسيا",
         "Country_IE": "أيرلندا",
         "Country_IL": "إسرائيل",
         "Country_IM": "جزيرة مان",
@@ -178,7 +178,7 @@
         "Country_NP": "نيبال",
         "Country_NR": "ناورو",
         "Country_NU": "نيوي",
-        "Country_NZ": "نيوزيلاندا",
+        "Country_NZ": "نيوزيلندا",
         "Country_OM": "عُمان",
         "Country_PA": "بنما",
         "Country_PE": "بيرو",
@@ -221,12 +221,12 @@
         "Country_SX": "سينت مارتن",
         "Country_SY": "سوريا",
         "Country_SZ": "سوازيلاند",
-        "Country_TC": "جزر الترك وجايكوس",
+        "Country_TC": "جزر توركس وكايكوس",
         "Country_TD": "تشاد",
-        "Country_TF": "المقاطعات الجنوبية الفرنسية",
-        "Country_TG": "توجو",
+        "Country_TF": "الأقاليم الجنوبية الفرنسية",
+        "Country_TG": "توغو",
         "Country_TH": "تايلاند",
-        "Country_TJ": "طاجكستان",
+        "Country_TJ": "طاجيكستان",
         "Country_TK": "توكيلو",
         "Country_TL": "تيمور الشرقية",
         "Country_TM": "تركمانستان",
@@ -236,7 +236,7 @@
         "Country_TT": "ترينيداد وتوباغو",
         "Country_TV": "توفالو",
         "Country_TW": "تايوان",
-        "Country_TZ": "تانزانيا",
+        "Country_TZ": "تنزانيا",
         "Country_UA": "أوكرانيا",
         "Country_UG": "أوغندا",
         "Country_UM": "جزر الولايات المتحدة النائية",
@@ -315,7 +315,7 @@
         "Format_Month_Short": "MMM y",
         "Format_Time": "h:mm:ss a",
         "Format_Year": "y",
-        "Hours": "ساعة",
+        "Hours": "ساعات",
         "Language_aa": "الأفارية",
         "Language_ab": "الأبخازية",
         "Language_ae": "الأفستية",
@@ -555,18 +555,26 @@
         "NMinutesShort": "%s د",
         "NSeconds": "%s ثانية",
         "NSecondsShort": "%s Ø«",
+        "NumberFormatCurrency": "¤ #,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": "Ù«",
+        "NumberSymbolGroup": "Ù¬",
+        "NumberSymbolMinus": "‏-",
+        "NumberSymbolPercent": "Ùª",
+        "NumberSymbolPlus": "‏+",
         "OneDay": "يوم",
-        "OneMinute": "1 دقيقة",
+        "OneMinute": "دقيقة",
         "OneMinuteShort": "1 د",
         "OriginalLanguageName": "العربية",
         "PeriodDay": "يوم",
-        "PeriodDays": "يوم",
+        "PeriodDays": "أيام",
         "PeriodMonth": "الشهر",
-        "PeriodMonths": "شهر",
+        "PeriodMonths": "شهور",
         "PeriodWeek": "الأسبوع",
-        "PeriodWeeks": "أسبوع",
+        "PeriodWeeks": "أسابيع",
         "PeriodYear": "السنة",
-        "PeriodYears": "سنة",
+        "PeriodYears": "سنوات",
         "Seconds": "ثانية",
         "Time_AM": "ص",
         "Time_PM": "Ù…",
diff --git a/plugins/Intl/lang/be.json b/plugins/Intl/lang/be.json
index 85752d297078b0014949e183603dce492f6d2ea1..88bb7c14cbe074fb86e6f48e4c2b14b00483f957 100644
--- a/plugins/Intl/lang/be.json
+++ b/plugins/Intl/lang/be.json
@@ -1,9 +1,9 @@
 {
     "Intl": {
         "Continent_afr": "Афрыка",
-        "Continent_amc": "Цэнтральная Амэрыка",
-        "Continent_amn": "Паўночная Амэрыка",
-        "Continent_ams": "Паўднёвая Амэрыка",
+        "Continent_amc": "Цэнтральная Амерыка",
+        "Continent_amn": "Паўночная Амерыка",
+        "Continent_ams": "Паўднёвая Амерыка",
         "Continent_ant": "Антарктыка",
         "Continent_asi": "Азія",
         "Continent_eur": "Еўропа",
@@ -37,18 +37,19 @@
         "Country_BM": "Бермудскія астравы",
         "Country_BN": "Бруней",
         "Country_BO": "Балівія",
+        "Country_BQ": "Карыбскія Нідэрланды",
         "Country_BR": "Бразілія",
         "Country_BS": "Багамы",
         "Country_BT": "Бутан",
-        "Country_BV": "Бувэ востраў",
+        "Country_BV": "Востраў Бувэ",
         "Country_BW": "Батсвана",
         "Country_BY": "Беларусь",
         "Country_BZ": "Беліз",
         "Country_CA": "Канада",
         "Country_CC": "Какосавыя астравы",
-        "Country_CD": "Конга, Дэмакратычная Рэспубліка",
+        "Country_CD": "Конга (Кіншаса)",
         "Country_CF": "Цэнтральна-Афрыканская Рэспубліка",
-        "Country_CG": "Конга",
+        "Country_CG": "Конга (Бразавіль)",
         "Country_CH": "Швейцарыя",
         "Country_CI": "Кот-д’Івуар",
         "Country_CK": "Астравы Кука",
@@ -60,7 +61,7 @@
         "Country_CU": "Куба",
         "Country_CV": "Каба-Вердэ",
         "Country_CW": "Востраў Кюрасаа",
-        "Country_CX": "Востраў Ражства",
+        "Country_CX": "Востраў Раства",
         "Country_CY": "Кіпр",
         "Country_CZ": "Чэхія",
         "Country_DE": "Германія",
@@ -78,7 +79,7 @@
         "Country_ET": "Эфіопія",
         "Country_FI": "Фінляндыя",
         "Country_FJ": "Фіджы",
-        "Country_FK": "Фолклэндскія астравы",
+        "Country_FK": "Фалклендскія астравы",
         "Country_FM": "Мікранезія",
         "Country_FO": "Фарэрскія астравы",
         "Country_FR": "Францыя",
@@ -101,8 +102,8 @@
         "Country_GU": "Гуам",
         "Country_GW": "Гвінея-Бісау",
         "Country_GY": "Гаяна",
-        "Country_HK": "Гон-Конг, Кітай (САР)",
-        "Country_HM": "Востраў Херд і Астравы Макдоналд",
+        "Country_HK": "Ганконг, САР (Кітай)",
+        "Country_HM": "Востраў Херд і астравы Макдональд",
         "Country_HN": "Гандурас",
         "Country_HR": "Харватыя",
         "Country_HT": "Гаіці",
@@ -147,13 +148,14 @@
         "Country_MC": "Манака",
         "Country_MD": "Малдова",
         "Country_ME": "Чарнагорыя",
+        "Country_MF": "Сен-Мартэн",
         "Country_MG": "Мадагаскар",
         "Country_MH": "Маршалавы Астравы",
-        "Country_MK": "Македонія, БЮР",
+        "Country_MK": "Македонія",
         "Country_ML": "Малі",
-        "Country_MM": "М’янма",
+        "Country_MM": "М’янма (Бірма)",
         "Country_MN": "Манголія",
-        "Country_MO": "Макао, Кітай (САР)",
+        "Country_MO": "Макаа, САР (Кітай)",
         "Country_MP": "Паўночныя Марыянскія астравы",
         "Country_MQ": "Марцініка",
         "Country_MR": "Маўрытанія",
@@ -204,7 +206,7 @@
         "Country_SD": "Судан",
         "Country_SE": "Швецыя",
         "Country_SG": "Сінгапур",
-        "Country_SH": "Святой Алены, Востраў",
+        "Country_SH": "Востраў Святой Алены",
         "Country_SI": "Славенія",
         "Country_SJ": "Свальбард (Паўночна-Усходняя Зямля) і Ян-Маен",
         "Country_SK": "Славакія",
@@ -213,8 +215,10 @@
         "Country_SN": "Сенегал",
         "Country_SO": "Самалі",
         "Country_SR": "Сурынам",
+        "Country_SS": "Паўднёвы Судан",
         "Country_ST": "Сан-Тамэ і Прынсіпі",
         "Country_SV": "Сальвадор",
+        "Country_SX": "Сінт-Мартэн",
         "Country_SY": "Сірыя",
         "Country_SZ": "Свазіленд",
         "Country_TC": "Цёркс і Кайкас",
@@ -235,6 +239,7 @@
         "Country_TZ": "Танзанія",
         "Country_UA": "Украіна",
         "Country_UG": "Уганда",
+        "Country_UM": "Знешнія малыя астравы ЗША",
         "Country_US": "Злучаныя Штаты Амерыкі",
         "Country_UY": "Уругвай",
         "Country_UZ": "Узбекістан",
@@ -300,19 +305,20 @@
         "Format_Date_Day_Month": "E, d MMM",
         "Format_Date_Long": "EEEE, d MMMM y",
         "Format_Date_Short": "d.M.y",
-        "Format_Interval_Long_D": "y MMMM d–d",
-        "Format_Interval_Long_M": "y MMMM d – MMMM d",
-        "Format_Interval_Long_Y": "y MMMM d – y MMMM d",
-        "Format_Interval_Short_D": "y MMM d–d",
-        "Format_Interval_Short_M": "y MMM d – MMM d",
-        "Format_Interval_Short_Y": "y MMM d – y MMM d",
+        "Format_Interval_Long_D": "d–d MMMM y",
+        "Format_Interval_Long_M": "d MMMM – d MMMM y",
+        "Format_Interval_Long_Y": "d MMMM y – d MMMM y",
+        "Format_Interval_Short_D": "d–d MMM y",
+        "Format_Interval_Short_M": "d MMM – d MMM y",
+        "Format_Interval_Short_Y": "d MMM y – d MMM y",
         "Format_Month_Long": "LLLL y",
         "Format_Month_Short": "LLL y",
         "Format_Time": "HH.mm.ss",
         "Format_Year": "y",
-        "Hours": "hr",
+        "Hours": "гадзіны",
         "Language_ab": "Абхазская",
         "Language_af": "Афрыкаанс",
+        "Language_ak": "Акан",
         "Language_am": "Амхарская",
         "Language_an": "Арагонская",
         "Language_ar": "Арабская",
@@ -323,17 +329,22 @@
         "Language_ba": "Башкірская",
         "Language_be": "Беларуская",
         "Language_bg": "Балгарская",
+        "Language_bm": "Бамбара",
         "Language_bn": "Бенгальская",
+        "Language_bo": "Тыбецкая",
         "Language_br": "Брэтонская",
         "Language_bs": "Баснійская",
-        "Language_ca": "Каталонская",
+        "Language_ca": "Каталанская",
         "Language_ce": "Чачэнская",
+        "Language_co": "Карсіканская",
         "Language_cs": "Чэшская",
         "Language_cv": "Чувашская",
         "Language_cy": "Валійская",
         "Language_da": "Дацкая",
         "Language_de": "Нямецкая",
-        "Language_el": "Грэцкая",
+        "Language_dz": "Дзонгкха",
+        "Language_ee": "Эве",
+        "Language_el": "Грэчаская",
         "Language_en": "Англійская",
         "Language_eo": "Эсперанта",
         "Language_es": "Іспанская",
@@ -341,6 +352,7 @@
         "Language_eu": "Баскская",
         "Language_fa": "Фарсі",
         "Language_fi": "Фінская",
+        "Language_fj": "Фіджыйская",
         "Language_fo": "Фарэрская",
         "Language_fr": "Французская",
         "Language_fy": "Фрызская",
@@ -348,63 +360,93 @@
         "Language_gd": "Шатландская гэльская",
         "Language_gl": "Галісійская",
         "Language_gn": "Гуарані",
-        "Language_gu": "Гуяраці",
+        "Language_gu": "Гуджараці",
+        "Language_gv": "Мэнская",
+        "Language_ha": "Хаўса",
         "Language_he": "Іўрыт",
         "Language_hi": "Хіндзі",
         "Language_hr": "Харвацкая",
+        "Language_ht": "Гаіцянская",
         "Language_hu": "Венгерская",
         "Language_hy": "Армянская",
         "Language_ia": "Інтэрлінгва",
         "Language_id": "Інданезійская",
         "Language_ie": "Інтэрлінгве",
+        "Language_ig": "Ігба",
+        "Language_ii": "Сычуань І",
         "Language_is": "Ісландская",
         "Language_it": "Італьянская",
+        "Language_iu": "Інуктытут",
         "Language_ja": "Японская",
         "Language_jv": "Яванская",
         "Language_ka": "Грузінская",
+        "Language_ki": "Кікую",
         "Language_kk": "Казахская",
-        "Language_kn": "Каннада",
+        "Language_kl": "Грэнландская",
+        "Language_km": "Кхмерская",
+        "Language_kn": "Канада",
         "Language_ko": "Карэйская",
+        "Language_ks": "Кашмірская",
         "Language_ku": "Курдская",
+        "Language_kw": "Корнская",
+        "Language_ky": "Кіргізская",
         "Language_la": "Лацінская",
+        "Language_lb": "Люксембургская",
+        "Language_lg": "Ганда",
         "Language_ln": "Лінгала",
         "Language_lo": "Лаоская",
         "Language_lt": "Літоўская",
+        "Language_lu": "Луба-катанга",
         "Language_lv": "Латышская",
+        "Language_mg": "Малагасійская",
+        "Language_mi": "Маары",
         "Language_mk": "Македонская",
-        "Language_ml": "Малаяламская",
+        "Language_ml": "Малаялам",
         "Language_mn": "Мангольская",
         "Language_mr": "Маратхі",
         "Language_ms": "Малайская",
         "Language_mt": "Мальтыйская",
-        "Language_nb": "Нарвэская букмал",
+        "Language_my": "Бірманская",
+        "Language_nb": "Нарвежская (букмал)",
+        "Language_nd": "Паўночная ндэбеле",
         "Language_ne": "Непальская",
         "Language_nl": "Галандская",
         "Language_nn": "Нарвежская (нюнорск)",
         "Language_no": "Нарвежская",
         "Language_oc": "Правансальская",
+        "Language_om": "Арома",
+        "Language_or": "Орыя",
         "Language_pa": "Панджабі",
         "Language_pl": "Польская",
         "Language_ps": "Пушту",
         "Language_pt": "Партугальская",
+        "Language_qu": "Кечуа",
+        "Language_rm": "Рэтараманская",
+        "Language_rn": "Рундзі",
         "Language_ro": "Румынская",
         "Language_ru": "Руская",
+        "Language_rw": "Кіньяруанда",
         "Language_sa": "Санскрыт",
         "Language_sd": "Сіндхі",
+        "Language_se": "Паўночнасаамская",
+        "Language_sg": "Санга",
         "Language_si": "Сінгальская",
         "Language_sk": "Славацкая",
         "Language_sl": "Славенская",
+        "Language_sn": "Шона",
         "Language_so": "Самалійская",
         "Language_sq": "Албанская",
         "Language_sr": "Сербская",
-        "Language_su": "Суданская",
+        "Language_su": "Сундская",
         "Language_sv": "Шведская",
         "Language_sw": "Суахілі",
         "Language_ta": "Тамільская",
         "Language_te": "Тэлугу",
+        "Language_tg": "Таджыкская",
         "Language_th": "Тайская",
         "Language_ti": "Тыгрынья",
         "Language_tk": "Туркменская",
+        "Language_to": "Танганская",
         "Language_tr": "Турэцкая",
         "Language_tt": "Татарская",
         "Language_ug": "Уйгурская",
@@ -412,12 +454,14 @@
         "Language_ur": "Урду",
         "Language_uz": "Узбекская",
         "Language_vi": "В’етнамская",
-        "Language_xh": "Хоса",
+        "Language_wo": "Валоф",
+        "Language_xh": "Коса",
         "Language_yi": "Ідыш",
+        "Language_yo": "Ёруба",
         "Language_zh": "Кітайская",
         "Language_zu": "Зулу",
         "LayoutDirection": "ltr",
-        "Minutes": "min",
+        "Minutes": "хвіліны",
         "Month_Long_1": "Студзеня",
         "Month_Long_10": "Кастрычніка",
         "Month_Long_11": "Лістапада",
@@ -466,29 +510,37 @@
         "Month_Short_StandAlone_7": "Ліп",
         "Month_Short_StandAlone_8": "Жні",
         "Month_Short_StandAlone_9": "Вер",
-        "NDays": "%s дня",
-        "NHoursShort": "%s h",
+        "NDays": "%s сутак",
+        "NHoursShort": "%sгадз.",
         "NMinutes": "%s хвіліны",
-        "NMinutesShort": "%s min",
-        "NSeconds": "%s сэкунды",
-        "NSecondsShort": "%s s",
-        "OneDay": "1 дня",
+        "NMinutesShort": "%s хв.",
+        "NSeconds": "%s секунды",
+        "NSecondsShort": "%sс",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
+        "OneDay": "1 суткі",
         "OneMinute": "1 хвіліна",
-        "OneMinuteShort": "1 min",
+        "OneMinuteShort": "1 хв.",
         "OriginalLanguageName": "Беларуская",
         "PeriodDay": "дзень",
-        "PeriodDays": "day",
+        "PeriodDays": "суткі",
         "PeriodMonth": "месяц",
-        "PeriodMonths": "mon",
+        "PeriodMonths": "месяцы",
         "PeriodWeek": "тыдзень",
-        "PeriodWeeks": "wk",
+        "PeriodWeeks": "тыдні",
         "PeriodYear": "год",
-        "PeriodYears": "yr",
-        "Seconds": "sec",
-        "Time_AM": "да палудня",
-        "Time_PM": "пасля палудня",
+        "PeriodYears": "гады",
+        "Seconds": "секунды",
+        "Time_AM": "да паўдня",
+        "Time_PM": "пасля паўдня",
         "Today": "Сёння",
-        "Year_Short": "год",
+        "Year_Short": "г.",
         "Yesterday": "Учора"
     }
 }
\ No newline at end of file
diff --git a/plugins/Intl/lang/bg.json b/plugins/Intl/lang/bg.json
index b257f6e2b928b5194a1ff78a4cb76aa5c1d9e930..02880b589d95bd8ebea83270c825d1b4da377418 100644
--- a/plugins/Intl/lang/bg.json
+++ b/plugins/Intl/lang/bg.json
@@ -35,7 +35,7 @@
         "Country_BJ": "Бенин",
         "Country_BL": "Сен Бартелеми",
         "Country_BM": "Бермуда",
-        "Country_BN": "Бруней Дарусалам",
+        "Country_BN": "Бруней Даруссалам",
         "Country_BO": "Боливия",
         "Country_BQ": "Карибска Нидерландия",
         "Country_BR": "Бразилия",
@@ -47,9 +47,9 @@
         "Country_BZ": "Белиз",
         "Country_CA": "Канада",
         "Country_CC": "Кокосови острови (острови Кийлинг)",
-        "Country_CD": "Демократична република Конго",
+        "Country_CD": "Конго (Киншаса)",
         "Country_CF": "Централноафриканска република",
-        "Country_CG": "Конго",
+        "Country_CG": "Конго (Бразавил)",
         "Country_CH": "Швейцария",
         "Country_CI": "Кот д’Ивоар",
         "Country_CK": "Острови Кук",
@@ -63,7 +63,7 @@
         "Country_CW": "Кюрасао",
         "Country_CX": "Остров Рождество",
         "Country_CY": "Кипър",
-        "Country_CZ": "Чехия",
+        "Country_CZ": "Чешка република",
         "Country_DE": "Германия",
         "Country_DJ": "Джибути",
         "Country_DK": "Дания",
@@ -84,11 +84,11 @@
         "Country_FO": "Фарьорски острови",
         "Country_FR": "Франция",
         "Country_GA": "Габон",
-        "Country_GB": "Великобритания",
+        "Country_GB": "Обединеното кралство",
         "Country_GD": "Гренада",
         "Country_GE": "Грузия",
         "Country_GF": "Френска Гвиана",
-        "Country_GG": "Гърнси",
+        "Country_GG": "Гърнзи",
         "Country_GH": "Гана",
         "Country_GI": "Гибралтар",
         "Country_GL": "Гренландия",
@@ -183,7 +183,7 @@
         "Country_PA": "Панама",
         "Country_PE": "Перу",
         "Country_PF": "Френска Полинезия",
-        "Country_PG": "Папуа Нова Гвинея",
+        "Country_PG": "Папуа-Нова Гвинея",
         "Country_PH": "Филипини",
         "Country_PK": "Пакистан",
         "Country_PL": "Полша",
@@ -319,7 +319,7 @@
         "Language_aa": "Афар",
         "Language_ab": "Абхазки",
         "Language_ae": "Авестски",
-        "Language_af": "Африканс",
+        "Language_af": "Африкаанс",
         "Language_ak": "Акан",
         "Language_am": "Амхарски",
         "Language_an": "Арагонски",
@@ -426,12 +426,12 @@
         "Language_mt": "Малтийски",
         "Language_my": "Бирмански",
         "Language_na": "Науру",
-        "Language_nb": "Норвежки букмол",
+        "Language_nb": "Норвежки (букмол)",
         "Language_nd": "Северен ндебеле",
         "Language_ne": "Непалски",
         "Language_ng": "Ндонга",
         "Language_nl": "Нидерландски",
-        "Language_nn": "Норвежки нюношк",
+        "Language_nn": "Норвежки (нюношк)",
         "Language_no": "Норвежки",
         "Language_nr": "Южен ндебеле",
         "Language_nv": "Навахо",
@@ -525,36 +525,44 @@
         "Month_Long_StandAlone_7": "Юли",
         "Month_Long_StandAlone_8": "Август",
         "Month_Long_StandAlone_9": "Септември",
-        "Month_Short_1": "Ян.",
-        "Month_Short_10": "Окт.",
-        "Month_Short_11": "Ноем.",
-        "Month_Short_12": "Дек.",
-        "Month_Short_2": "Февр.",
+        "Month_Short_1": "Яну",
+        "Month_Short_10": "Окт",
+        "Month_Short_11": "Ное",
+        "Month_Short_12": "Дек",
+        "Month_Short_2": "Фев",
         "Month_Short_3": "Март",
-        "Month_Short_4": "Апр.",
+        "Month_Short_4": "Апр",
         "Month_Short_5": "Май",
         "Month_Short_6": "Юни",
         "Month_Short_7": "Юли",
-        "Month_Short_8": "Авг.",
-        "Month_Short_9": "Септ.",
-        "Month_Short_StandAlone_1": "Ян.",
-        "Month_Short_StandAlone_10": "Окт.",
-        "Month_Short_StandAlone_11": "Ноем.",
-        "Month_Short_StandAlone_12": "Дек.",
-        "Month_Short_StandAlone_2": "Февр.",
+        "Month_Short_8": "Авг",
+        "Month_Short_9": "Сеп",
+        "Month_Short_StandAlone_1": "Яну",
+        "Month_Short_StandAlone_10": "Окт",
+        "Month_Short_StandAlone_11": "Ное",
+        "Month_Short_StandAlone_12": "Дек",
+        "Month_Short_StandAlone_2": "Фев",
         "Month_Short_StandAlone_3": "Март",
-        "Month_Short_StandAlone_4": "Апр.",
+        "Month_Short_StandAlone_4": "Апр",
         "Month_Short_StandAlone_5": "Май",
         "Month_Short_StandAlone_6": "Юни",
         "Month_Short_StandAlone_7": "Юли",
-        "Month_Short_StandAlone_8": "Авг.",
-        "Month_Short_StandAlone_9": "Септ.",
+        "Month_Short_StandAlone_8": "Авг",
+        "Month_Short_StandAlone_9": "Сеп",
         "NDays": "%s дни",
         "NHoursShort": "%s h",
         "NMinutes": "%s минути",
         "NMinutesShort": "%s min",
         "NSeconds": "%s секунди",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ден",
         "OneMinute": "1 минута",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/bn.json b/plugins/Intl/lang/bn.json
index 1699da595d96231095da89f13908dc4c29dbfd15..2bac13f1beec03b28276d92e56b5a65e6cbbde2c 100644
--- a/plugins/Intl/lang/bn.json
+++ b/plugins/Intl/lang/bn.json
@@ -110,7 +110,7 @@
         "Country_HU": "হাঙ্গেরি",
         "Country_ID": "ইন্দোনেশিয়া",
         "Country_IE": "আয়ারল্যান্ড",
-        "Country_IL": "ইস্রায়েল",
+        "Country_IL": "ইজরায়েল",
         "Country_IM": "আইল অফ ম্যান",
         "Country_IN": "ভারত",
         "Country_IO": "ব্রিটিশ ভারত মহাসাগরীয় অঞ্চল",
@@ -132,7 +132,7 @@
         "Country_KR": "দক্ষিণ কোরিয়া",
         "Country_KW": "কুয়েত",
         "Country_KY": "কেম্যান দ্বীপপুঞ্জ",
-        "Country_KZ": "কাজাকস্থান",
+        "Country_KZ": "কাজাখস্তান",
         "Country_LA": "লাওস",
         "Country_LB": "লেবানন",
         "Country_LC": "সেন্ট লুসিয়া",
@@ -350,7 +350,7 @@
         "Language_de": "জার্মান",
         "Language_dv": "দিবেহি",
         "Language_dz": "জোঙ্গা",
-        "Language_ee": "এয়ে",
+        "Language_ee": "ইউয়ি",
         "Language_el": "গ্রিক",
         "Language_en": "ইংরেজি",
         "Language_eo": "এস্পেরান্তো",
@@ -360,10 +360,10 @@
         "Language_fa": "ফার্সি",
         "Language_ff": "ফুলাহ্",
         "Language_fi": "ফিনিশ",
-        "Language_fj": "ফিজিও",
-        "Language_fo": "ফেরাউনি",
+        "Language_fj": "ফিজিআন",
+        "Language_fo": "ফারোস",
         "Language_fr": "ফরাসি",
-        "Language_fy": "পশ্চিম ফ্রিসিয়",
+        "Language_fy": "পশ্চিম ফ্রিসিআন",
         "Language_ga": "আইরিশ",
         "Language_gd": "স্কটস-গ্যেলিক",
         "Language_gl": "গ্যালিশিয়",
@@ -390,10 +390,10 @@
         "Language_it": "ইতালীয়",
         "Language_iu": "ইনুক্টিটুট",
         "Language_ja": "জাপানি",
-        "Language_jv": "জাভানি",
+        "Language_jv": "জাভানিজ",
         "Language_ka": "জর্জিয়ান",
         "Language_kg": "কঙ্গো",
-        "Language_ki": "কিকু্ইয়ু",
+        "Language_ki": "কিকুয়ু",
         "Language_kj": "কোয়ানিয়ামা",
         "Language_kk": "কাজাখ",
         "Language_kl": "ক্যালাল্লিসুট",
@@ -402,7 +402,7 @@
         "Language_ko": "কোরিয়ান",
         "Language_kr": "কানুরি",
         "Language_ks": "কাশ্মীরী",
-        "Language_ku": "কুর্দি",
+        "Language_ku": "কুর্দিশ",
         "Language_kv": "কোমি",
         "Language_kw": "কর্ণিশ",
         "Language_ky": "কির্গিজ",
@@ -467,7 +467,7 @@
         "Language_sr": "সার্বীয়",
         "Language_ss": "সোয়াতি",
         "Language_st": "দক্ষিন সোথো",
-        "Language_su": "সুদানী",
+        "Language_su": "সুন্দানী",
         "Language_sv": "সুইডিশ",
         "Language_sw": "সোয়াহিলি",
         "Language_ta": "তামিল",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s মিনিট",
         "NSeconds": "%s সেকেন্ড",
         "NSecondsShort": "%s সেকেন্ড",
+        "NumberFormatCurrency": "#,##,##0.00¤",
+        "NumberFormatNumber": "#,##,##0.###",
+        "NumberFormatPercent": "#,##,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 দিন",
         "OneMinute": "1 মিনিট",
         "OneMinuteShort": "1 মিনিট",
@@ -568,7 +576,7 @@
         "PeriodYear": "বছর",
         "PeriodYears": "বছর",
         "Seconds": "সেকেন্ড",
-        "Time_AM": "পূর্বাহ্ণ",
+        "Time_AM": "AM",
         "Time_PM": "অপরাহ্ণ",
         "Today": "আজ",
         "Year_Short": "বছর",
diff --git a/plugins/Intl/lang/bs.json b/plugins/Intl/lang/bs.json
index 5cf7170ea0cc76fdc94cfd208f3cb3e2c15c07b7..89e795036398058eb942a719dfe1c5e1e28f9690 100644
--- a/plugins/Intl/lang/bs.json
+++ b/plugins/Intl/lang/bs.json
@@ -33,7 +33,7 @@
         "Country_BH": "Bahrein",
         "Country_BI": "Burundi",
         "Country_BJ": "Benin",
-        "Country_BL": "Sv. Bartolomej",
+        "Country_BL": "Sveti Bartolomej",
         "Country_BM": "Bermuda",
         "Country_BN": "Brunej",
         "Country_BO": "Bolivija",
@@ -46,7 +46,7 @@
         "Country_BY": "Bjelorusija",
         "Country_BZ": "Belize",
         "Country_CA": "Kanada",
-        "Country_CC": "Kokos (Keling) Ostrva",
+        "Country_CC": "Kokosova (Kilingova) ostrva",
         "Country_CD": "Demokratska Republika Kongo",
         "Country_CF": "Centralnoafrička Republika",
         "Country_CG": "Kongo",
@@ -103,7 +103,7 @@
         "Country_GW": "Gvineja-Bisao",
         "Country_GY": "Gvajana",
         "Country_HK": "Hong Kong (S. A. R. Kina)",
-        "Country_HM": "Herd i Mekdonald Ostrva",
+        "Country_HM": "Heard i arhipelag McDonald",
         "Country_HN": "Honduras",
         "Country_HR": "Hrvatska",
         "Country_HT": "Haiti",
@@ -135,7 +135,7 @@
         "Country_KZ": "Kazahstan",
         "Country_LA": "Laos",
         "Country_LB": "Liban",
-        "Country_LC": "Sent Lucija",
+        "Country_LC": "Sveta Lucija",
         "Country_LI": "Lihtenštajn",
         "Country_LK": "Å ri Lanka",
         "Country_LR": "Liberija",
@@ -187,7 +187,7 @@
         "Country_PH": "Filipini",
         "Country_PK": "Pakistan",
         "Country_PL": "Poljska",
-        "Country_PM": "Sen Pjer i Mikelon",
+        "Country_PM": "Sveti Petar i Mikelon",
         "Country_PN": "Pitkern",
         "Country_PR": "Porto Riko",
         "Country_PS": "Palestinska Teritorija",
@@ -208,7 +208,7 @@
         "Country_SG": "Singapur",
         "Country_SH": "Sveta Helena",
         "Country_SI": "Slovenija",
-        "Country_SJ": "Svalbard i Janmajen Ostrva",
+        "Country_SJ": "Svalbard i Jan Majen",
         "Country_SK": "Slovačka",
         "Country_SL": "Sijera Leone",
         "Country_SM": "San Marino",
@@ -221,7 +221,7 @@
         "Country_SX": "Sint Marten",
         "Country_SY": "Sirija",
         "Country_SZ": "Svazilend",
-        "Country_TC": "Turks i Kajkos Ostrva",
+        "Country_TC": "Ostrva Turks i Caicos",
         "Country_TD": "ÄŒad",
         "Country_TF": "Francuske Južne Teritorije",
         "Country_TG": "Togo",
@@ -239,18 +239,18 @@
         "Country_TZ": "Tanzanija",
         "Country_UA": "Ukrajina",
         "Country_UG": "Uganda",
-        "Country_UM": "Manja Udaljena Ostrva SAD",
+        "Country_UM": "Udaljena ostrva SAD",
         "Country_US": "Sjedinjene Američke Države",
         "Country_UY": "Urugvaj",
         "Country_UZ": "Uzbekistan",
         "Country_VA": "Vatikan",
-        "Country_VC": "Sent Vinsent i Grenadini",
+        "Country_VC": "Sveti Vincent i Grenadini",
         "Country_VE": "Venecuela",
         "Country_VG": "Britanska Djevičanska Ostrva",
         "Country_VI": "Djevičanska Ostrva SAD",
         "Country_VN": "Vijetnam",
         "Country_VU": "Vanuatu",
-        "Country_WF": "Valis i Futuna Ostrva",
+        "Country_WF": "Wallis i Futuna",
         "Country_WS": "Samoa",
         "Country_YE": "Jemen",
         "Country_YT": "Majote",
@@ -345,6 +345,7 @@
         "Language_cs": "Češki",
         "Language_cu": "Staroslovenski",
         "Language_cv": "Čuvaški",
+        "Language_cy": "Velški",
         "Language_da": "Danski",
         "Language_de": "Njemački",
         "Language_dv": "Divehijski",
@@ -466,7 +467,7 @@
         "Language_sr": "Srpski",
         "Language_ss": "Svati",
         "Language_st": "Sesoto",
-        "Language_su": "Sudanski",
+        "Language_su": "Sundanski",
         "Language_sv": "Å vedski",
         "Language_sw": "Svahili",
         "Language_ta": "Tamilski",
@@ -477,7 +478,7 @@
         "Language_tk": "Turkmenski",
         "Language_tl": "Tagalski",
         "Language_tn": "Tsvana",
-        "Language_to": "Tonga",
+        "Language_to": "Tonganski",
         "Language_tr": "Turski",
         "Language_ts": "Tsonga",
         "Language_tt": "Tatarski",
@@ -554,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekundi",
         "NSecondsShort": "%s sek",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dan",
         "OneMinute": "1 minut",
         "OneMinuteShort": "1 min",
@@ -571,6 +580,6 @@
         "Time_PM": "popodne",
         "Today": "Danas",
         "Year_Short": "g.",
-        "Yesterday": "Juče"
+        "Yesterday": "Jučer"
     }
 }
\ No newline at end of file
diff --git a/plugins/Intl/lang/ca.json b/plugins/Intl/lang/ca.json
index a32c0bcbc0e054036852b0519f5f25098e0df99f..d2b8a9a26e43b165825f9ae3c26ef7d4b693b056 100644
--- a/plugins/Intl/lang/ca.json
+++ b/plugins/Intl/lang/ca.json
@@ -43,7 +43,7 @@
         "Country_BT": "Bhutan",
         "Country_BV": "Bouvet",
         "Country_BW": "Botswana",
-        "Country_BY": "Bielorússia",
+        "Country_BY": "Belarús",
         "Country_BZ": "Belize",
         "Country_CA": "Canadà",
         "Country_CC": "Illes Cocos",
@@ -312,7 +312,7 @@
         "Format_Interval_Short_M": "d MMM – d MMM y",
         "Format_Interval_Short_Y": "d MMM y – d MMM y",
         "Format_Month_Long": "LLLL 'de' y",
-        "Format_Month_Short": "LLL y",
+        "Format_Month_Short": "LLL 'de' y",
         "Format_Time": "H:mm:ss",
         "Format_Year": "y",
         "Hours": "hores",
@@ -363,7 +363,7 @@
         "Language_fj": "Fijià",
         "Language_fo": "Feroès",
         "Language_fr": "Francès",
-        "Language_fy": "Frisó oriental",
+        "Language_fy": "Frisó occidental",
         "Language_ga": "Irlandès",
         "Language_gd": "Gaèlic escocès",
         "Language_gl": "Gallec",
@@ -440,7 +440,7 @@
         "Language_oj": "Ojibwa",
         "Language_om": "Oromo",
         "Language_or": "Oriya",
-        "Language_os": "Osset",
+        "Language_os": "Osseta",
         "Language_pa": "Panjabi",
         "Language_pi": "Pali",
         "Language_pl": "Polonès",
@@ -465,7 +465,7 @@
         "Language_so": "Somali",
         "Language_sq": "Albanès",
         "Language_sr": "Serbi",
-        "Language_ss": "Siswati",
+        "Language_ss": "Swazi",
         "Language_st": "Sotho meridional",
         "Language_su": "Sundanès",
         "Language_sv": "Suec",
@@ -476,8 +476,8 @@
         "Language_th": "Tailandès",
         "Language_ti": "Tigrinya",
         "Language_tk": "Turcman",
-        "Language_tl": "Tagàlog",
-        "Language_tn": "Tswana",
+        "Language_tl": "Tagal",
+        "Language_tn": "Setswana",
         "Language_to": "Tongalès",
         "Language_tr": "Turc",
         "Language_ts": "Tsonga",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segons",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dia",
         "OneMinute": "1 minut",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/cs.json b/plugins/Intl/lang/cs.json
index ed94dbf86f0fa6c86e26e10f6b9406c902e89b87..813e0506eea7d0f8e4e09aad58666d318223729c 100644
--- a/plugins/Intl/lang/cs.json
+++ b/plugins/Intl/lang/cs.json
@@ -383,7 +383,7 @@
         "Language_id": "Indonéština",
         "Language_ie": "Interlingue",
         "Language_ig": "Igboština",
-        "Language_ii": "S’-čchuan i",
+        "Language_ii": "Iština (sečuánská)",
         "Language_ik": "Inupiakština",
         "Language_io": "Ido",
         "Language_is": "Islandština",
@@ -555,21 +555,29 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekund",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 den",
         "OneMinute": "1 minuta",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Čeština",
-        "PeriodDay": "Den",
+        "PeriodDay": "den",
         "PeriodDays": "dny",
-        "PeriodMonth": "Měsíc",
+        "PeriodMonth": "měsíc",
         "PeriodMonths": "měsíce",
-        "PeriodWeek": "Týden",
+        "PeriodWeek": "týden",
         "PeriodWeeks": "týdny",
-        "PeriodYear": "Rok",
+        "PeriodYear": "rok",
         "PeriodYears": "roky",
         "Seconds": "sekundy",
-        "Time_AM": "dopoledne",
-        "Time_PM": "odpoledne",
+        "Time_AM": "dop.",
+        "Time_PM": "odp.",
         "Today": "Dnes",
         "Year_Short": "r.",
         "Yesterday": "Včera"
diff --git a/plugins/Intl/lang/cy.json b/plugins/Intl/lang/cy.json
index 90e833d8e023038561e142e7c462b4ecfbebf793..69a71a6022a283c530b0522920489535a77e68f6 100644
--- a/plugins/Intl/lang/cy.json
+++ b/plugins/Intl/lang/cy.json
@@ -81,7 +81,7 @@
         "Country_FJ": "Fiji",
         "Country_FK": "Ynysoedd y Falkland\/Malvinas",
         "Country_FM": "Micronesia",
-        "Country_FO": "Føroyar",
+        "Country_FO": "Ynysoedd Ffaro",
         "Country_FR": "Ffrainc",
         "Country_GA": "Gabon",
         "Country_GB": "Y Deyrnas Unedig",
@@ -184,7 +184,7 @@
         "Country_PE": "Periw",
         "Country_PF": "Polynesia Ffrengig",
         "Country_PG": "Papua Guinea Newydd",
-        "Country_PH": "Pilipinas",
+        "Country_PH": "Y Philipinau",
         "Country_PK": "Pakistan",
         "Country_PL": "Gwlad Pwyl",
         "Country_PM": "Saint-Pierre-et-Miquelon",
@@ -212,7 +212,7 @@
         "Country_SK": "Slofacia",
         "Country_SL": "Sierra Leone",
         "Country_SM": "San Marino",
-        "Country_SN": "Sénégal",
+        "Country_SN": "Senegal",
         "Country_SO": "Somalia",
         "Country_SR": "Suriname",
         "Country_SS": "De Swdan",
@@ -315,7 +315,7 @@
         "Format_Month_Short": "MMM y",
         "Format_Time": "HH:mm:ss",
         "Format_Year": "y",
-        "Hours": "hr",
+        "Hours": "oriau",
         "Language_aa": "Affareg",
         "Language_ab": "Abchaseg",
         "Language_ae": "Afestaneg",
@@ -326,6 +326,7 @@
         "Language_ar": "Arabeg",
         "Language_as": "Asameg",
         "Language_av": "Afareg",
+        "Language_ay": "Aymareg",
         "Language_az": "Aserbaijaneg",
         "Language_ba": "Bashcorteg",
         "Language_be": "Belarwseg",
@@ -343,10 +344,12 @@
         "Language_cr": "Cri",
         "Language_cs": "Tsieceg",
         "Language_cu": "Hen Slafoneg",
+        "Language_cv": "Tshwfasheg",
         "Language_cy": "Cymraeg",
         "Language_da": "Daneg",
         "Language_de": "Almaeneg",
         "Language_dv": "Difehi",
+        "Language_dz": "Dzongkha",
         "Language_ee": "Ewe",
         "Language_el": "Groeg",
         "Language_en": "Saesneg",
@@ -388,7 +391,9 @@
         "Language_jv": "Jafanaeg",
         "Language_ka": "Georgeg",
         "Language_kg": "Congo",
+        "Language_ki": "Kikuyu",
         "Language_kk": "Casacheg",
+        "Language_kl": "Kalaallisut",
         "Language_km": "Chmereg",
         "Language_kn": "Kannada",
         "Language_ko": "Coreeg",
@@ -405,6 +410,7 @@
         "Language_ln": "Lingala",
         "Language_lo": "Laoeg",
         "Language_lt": "Lithwaneg",
+        "Language_lu": "Luba-Katanga",
         "Language_lv": "Latfieg",
         "Language_mg": "Malagaseg",
         "Language_mh": "Marsialeg",
@@ -438,7 +444,7 @@
         "Language_ps": "Pashto",
         "Language_pt": "Portiwgeeg",
         "Language_qu": "Quechua",
-        "Language_rm": "Romaunsch",
+        "Language_rm": "Románsh",
         "Language_rn": "Rwndi",
         "Language_ro": "Rwmaneg",
         "Language_ru": "Rwseg",
@@ -452,9 +458,11 @@
         "Language_sk": "Slofaceg",
         "Language_sl": "Slofeneg",
         "Language_sm": "Samöeg",
+        "Language_sn": "Shona",
         "Language_so": "Somaleg",
         "Language_sq": "Albaneg",
         "Language_sr": "Serbeg",
+        "Language_ss": "Swati",
         "Language_st": "Sesotheg",
         "Language_su": "Swndaneg",
         "Language_sv": "Swedeg",
@@ -471,6 +479,7 @@
         "Language_tr": "Tyrceg",
         "Language_ts": "Tsongaeg",
         "Language_tt": "Tatareg",
+        "Language_tw": "Twi",
         "Language_ug": "Uighur",
         "Language_uk": "Wcreineg",
         "Language_ur": "Wrdw",
@@ -485,7 +494,7 @@
         "Language_zh": "Tsieineeg",
         "Language_zu": "Swlw",
         "LayoutDirection": "ltr",
-        "Minutes": "min",
+        "Minutes": "munudau",
         "Month_Long_1": "Ionawr",
         "Month_Long_10": "Hydref",
         "Month_Long_11": "Tachwedd",
@@ -515,7 +524,7 @@
         "Month_Short_11": "Tach",
         "Month_Short_12": "Rhag",
         "Month_Short_2": "Chwef",
-        "Month_Short_3": "Mawrth",
+        "Month_Short_3": "Maw",
         "Month_Short_4": "Ebrill",
         "Month_Short_5": "Mai",
         "Month_Short_6": "Meh",
@@ -540,23 +549,31 @@
         "NMinutesShort": "%s mun",
         "NSeconds": "%s eiliad",
         "NSecondsShort": "%s eil",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 diwrnod",
         "OneMinute": "1 munud",
         "OneMinuteShort": "1 mun",
         "OriginalLanguageName": "Cymraeg",
-        "PeriodDay": "Dydd",
-        "PeriodDays": "day",
-        "PeriodMonth": "Mis",
-        "PeriodMonths": "mon",
-        "PeriodWeek": "Wythnos",
-        "PeriodWeeks": "wk",
-        "PeriodYear": "Blwyddyn",
-        "PeriodYears": "yr",
-        "Seconds": "sec",
+        "PeriodDay": "dydd",
+        "PeriodDays": "diwrnodau",
+        "PeriodMonth": "mis",
+        "PeriodMonths": "misoedd",
+        "PeriodWeek": "wythnos",
+        "PeriodWeeks": "wythnosau",
+        "PeriodYear": "blwyddyn",
+        "PeriodYears": "blynyddoedd",
+        "Seconds": "eiliadau",
         "Time_AM": "AM",
         "Time_PM": "PM",
         "Today": "Heddiw",
-        "Year_Short": "Blwyddyn",
+        "Year_Short": "bl.",
         "Yesterday": "Ddoe"
     }
 }
\ No newline at end of file
diff --git a/plugins/Intl/lang/da.json b/plugins/Intl/lang/da.json
index 8209c4685b7c76361c3d6a943b9fde6b9461fddf..3710ea0c0b04552c1b3243c5c64f22183a861b9b 100644
--- a/plugins/Intl/lang/da.json
+++ b/plugins/Intl/lang/da.json
@@ -9,7 +9,7 @@
         "Continent_eur": "Europa",
         "Continent_oce": "Oceanien",
         "Country_AD": "Andorra",
-        "Country_AE": "Forenede Arabiske Emirater",
+        "Country_AE": "De Forenede Arabiske Emirater",
         "Country_AF": "Afghanistan",
         "Country_AG": "Antigua og Barbuda",
         "Country_AI": "Anguilla",
@@ -37,7 +37,7 @@
         "Country_BM": "Bermuda",
         "Country_BN": "Brunei",
         "Country_BO": "Bolivia",
-        "Country_BQ": "Nederlandske antiller",
+        "Country_BQ": "De Nederlandske Antiller",
         "Country_BR": "Brasilien",
         "Country_BS": "Bahamas",
         "Country_BT": "Bhutan",
@@ -48,7 +48,7 @@
         "Country_CA": "Canada",
         "Country_CC": "Cocosøerne",
         "Country_CD": "Congo-Kinshasa",
-        "Country_CF": "Centralafrikanske Republik",
+        "Country_CF": "Den Centralafrikanske Republik",
         "Country_CG": "Congo-Brazzaville",
         "Country_CH": "Schweiz",
         "Country_CI": "Elfenbenskysten",
@@ -173,7 +173,7 @@
         "Country_NF": "Norfolk Island",
         "Country_NG": "Nigeria",
         "Country_NI": "Nicaragua",
-        "Country_NL": "Holland",
+        "Country_NL": "Nederlandene",
         "Country_NO": "Norge",
         "Country_NP": "Nepal",
         "Country_NR": "Nauru",
@@ -216,7 +216,7 @@
         "Country_SO": "Somalia",
         "Country_SR": "Surinam",
         "Country_SS": "Sydsudan",
-        "Country_ST": "Sao Tome og Principe",
+        "Country_ST": "São Tomé og Príncipe",
         "Country_SV": "El Salvador",
         "Country_SX": "Sint Maarten",
         "Country_SY": "Syrien",
@@ -473,7 +473,7 @@
         "Language_ta": "Tamilsk",
         "Language_te": "Telugu",
         "Language_tg": "Tajik",
-        "Language_th": "Thailandsk",
+        "Language_th": "Thai",
         "Language_ti": "Tigrinya",
         "Language_tk": "Turkmensk",
         "Language_tl": "Tagalog",
@@ -552,20 +552,28 @@
         "NDays": "%s dage",
         "NHoursShort": "%s t",
         "NMinutes": "%s minutter",
-        "NMinutesShort": "%s min",
+        "NMinutesShort": "%s min.",
         "NSeconds": "%s sekunder",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dag",
         "OneMinute": "1 minut",
-        "OneMinuteShort": "1 min",
+        "OneMinuteShort": "1 min.",
         "OriginalLanguageName": "Dansk",
-        "PeriodDay": "Dag",
+        "PeriodDay": "dag",
         "PeriodDays": "dage",
-        "PeriodMonth": "MÃ¥ned",
+        "PeriodMonth": "måned",
         "PeriodMonths": "måneder",
-        "PeriodWeek": "Uge",
+        "PeriodWeek": "uge",
         "PeriodWeeks": "uger",
-        "PeriodYear": "Ã…r",
+        "PeriodYear": "Ã¥r",
         "PeriodYears": "Ã¥r",
         "Seconds": "sekunder",
         "Time_AM": "AM",
diff --git a/plugins/Intl/lang/de.json b/plugins/Intl/lang/de.json
index e9e1b249f7d58945e1551107f908ba51ec450de6..813e67dde74a5c806848b3ceb318842593467456 100644
--- a/plugins/Intl/lang/de.json
+++ b/plugins/Intl/lang/de.json
@@ -103,7 +103,7 @@
         "Country_GW": "Guinea-Bissau",
         "Country_GY": "Guyana",
         "Country_HK": "Sonderverwaltungszone Hongkong",
-        "Country_HM": "Heard- und McDonald-Inseln",
+        "Country_HM": "Heard und McDonaldinseln",
         "Country_HN": "Honduras",
         "Country_HR": "Kroatien",
         "Country_HT": "Haiti",
@@ -239,7 +239,7 @@
         "Country_TZ": "Tansania",
         "Country_UA": "Ukraine",
         "Country_UG": "Uganda",
-        "Country_UM": "Amerikanisch-Ozeanien",
+        "Country_UM": "Amerikanische Ãœberseeinseln",
         "Country_US": "Vereinigte Staaten",
         "Country_UY": "Uruguay",
         "Country_UZ": "Usbekistan",
@@ -332,7 +332,7 @@
         "Language_be": "Weißrussisch",
         "Language_bg": "Bulgarisch",
         "Language_bi": "Bislama",
-        "Language_bm": "Bambara-Sprache",
+        "Language_bm": "Bambara",
         "Language_bn": "Bengalisch",
         "Language_bo": "Tibetisch",
         "Language_br": "Bretonisch",
@@ -349,7 +349,7 @@
         "Language_da": "Dänisch",
         "Language_de": "Deutsch",
         "Language_dv": "Maledivisch",
-        "Language_dz": "Bhutanisch",
+        "Language_dz": "Dzongkha",
         "Language_ee": "Ewe",
         "Language_el": "Griechisch",
         "Language_en": "Englisch",
@@ -370,12 +370,12 @@
         "Language_gn": "Guarani",
         "Language_gu": "Gujarati",
         "Language_gv": "Manx",
-        "Language_ha": "Hausa",
+        "Language_ha": "Haussa",
         "Language_he": "Hebräisch",
         "Language_hi": "Hindi",
         "Language_ho": "Hiri-Motu",
         "Language_hr": "Kroatisch",
-        "Language_ht": "Haitianisch",
+        "Language_ht": "Haiti-Kreolisch",
         "Language_hu": "Ungarisch",
         "Language_hy": "Armenisch",
         "Language_hz": "Herero-Sprache",
@@ -397,11 +397,11 @@
         "Language_kj": "Kwanyama",
         "Language_kk": "Kasachisch",
         "Language_kl": "Grönländisch",
-        "Language_km": "Kambodschanisch",
+        "Language_km": "Khmer",
         "Language_kn": "Kannada",
         "Language_ko": "Koreanisch",
         "Language_kr": "Kanuri-Sprache",
-        "Language_ks": "Kaschmirisch",
+        "Language_ks": "Kaschmiri",
         "Language_ku": "Kurdisch",
         "Language_kv": "Komi-Sprache",
         "Language_kw": "Kornisch",
@@ -427,7 +427,7 @@
         "Language_my": "Birmanisch",
         "Language_na": "Nauruisch",
         "Language_nb": "Norwegisch Bokmål",
-        "Language_nd": "Nord-Ndebele-Sprache",
+        "Language_nd": "Nord-Ndebele",
         "Language_ne": "Nepalesisch",
         "Language_ng": "Ndonga",
         "Language_nl": "Niederländisch",
@@ -441,21 +441,21 @@
         "Language_om": "Oromo",
         "Language_or": "Oriya",
         "Language_os": "Ossetisch",
-        "Language_pa": "Panjabi",
+        "Language_pa": "Punjabi",
         "Language_pi": "Pali",
         "Language_pl": "Polnisch",
         "Language_ps": "Paschtu",
         "Language_pt": "Portugiesisch",
         "Language_qu": "Quechua",
         "Language_rm": "Rätoromanisch",
-        "Language_rn": "Rundi-Sprache",
+        "Language_rn": "Rundi",
         "Language_ro": "Rumänisch",
         "Language_ru": "Russisch",
-        "Language_rw": "Ruandisch",
+        "Language_rw": "Kinyarwanda",
         "Language_sa": "Sanskrit",
         "Language_sc": "Sardisch",
         "Language_sd": "Sindhi",
-        "Language_se": "Nord-Samisch",
+        "Language_se": "Nordsamisch",
         "Language_sg": "Sango",
         "Language_si": "Singhalesisch",
         "Language_sk": "Slowakisch",
@@ -470,11 +470,11 @@
         "Language_su": "Sundanesisch",
         "Language_sv": "Schwedisch",
         "Language_sw": "Suaheli",
-        "Language_ta": "Tamilisch",
+        "Language_ta": "Tamil",
         "Language_te": "Telugu",
         "Language_tg": "Tadschikisch",
         "Language_th": "Thailändisch",
-        "Language_ti": "Tigrinja",
+        "Language_ti": "Tigrinya",
         "Language_tk": "Turkmenisch",
         "Language_tl": "Tagalog",
         "Language_tn": "Tswana-Sprache",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s Min.",
         "NSeconds": "%s Sekunden",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 Tag",
         "OneMinute": "1 Minute",
         "OneMinuteShort": "1 Min.",
diff --git a/plugins/Intl/lang/el.json b/plugins/Intl/lang/el.json
index 360bbf34322d7413e5aa187ef9677ba8f8c494be..2af13ce2f3679a1c2e1b513da0b06edc5d590b5b 100644
--- a/plugins/Intl/lang/el.json
+++ b/plugins/Intl/lang/el.json
@@ -151,7 +151,7 @@
         "Country_MF": "Άγιος Μαρτίνος (Γαλλικό τμήμα)",
         "Country_MG": "Μαδαγασκάρη",
         "Country_MH": "Νήσοι Μάρσαλ",
-        "Country_MK": "ΠΓΔΜ",
+        "Country_MK": "Πρώην Γιουγκοσλαβική Δημοκρατία της Μακεδονίας",
         "Country_ML": "Μάλι",
         "Country_MM": "Μιανμάρ\/Βιρμανία",
         "Country_MN": "Μογγολία",
@@ -223,7 +223,7 @@
         "Country_SZ": "Σουαζιλάνδη",
         "Country_TC": "Νήσοι Τερκ και Κάικος",
         "Country_TD": "Τσαντ",
-        "Country_TF": "Γαλλικά Νότια Εδάφη",
+        "Country_TF": "Γαλλικές περιοχές του νοτίου ημισφαιρίου",
         "Country_TG": "Τόγκο",
         "Country_TH": "Ταϊλάνδη",
         "Country_TJ": "Τατζικιστάν",
@@ -239,7 +239,7 @@
         "Country_TZ": "Τανζανία",
         "Country_UA": "Ουκρανία",
         "Country_UG": "Ουγκάντα",
-        "Country_UM": "Απομακρυσμένες Νησίδες Η.Π.Α.",
+        "Country_UM": "Απομακρυσμένες Νησίδες ΗΠΑ",
         "Country_US": "Ηνωμένες Πολιτείες",
         "Country_UY": "Ουρουγουάη",
         "Country_UZ": "Ουζμπεκιστάν",
@@ -338,13 +338,13 @@
         "Language_br": "Βρετονικά",
         "Language_bs": "Βοσνιακά",
         "Language_ca": "Καταλανικά",
-        "Language_ce": "Τσέτσνιαν",
+        "Language_ce": "Τσετσενικά",
         "Language_ch": "Καμόρρο",
         "Language_co": "Κορσικανικά",
         "Language_cr": "Κρι",
         "Language_cs": "Τσεχικά",
         "Language_cu": "Εκκλησιαστικά Σλαβικά",
-        "Language_cv": "Χουβάς",
+        "Language_cv": "Τσουβασικά",
         "Language_cy": "Ουαλικά",
         "Language_da": "Δανικά",
         "Language_de": "Γερμανικά",
@@ -467,7 +467,7 @@
         "Language_sr": "Σερβικά",
         "Language_ss": "Σουάτι",
         "Language_st": "Νότια Σόθο",
-        "Language_su": "Σουδανικά",
+        "Language_su": "Σουνδανικά",
         "Language_sv": "Σουηδικά",
         "Language_sw": "Σουαχίλι",
         "Language_ta": "Ταμίλ",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s λεπ.",
         "NSeconds": "%s δευτερόλεπτα",
         "NSecondsShort": "%s δ",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ημέρα",
         "OneMinute": "1 λεπτό",
         "OneMinuteShort": "1 λεπ.",
         "OriginalLanguageName": "Ελληνικά",
-        "PeriodDay": "Ημέρα",
+        "PeriodDay": "ημέρα",
         "PeriodDays": "ημέρες",
-        "PeriodMonth": "Μήνας",
+        "PeriodMonth": "μήνας",
         "PeriodMonths": "μήνες",
-        "PeriodWeek": "Εβδομάδα",
+        "PeriodWeek": "εβδομάδα",
         "PeriodWeeks": "εβδομάδες",
-        "PeriodYear": "Έτος",
+        "PeriodYear": "έτος",
         "PeriodYears": "έτη",
         "Seconds": "δευτερόλεπτα",
         "Time_AM": "π.μ.",
diff --git a/plugins/Intl/lang/en.json b/plugins/Intl/lang/en.json
index 7ee85c4a60e3070e307f7c3a047e97f95e465bab..a52b7b2cf6f3ad0e6a5b329982e1aeb3552e4278 100644
--- a/plugins/Intl/lang/en.json
+++ b/plugins/Intl/lang/en.json
@@ -375,7 +375,7 @@
         "Language_hi": "Hindi",
         "Language_ho": "Hiri Motu",
         "Language_hr": "Croatian",
-        "Language_ht": "Haitian",
+        "Language_ht": "Haitian Creole",
         "Language_hu": "Hungarian",
         "Language_hy": "Armenian",
         "Language_hz": "Herero",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s seconds",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 day",
         "OneMinute": "1 minute",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "English",
-        "PeriodDay": "Day",
+        "PeriodDay": "day",
         "PeriodDays": "days",
-        "PeriodMonth": "Month",
+        "PeriodMonth": "month",
         "PeriodMonths": "months",
-        "PeriodWeek": "Week",
+        "PeriodWeek": "week",
         "PeriodWeeks": "weeks",
-        "PeriodYear": "Year",
+        "PeriodYear": "year",
         "PeriodYears": "years",
         "Seconds": "seconds",
         "Time_AM": "AM",
diff --git a/plugins/Intl/lang/es.json b/plugins/Intl/lang/es.json
index dfac04d2496431afa83de6b479a84aea5f48f5c3..10590cb9265ee04211ce615317f9906c31e63cb5 100644
--- a/plugins/Intl/lang/es.json
+++ b/plugins/Intl/lang/es.json
@@ -3,7 +3,7 @@
         "Continent_afr": "África",
         "Continent_amc": "Centroamérica",
         "Continent_amn": "América del Norte",
-        "Continent_ams": "Suramérica",
+        "Continent_ams": "Sudamérica",
         "Continent_ant": "Antártida",
         "Continent_asi": "Asia",
         "Continent_eur": "Europa",
@@ -61,7 +61,7 @@
         "Country_CU": "Cuba",
         "Country_CV": "Cabo Verde",
         "Country_CW": "Curazao",
-        "Country_CX": "Isla de Navidad (Christmas)",
+        "Country_CX": "Isla de Navidad",
         "Country_CY": "Chipre",
         "Country_CZ": "República Checa",
         "Country_DE": "Alemania",
@@ -192,7 +192,7 @@
         "Country_PR": "Puerto Rico",
         "Country_PS": "Territorios Palestinos",
         "Country_PT": "Portugal",
-        "Country_PW": "Palau",
+        "Country_PW": "Palaos",
         "Country_PY": "Paraguay",
         "Country_QA": "Catar",
         "Country_RE": "Reunión",
@@ -309,8 +309,8 @@
         "Format_Interval_Long_M": "d 'de' MMMM–d 'de' MMMM 'de' y",
         "Format_Interval_Long_Y": "d 'de' MMMM 'de' y–d 'de' MMMM 'de' y",
         "Format_Interval_Short_D": "d–d MMM y",
-        "Format_Interval_Short_M": "d MMM–d MMM y",
-        "Format_Interval_Short_Y": "d MMM y–d MMM y",
+        "Format_Interval_Short_M": "d MMM – d MMM y",
+        "Format_Interval_Short_Y": "d MMM y – d MMM y",
         "Format_Month_Long": "MMMM 'de' y",
         "Format_Month_Short": "MMM y",
         "Format_Time": "H:mm:ss",
@@ -344,7 +344,7 @@
         "Language_cr": "Cree",
         "Language_cs": "Checo",
         "Language_cu": "Eslavo eclesiástico",
-        "Language_cv": "Chuvash",
+        "Language_cv": "Chuvasio",
         "Language_cy": "Galés",
         "Language_da": "Danés",
         "Language_de": "Alemán",
@@ -426,12 +426,12 @@
         "Language_mt": "Maltés",
         "Language_my": "Birmano",
         "Language_na": "Nauruano",
-        "Language_nb": "Bokmal noruego",
+        "Language_nb": "Noruego bokmal",
         "Language_nd": "Ndebele septentrional",
         "Language_ne": "Nepalí",
         "Language_ng": "Ndonga",
         "Language_nl": "Neerlandés",
-        "Language_nn": "Nynorsk noruego",
+        "Language_nn": "Noruego nynorsk",
         "Language_no": "Noruego",
         "Language_nr": "Ndebele meridional",
         "Language_nv": "Navajo",
@@ -469,7 +469,7 @@
         "Language_st": "Sesotho meridional",
         "Language_su": "Sundanés",
         "Language_sv": "Sueco",
-        "Language_sw": "Swahili",
+        "Language_sw": "Suajili",
         "Language_ta": "Tamil",
         "Language_te": "Telugu",
         "Language_tg": "Tayiko",
@@ -492,7 +492,7 @@
         "Language_vi": "Vietnamita",
         "Language_vo": "Volapük",
         "Language_wa": "Valón",
-        "Language_wo": "Wólof",
+        "Language_wo": "Wolof",
         "Language_xh": "Xhosa",
         "Language_yi": "Yídish",
         "Language_yo": "Yoruba",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segundos",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 día",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Español",
-        "PeriodDay": "Día",
+        "PeriodDay": "día",
         "PeriodDays": "días",
-        "PeriodMonth": "Mes",
+        "PeriodMonth": "mes",
         "PeriodMonths": "meses",
-        "PeriodWeek": "Semana",
+        "PeriodWeek": "semana",
         "PeriodWeeks": "semanas",
-        "PeriodYear": "Año",
+        "PeriodYear": "año",
         "PeriodYears": "años",
         "Seconds": "segundos",
         "Time_AM": "a. m.",
diff --git a/plugins/Intl/lang/et.json b/plugins/Intl/lang/et.json
index 6db46c6cec098fc66bbf4d064dd4840a71767e88..db9277a739613cc470776cd97017c88f770e84b7 100644
--- a/plugins/Intl/lang/et.json
+++ b/plugins/Intl/lang/et.json
@@ -49,7 +49,7 @@
         "Country_CC": "Kookossaared",
         "Country_CD": "Kongo DV",
         "Country_CF": "Kesk-Aafrika Vabariik",
-        "Country_CG": "Kongo-Brazzaville",
+        "Country_CG": "Kongo Vabariik",
         "Country_CH": "Å veits",
         "Country_CI": "Côte d’Ivoire",
         "Country_CK": "Cooki saared",
@@ -80,7 +80,7 @@
         "Country_FI": "Soome",
         "Country_FJ": "Fidži",
         "Country_FK": "Falklandi saared",
-        "Country_FM": "Mikroneesia Liiduriigid",
+        "Country_FM": "Mikroneesia",
         "Country_FO": "Fääri saared",
         "Country_FR": "Prantsusmaa",
         "Country_GA": "Gabon",
@@ -102,7 +102,7 @@
         "Country_GU": "Guam",
         "Country_GW": "Guinea-Bissau",
         "Country_GY": "Guyana",
-        "Country_HK": "Hongkong - Hiina erihalduspiirkond",
+        "Country_HK": "Hongkongi erihalduspiirkond",
         "Country_HM": "Heardi ja McDonaldi saared",
         "Country_HN": "Honduras",
         "Country_HR": "Horvaatia",
@@ -122,7 +122,7 @@
         "Country_JM": "Jamaica",
         "Country_JO": "Jordaania",
         "Country_JP": "Jaapan",
-        "Country_KE": "Kenya",
+        "Country_KE": "Keenia",
         "Country_KG": "Kõrgõzstan",
         "Country_KH": "Kambodža",
         "Country_KI": "Kiribati",
@@ -148,14 +148,14 @@
         "Country_MC": "Monaco",
         "Country_MD": "Moldova",
         "Country_ME": "Montenegro",
-        "Country_MF": "Saint Martin",
+        "Country_MF": "Saint-Martin",
         "Country_MG": "Madagaskar",
-        "Country_MH": "Marshalli saared",
+        "Country_MH": "Marshalli Saared",
         "Country_MK": "Makedoonia",
         "Country_ML": "Mali",
         "Country_MM": "Myanmar (Birma)",
         "Country_MN": "Mongoolia",
-        "Country_MO": "Macau - Hiina erihalduspiirkond",
+        "Country_MO": "Macau erihalduspiirkond",
         "Country_MP": "Põhja-Mariaanid",
         "Country_MQ": "Martinique",
         "Country_MR": "Mauritaania",
@@ -306,16 +306,16 @@
         "Format_Date_Long": "EEEE, d. MMMM y",
         "Format_Date_Short": "d. MMM y",
         "Format_Interval_Long_D": "d.–d. MMMM y",
-        "Format_Interval_Long_M": "d. MMMM–d. MMMM y",
-        "Format_Interval_Long_Y": "d. MMMM y–d. MMMM y",
+        "Format_Interval_Long_M": "d. MMMM – d. MMMM y",
+        "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y",
         "Format_Interval_Short_D": "d.–d. MMM y",
-        "Format_Interval_Short_M": "d. MMM–d. MMM y",
-        "Format_Interval_Short_Y": "d. MMM y–d. MMM y",
+        "Format_Interval_Short_M": "d. MMM – d. MMM y",
+        "Format_Interval_Short_Y": "d. MMM y – d. MMM y",
         "Format_Month_Long": "MMMM y",
         "Format_Month_Short": "MMM y",
         "Format_Time": "H:mm.ss",
         "Format_Year": "y",
-        "Hours": "tundi",
+        "Hours": "tunnid",
         "Language_aa": "Afari",
         "Language_ab": "Abhaasi",
         "Language_ae": "Avesta",
@@ -358,7 +358,7 @@
         "Language_et": "Eesti",
         "Language_eu": "Baski",
         "Language_fa": "Pärsia",
-        "Language_ff": "Fulbe",
+        "Language_ff": "Fula",
         "Language_fi": "Soome",
         "Language_fj": "Fidži",
         "Language_fo": "Fääri",
@@ -373,7 +373,7 @@
         "Language_ha": "Hausa",
         "Language_he": "Heebrea",
         "Language_hi": "Hindi",
-        "Language_ho": "Motu",
+        "Language_ho": "Hirimotu",
         "Language_hr": "Horvaadi",
         "Language_ht": "Haiti",
         "Language_hu": "Ungari",
@@ -394,7 +394,7 @@
         "Language_ka": "Gruusia",
         "Language_kg": "Kongo",
         "Language_ki": "Kikuju",
-        "Language_kj": "Ambo",
+        "Language_kj": "Kvanjama",
         "Language_kk": "Kasahhi",
         "Language_kl": "Grööni",
         "Language_km": "Khmeeri",
@@ -431,7 +431,7 @@
         "Language_ne": "Nepali",
         "Language_ng": "Ndonga",
         "Language_nl": "Hollandi",
-        "Language_nn": "Norra nynorsk",
+        "Language_nn": "Uusnorra",
         "Language_no": "Norra",
         "Language_nr": "Lõunandebele",
         "Language_nv": "Navaho",
@@ -447,13 +447,13 @@
         "Language_ps": "Puštu",
         "Language_pt": "Portugali",
         "Language_qu": "Ketšua",
-        "Language_rm": "Retoromaani",
+        "Language_rm": "Romanši",
         "Language_rn": "Rundi",
         "Language_ro": "Rumeenia",
         "Language_ru": "Vene",
         "Language_rw": "Ruanda",
         "Language_sa": "Sanskriti",
-        "Language_sc": "Sardiinia",
+        "Language_sc": "Sardi",
         "Language_sd": "Sindhi",
         "Language_se": "Põhjasaami",
         "Language_sg": "Sango",
@@ -550,17 +550,25 @@
         "Month_Short_StandAlone_8": "Aug",
         "Month_Short_StandAlone_9": "Sept",
         "NDays": "%s ööpäeva",
-        "NHoursShort": "%s h",
+        "NHoursShort": "%s t",
         "NMinutes": "%s minutit",
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekundit",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ööpäev",
         "OneMinute": "1 minut",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Eesti",
         "PeriodDay": "päev",
-        "PeriodDays": "ööpäeva",
+        "PeriodDays": "ööpäevad",
         "PeriodMonth": "kuu",
         "PeriodMonths": "kuud",
         "PeriodWeek": "nädal",
diff --git a/plugins/Intl/lang/eu.json b/plugins/Intl/lang/eu.json
index 50ba4067ff0eb16cdd332592ff715434946e5c80..a102605b6dd91bd9b78ba65ddb4f81804e14c375 100644
--- a/plugins/Intl/lang/eu.json
+++ b/plugins/Intl/lang/eu.json
@@ -525,6 +525,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segundo",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "% #,##0",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 egun",
         "OneMinute": "1 minutu",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/fa.json b/plugins/Intl/lang/fa.json
index a3bf513df01669d66fce318928e55d51a86ee9c6..26110dfa0d0565ad3315bc499ee7b04e32d8c5b4 100644
--- a/plugins/Intl/lang/fa.json
+++ b/plugins/Intl/lang/fa.json
@@ -37,11 +37,11 @@
         "Country_BM": "برمودا",
         "Country_BN": "برونئی",
         "Country_BO": "بولیوی",
-        "Country_BQ": "بونیر",
+        "Country_BQ": "جزایر کارائیب هلند",
         "Country_BR": "برزیل",
         "Country_BS": "باهاما",
         "Country_BT": "بوتان",
-        "Country_BV": "جزیره بووه",
+        "Country_BV": "جزیرهٔ بووه",
         "Country_BW": "بوتسوانا",
         "Country_BY": "بلاروس",
         "Country_BZ": "بلیز",
@@ -228,7 +228,7 @@
         "Country_TH": "تایلند",
         "Country_TJ": "تاجیکستان",
         "Country_TK": "توکلائو",
-        "Country_TL": "تیمور شرقی",
+        "Country_TL": "تیمور-لسته",
         "Country_TM": "ترکمنستان",
         "Country_TN": "تونس",
         "Country_TO": "تونگا",
@@ -240,7 +240,7 @@
         "Country_UA": "اوکراین",
         "Country_UG": "اوگاندا",
         "Country_UM": "جزایر دورافتادهٔ ایالات متحده",
-        "Country_US": "ایالات متحدهٔ امریکا",
+        "Country_US": "ایالات متحده",
         "Country_UY": "اروگوئه",
         "Country_UZ": "ازبکستان",
         "Country_VA": "واتیکان",
@@ -329,13 +329,13 @@
         "Language_ay": "آیمارایی",
         "Language_az": "ترکی آذربایجانی",
         "Language_ba": "باشغیری",
-        "Language_be": "بلوروسی",
+        "Language_be": "بلاروسی",
         "Language_bg": "بلغاری",
         "Language_bi": "بیسلاما",
         "Language_bm": "بامبارایی",
         "Language_bn": "بنگالی",
         "Language_bo": "تبتی",
-        "Language_br": "برتانیایی",
+        "Language_br": "برتون",
         "Language_bs": "بوسنیایی",
         "Language_ca": "کاتالان",
         "Language_ce": "چچنی",
@@ -345,7 +345,7 @@
         "Language_cs": "چکی",
         "Language_cu": "اسلاوی کلیسایی",
         "Language_cv": "چوواشی",
-        "Language_cy": "ویلزی",
+        "Language_cy": "ولزی",
         "Language_da": "دانمارکی",
         "Language_de": "آلمانی",
         "Language_dv": "مالدیوی",
@@ -398,7 +398,7 @@
         "Language_kk": "قزاقی",
         "Language_kl": "گرینلندی",
         "Language_km": "خمری",
-        "Language_kn": "کاناده‌ای",
+        "Language_kn": "کانارا",
         "Language_ko": "کره‌ای",
         "Language_kr": "کانوریایی",
         "Language_ks": "کشمیری",
@@ -406,7 +406,7 @@
         "Language_kv": "کومیایی",
         "Language_kw": "کرنوالی",
         "Language_ky": "قرقیزی",
-        "Language_la": "لاتینی",
+        "Language_la": "لاتین",
         "Language_lb": "لوگزامبورگی",
         "Language_lg": "گاندایی",
         "Language_li": "لیمبورگی",
@@ -426,12 +426,12 @@
         "Language_mt": "مالتی",
         "Language_my": "برمه‌ای",
         "Language_na": "نائورویی",
-        "Language_nb": "بوکسمال نروژی",
+        "Language_nb": "نروژی بوک‌مُل",
         "Language_nd": "انده‌بله‌ای شمالی",
         "Language_ne": "نپالی",
         "Language_ng": "اندونگایی",
         "Language_nl": "هلندی",
-        "Language_nn": "نرس جدید نروژی",
+        "Language_nn": "نروژی نی‌نُشک",
         "Language_no": "نروژی",
         "Language_nr": "انده‌بله‌ای جنوبی",
         "Language_nv": "ناواهویی",
@@ -452,14 +452,14 @@
         "Language_ro": "رومانیایی",
         "Language_ru": "روسی",
         "Language_rw": "کینیارواندایی",
-        "Language_sa": "سنسکریت",
+        "Language_sa": "سانسکریت",
         "Language_sc": "ساردینیایی",
         "Language_sd": "سندی",
         "Language_se": "سامی شمالی",
-        "Language_sg": "سانگویی",
+        "Language_sg": "سانگو",
         "Language_si": "سینهالی",
         "Language_sk": "اسلواکی",
-        "Language_sl": "اسلووینیایی",
+        "Language_sl": "اسلوونیایی",
         "Language_sm": "ساموآیی",
         "Language_sn": "شونایی",
         "Language_so": "سومالیایی",
@@ -554,7 +554,15 @@
         "NMinutes": "%s دقیقه",
         "NMinutesShort": "%s دقیقه",
         "NSeconds": "%s ثانیه",
-        "NSecondsShort": "%sثانیه",
+        "NSecondsShort": "%s Ø«",
+        "NumberFormatCurrency": "‎¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": "Ù«",
+        "NumberSymbolGroup": "Ù¬",
+        "NumberSymbolMinus": "‎−",
+        "NumberSymbolPercent": "Ùª",
+        "NumberSymbolPlus": "‎+‎",
         "OneDay": "1 روز",
         "OneMinute": "1 دقیقه",
         "OneMinuteShort": "1 دقیقه",
diff --git a/plugins/Intl/lang/fi.json b/plugins/Intl/lang/fi.json
index 766f1a26e36684e39a21e184d08f9f0848bb891a..eb8f50332016311d944c11ac1c8b61203be407cd 100644
--- a/plugins/Intl/lang/fi.json
+++ b/plugins/Intl/lang/fi.json
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekuntia",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 päivä",
         "OneMinute": "1 minuutti",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/fr.json b/plugins/Intl/lang/fr.json
index fa0e99b349639fe274a4260b4d5993f7e574c355..57438a91f047d28a4730c990574a53bc9381d30b 100644
--- a/plugins/Intl/lang/fr.json
+++ b/plugins/Intl/lang/fr.json
@@ -153,7 +153,7 @@
         "Country_MH": "ÃŽles Marshall",
         "Country_MK": "Macédoine",
         "Country_ML": "Mali",
-        "Country_MM": "Myanmar",
+        "Country_MM": "Myanmar (Birmanie)",
         "Country_MN": "Mongolie",
         "Country_MO": "R.A.S. chinoise de Macao",
         "Country_MP": "ÃŽles Mariannes du Nord",
@@ -227,7 +227,7 @@
         "Country_TG": "Togo",
         "Country_TH": "Thaïlande",
         "Country_TJ": "Tadjikistan",
-        "Country_TK": "Tokelau",
+        "Country_TK": "Tokélaou",
         "Country_TL": "Timor oriental",
         "Country_TM": "Turkménistan",
         "Country_TN": "Tunisie",
@@ -375,7 +375,7 @@
         "Language_hi": "Hindi",
         "Language_ho": "Hiri motu",
         "Language_hr": "Croate",
-        "Language_ht": "Haïtien",
+        "Language_ht": "Créole haïtien",
         "Language_hu": "Hongrois",
         "Language_hy": "Arménien",
         "Language_hz": "Héréro",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s secondes",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 jour",
         "OneMinute": "1 minute",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/gl.json b/plugins/Intl/lang/gl.json
index 8448d0da11bae60863f3d2db6fcd15710870bb2e..15c88b8530853d1f2ff749ec602d89b8f1b64a2f 100644
--- a/plugins/Intl/lang/gl.json
+++ b/plugins/Intl/lang/gl.json
@@ -22,7 +22,7 @@
         "Country_AT": "Austria",
         "Country_AU": "Australia",
         "Country_AW": "Aruba",
-        "Country_AX": "Ã…land",
+        "Country_AX": "Illas Aland",
         "Country_AZ": "Acerbaixán",
         "Country_BA": "Bosnia e Hercegovina",
         "Country_BB": "Barbados",
@@ -46,7 +46,7 @@
         "Country_BY": "Bielorrusia",
         "Country_BZ": "Belice",
         "Country_CA": "Canadá",
-        "Country_CC": "Illas Cocos",
+        "Country_CC": "Illas Cocos (Keeling)",
         "Country_CD": "República Democrática do Congo",
         "Country_CF": "República Centroafricana",
         "Country_CG": "Congo",
@@ -78,7 +78,7 @@
         "Country_ES": "España",
         "Country_ET": "Etiopía",
         "Country_FI": "Finlandia",
-        "Country_FJ": "Fidxi",
+        "Country_FJ": "Fixi",
         "Country_FK": "Illas Malvinas",
         "Country_FM": "Micronesia",
         "Country_FO": "Illas Feroe",
@@ -100,7 +100,7 @@
         "Country_GS": "Xeorxia do Sur e Illas Sandwich",
         "Country_GT": "Guatemala",
         "Country_GU": "Guam",
-        "Country_GW": "Guinea-Bisau",
+        "Country_GW": "Guinea-Bissau",
         "Country_GY": "Güiana",
         "Country_HK": "Hong Kong RAE de China",
         "Country_HM": "Illa Heard e Illas McDonald",
@@ -118,7 +118,7 @@
         "Country_IR": "Irán",
         "Country_IS": "Islandia",
         "Country_IT": "Italia",
-        "Country_JE": "Illa de Jersey",
+        "Country_JE": "Jersey",
         "Country_JM": "Xamaica",
         "Country_JO": "Xordania",
         "Country_JP": "Xapón",
@@ -127,39 +127,39 @@
         "Country_KH": "Cambodia",
         "Country_KI": "Kiribati",
         "Country_KM": "Comores",
-        "Country_KN": "Saint Kitts e Nevis",
+        "Country_KN": "San Cristovo e Nevis",
         "Country_KP": "Corea do Norte",
         "Country_KR": "Corea do Sur",
         "Country_KW": "Kuwait",
         "Country_KY": "Illas Caimán",
-        "Country_KZ": "Casaquistán",
+        "Country_KZ": "Kazakhstan",
         "Country_LA": "Laos",
         "Country_LB": "Líbano",
         "Country_LC": "Santa Lucía",
         "Country_LI": "Liechtenstein",
         "Country_LK": "Sri Lanka",
         "Country_LR": "Liberia",
-        "Country_LS": "Lesoto",
+        "Country_LS": "Lesotho",
         "Country_LT": "Lituania",
         "Country_LU": "Luxemburgo",
         "Country_LV": "Letonia",
         "Country_LY": "Libia",
         "Country_MA": "Marrocos",
         "Country_MC": "Mónaco",
-        "Country_MD": "Moldavia",
+        "Country_MD": "Moldova",
         "Country_ME": "Montenegro",
         "Country_MF": "San Martiño",
         "Country_MG": "Madagascar",
         "Country_MH": "Illas Marshall",
-        "Country_MK": "República de Macedonia",
-        "Country_ML": "Malí",
+        "Country_MK": "Macedonia",
+        "Country_ML": "Mali",
         "Country_MM": "Myanmar (Birmania)",
         "Country_MN": "Mongolia",
         "Country_MO": "Macau RAE de China",
         "Country_MP": "Illas Marianas do norte",
         "Country_MQ": "Martinica",
         "Country_MR": "Mauritania",
-        "Country_MS": "Illa Montserrat",
+        "Country_MS": "Montserrat",
         "Country_MT": "Malta",
         "Country_MU": "Mauricio",
         "Country_MV": "Maldivas",
@@ -178,7 +178,7 @@
         "Country_NP": "Nepal",
         "Country_NR": "Nauru",
         "Country_NU": "Niue",
-        "Country_NZ": "Nova Zelandia",
+        "Country_NZ": "Nova Celandia",
         "Country_OM": "Omán",
         "Country_PA": "Panamá",
         "Country_PE": "Perú",
@@ -192,7 +192,7 @@
         "Country_PR": "Porto Rico",
         "Country_PS": "Territorios palestinos",
         "Country_PT": "Portugal",
-        "Country_PW": "Rep. das Palaus",
+        "Country_PW": "Palau",
         "Country_PY": "Paraguai",
         "Country_QA": "Qatar",
         "Country_RE": "Reunión",
@@ -217,7 +217,7 @@
         "Country_SR": "Surinam",
         "Country_SS": "Sudán do sur",
         "Country_ST": "San Tomé e Príncipe",
-        "Country_SV": "O Salvador",
+        "Country_SV": "El Salvador",
         "Country_SX": "Sint Maarten",
         "Country_SY": "Siria",
         "Country_SZ": "Suacilandia",
@@ -227,9 +227,9 @@
         "Country_TG": "Togo",
         "Country_TH": "Tailandia",
         "Country_TJ": "Taxiquistán",
-        "Country_TK": "Toquelau",
+        "Country_TK": "Tokelau",
         "Country_TL": "Timor Leste",
-        "Country_TM": "Turcomenistán",
+        "Country_TM": "Turkmenistán",
         "Country_TN": "Tunisia",
         "Country_TO": "Tonga",
         "Country_TR": "Turquía",
@@ -285,7 +285,7 @@
         "Day_Min_StandAlone_5": "Ven",
         "Day_Min_StandAlone_6": "Sáb",
         "Day_Min_StandAlone_7": "Dom",
-        "Day_Short_1": "Lun",
+        "Day_Short_1": "Luns",
         "Day_Short_2": "Mar",
         "Day_Short_3": "Mér",
         "Day_Short_4": "Xov",
@@ -328,15 +328,16 @@
         "Language_ba": "Baskir",
         "Language_be": "Bielorruso",
         "Language_bg": "Búlgaro",
-        "Language_bm": "Bambara",
         "Language_bn": "Bengalí",
         "Language_bo": "Tibetano",
         "Language_br": "Bretón",
         "Language_bs": "Bosnio",
         "Language_ca": "Catalán",
+        "Language_ce": "Checheno",
         "Language_co": "Corso",
         "Language_cs": "Checo",
         "Language_cu": "Eslavo eclesiástico",
+        "Language_cv": "Chuvash",
         "Language_cy": "Galés",
         "Language_da": "Dinamarqués",
         "Language_de": "Alemán",
@@ -374,20 +375,17 @@
         "Language_ii": "Yi sichuanés",
         "Language_is": "Islandés",
         "Language_it": "Italiano",
-        "Language_iu": "Inuit",
         "Language_ja": "Xaponés",
         "Language_jv": "Xavanés",
         "Language_ka": "Xeorxiano",
         "Language_kg": "Kongo",
         "Language_ki": "Kikuyu",
         "Language_kk": "Casaco",
-        "Language_kl": "Groenlandés",
         "Language_km": "Cambodiano",
         "Language_kn": "Kannada",
         "Language_ko": "Coreano",
         "Language_ks": "Cachemir",
         "Language_ku": "Kurdo",
-        "Language_kw": "Córnico",
         "Language_ky": "Quirguiz",
         "Language_la": "Latín",
         "Language_lb": "Luxemburgués",
@@ -395,7 +393,7 @@
         "Language_ln": "Lingala",
         "Language_lo": "Laotiano",
         "Language_lt": "Lituano",
-        "Language_lu": "Luba-katanga",
+        "Language_lu": "Luba-Katanga",
         "Language_lv": "Letón",
         "Language_mg": "Malgaxe",
         "Language_mi": "Maorí",
@@ -525,6 +523,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segundos",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 día",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/he.json b/plugins/Intl/lang/he.json
index c1a84f00336c7590ed4aa8b01aa5697b08e522a0..50c63fc1d4f8b89e7176839b86693e393f01f6bd 100644
--- a/plugins/Intl/lang/he.json
+++ b/plugins/Intl/lang/he.json
@@ -218,7 +218,7 @@
         "Country_SS": "דרום סודן",
         "Country_ST": "סאו טומה ופרינסיפה",
         "Country_SV": "אל סלבדור",
-        "Country_SX": "סינט מארטן",
+        "Country_SX": "סנט מארטן",
         "Country_SY": "סוריה",
         "Country_SZ": "סווזילנד",
         "Country_TC": "איי טורקס וקאיקוס",
@@ -426,12 +426,12 @@
         "Language_mt": "מלטית",
         "Language_my": "בורמזית",
         "Language_na": "נאורית",
-        "Language_nb": "‏נורבגית ספרותית",
+        "Language_nb": "נורווגית ספרותית",
         "Language_nd": "צפון נדבלה",
         "Language_ne": "נפאלית",
         "Language_ng": "נדונגה",
         "Language_nl": "הולנדית",
-        "Language_nn": "נורבגית חדשה",
+        "Language_nn": "נורווגית חדשה",
         "Language_no": "נורבגית",
         "Language_nr": "דרום נדבלה",
         "Language_nv": "נבחו",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s דק׳",
         "NSeconds": "%s שניות",
         "NSecondsShort": "%s שנ׳",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "‎-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "‎+",
         "OneDay": "יום",
         "OneMinute": "דקה",
         "OneMinuteShort": "דקה",
diff --git a/plugins/Intl/lang/hi.json b/plugins/Intl/lang/hi.json
index 225da598d41bac187b46c056630c63c51596e80b..73c68868e8e5fe2284625951b3fee961c7335bbb 100644
--- a/plugins/Intl/lang/hi.json
+++ b/plugins/Intl/lang/hi.json
@@ -386,7 +386,7 @@
         "Language_ii": "सिचुआन यी",
         "Language_ik": "इनुपियाक्",
         "Language_io": "इडौ",
-        "Language_is": "आइसलैंडी",
+        "Language_is": "आइसलैंडिक",
         "Language_it": "इतालवी",
         "Language_iu": "इनूकीटूत्",
         "Language_ja": "जापानी",
@@ -396,7 +396,7 @@
         "Language_ki": "किकुयू",
         "Language_kj": "क्वान्यामा",
         "Language_kk": "कज़ाख़",
-        "Language_kl": "ग्रीनलैंडिक",
+        "Language_kl": "कलालीसुत",
         "Language_km": "खमेर",
         "Language_kn": "कन्नड़",
         "Language_ko": "कोरियाई",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s मि.",
         "NSeconds": "%s सेकंड",
         "NSecondsShort": "%sसे.",
+        "NumberFormatCurrency": "¤#,##,##0.00",
+        "NumberFormatNumber": "#,##,##0.###",
+        "NumberFormatPercent": "#,##,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 दिन",
         "OneMinute": "1 मिनट",
         "OneMinuteShort": "1 मि.",
diff --git a/plugins/Intl/lang/hr.json b/plugins/Intl/lang/hr.json
index 46793d2519f124f12e3b4f1d1efb00abead364a0..48bcdd8a09596daee8065d6154f9cdbe3ddc148f 100644
--- a/plugins/Intl/lang/hr.json
+++ b/plugins/Intl/lang/hr.json
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekundi",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dan",
         "OneMinute": "1 minuta",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Hrvatski",
-        "PeriodDay": "Dan",
+        "PeriodDay": "dan",
         "PeriodDays": "dani",
-        "PeriodMonth": "Mjesec",
+        "PeriodMonth": "mjesec",
         "PeriodMonths": "mjeseci",
-        "PeriodWeek": "Tjedan",
+        "PeriodWeek": "tjedan",
         "PeriodWeeks": "tjedni",
-        "PeriodYear": "Godina",
+        "PeriodYear": "godina",
         "PeriodYears": "godine",
         "Seconds": "sekunde",
         "Time_AM": "AM",
diff --git a/plugins/Intl/lang/hu.json b/plugins/Intl/lang/hu.json
index 7481dc75a9bda3236f06b9e207f4136b6ffa5351..4df06ba7067eb8e35bf4ac631e26528a093ab72a 100644
--- a/plugins/Intl/lang/hu.json
+++ b/plugins/Intl/lang/hu.json
@@ -9,7 +9,7 @@
         "Continent_eur": "Európa",
         "Continent_oce": "Óceánia",
         "Country_AD": "Andorra",
-        "Country_AE": "Egyesült Arab Emirátus",
+        "Country_AE": "Egyesült Arab Emírségek",
         "Country_AF": "Afganisztán",
         "Country_AG": "Antigua és Barbuda",
         "Country_AI": "Anguilla",
@@ -78,7 +78,7 @@
         "Country_ES": "Spanyolország",
         "Country_ET": "Etiópia",
         "Country_FI": "Finnország",
-        "Country_FJ": "Fidzsi-szigetek",
+        "Country_FJ": "Fidzsi",
         "Country_FK": "Falkland-szigetek",
         "Country_FM": "Mikronézia",
         "Country_FO": "Feröer-szigetek",
@@ -100,7 +100,7 @@
         "Country_GS": "Déli-Georgia és Déli-Sandwich-szigetek",
         "Country_GT": "Guatemala",
         "Country_GU": "Guam",
-        "Country_GW": "Guinea-Bissau",
+        "Country_GW": "Bissau-Guinea",
         "Country_GY": "Guyana",
         "Country_HK": "Hongkong SAR Kína",
         "Country_HM": "Heard-sziget és McDonald-szigetek",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s másodperc",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 nap",
         "OneMinute": "1 perc",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/id.json b/plugins/Intl/lang/id.json
index ff1028c94dc3124eb503a82df0a363a9d38c3273..ef6ae7fafaca59b1ae2e5e4be0d3414b546153cf 100644
--- a/plugins/Intl/lang/id.json
+++ b/plugins/Intl/lang/id.json
@@ -330,7 +330,7 @@
         "Language_az": "Azerbaijan",
         "Language_ba": "Bashkir",
         "Language_be": "Belarusia",
-        "Language_bg": "Bulgar",
+        "Language_bg": "Bulgaria",
         "Language_bi": "Bislama",
         "Language_bm": "Bambara",
         "Language_bn": "Bengali",
@@ -380,7 +380,7 @@
         "Language_hy": "Armenia",
         "Language_hz": "Herero",
         "Language_ia": "Interlingua",
-        "Language_id": "Bahasa Indonesia",
+        "Language_id": "Indonesia",
         "Language_ie": "Interlingue",
         "Language_ig": "Igbo",
         "Language_ii": "Sichuan Yi",
@@ -424,7 +424,7 @@
         "Language_mr": "Marathi",
         "Language_ms": "Melayu",
         "Language_mt": "Malta",
-        "Language_my": "Burma",
+        "Language_my": "Myanmar",
         "Language_na": "Nauru",
         "Language_nb": "Bokmål Norwegia",
         "Language_nd": "Ndebele Utara",
@@ -555,10 +555,18 @@
         "NMinutesShort": "%s mnt",
         "NSeconds": "%s detik",
         "NSecondsShort": "%s dtk",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 hari",
         "OneMinute": "1 menit",
         "OneMinuteShort": "1 mnt",
-        "OriginalLanguageName": "Bahasa Indonesia",
+        "OriginalLanguageName": "Indonesia",
         "PeriodDay": "Hari",
         "PeriodDays": "hari",
         "PeriodMonth": "Bulan",
diff --git a/plugins/Intl/lang/is.json b/plugins/Intl/lang/is.json
index 03b1b59c38c28a068939b393ba11e5d9018f9dc5..1160564dd82535111cf7336467535dded7c4b111 100644
--- a/plugins/Intl/lang/is.json
+++ b/plugins/Intl/lang/is.json
@@ -33,7 +33,7 @@
         "Country_BH": "Barein",
         "Country_BI": "Búrúndí",
         "Country_BJ": "Benín",
-        "Country_BL": "Saint Barthélemy",
+        "Country_BL": "Sankti Bartólómeusareyjar",
         "Country_BM": "Bermúdaeyjar",
         "Country_BN": "Brúnei",
         "Country_BO": "Bólivía",
@@ -78,7 +78,7 @@
         "Country_ES": "Spánn",
         "Country_ET": "Eþíópía",
         "Country_FI": "Finnland",
-        "Country_FJ": "Fídjieyjar",
+        "Country_FJ": "Fídjíeyjar",
         "Country_FK": "Falklandseyjar",
         "Country_FM": "Míkrónesía",
         "Country_FO": "Færeyjar",
@@ -148,7 +148,7 @@
         "Country_MC": "Mónakó",
         "Country_MD": "Moldóva",
         "Country_ME": "Svartfjallaland",
-        "Country_MF": "Saint Martin",
+        "Country_MF": "St. Martin",
         "Country_MG": "Madagaskar",
         "Country_MH": "Marshalleyjar",
         "Country_MK": "Makedónía",
@@ -218,7 +218,7 @@
         "Country_SS": "Suður-Súdan",
         "Country_ST": "Saó Tóme og Prinsípe",
         "Country_SV": "El Salvador",
-        "Country_SX": "Sint Maarten",
+        "Country_SX": "Sankti Martin",
         "Country_SY": "Sýrland",
         "Country_SZ": "Svasíland",
         "Country_TC": "Turks- og Caicoseyjar",
@@ -553,6 +553,14 @@
         "NMinutesShort": "%s mín.",
         "NSeconds": "%s sekúndur",
         "NSecondsShort": "%s sek.",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dagur",
         "OneMinute": "1 mínúta",
         "OneMinuteShort": "1 mín.",
diff --git a/plugins/Intl/lang/it.json b/plugins/Intl/lang/it.json
index 20aba2c4dbf5b8d62cd9e1a3e19472b5476512ef..5f8882536985f45ebfd329bdf45dbc3dc86d97d3 100644
--- a/plugins/Intl/lang/it.json
+++ b/plugins/Intl/lang/it.json
@@ -18,13 +18,13 @@
         "Country_AO": "Angola",
         "Country_AQ": "Antartide",
         "Country_AR": "Argentina",
-        "Country_AS": "Samoa Americane",
+        "Country_AS": "Samoa americane",
         "Country_AT": "Austria",
         "Country_AU": "Australia",
         "Country_AW": "Aruba",
-        "Country_AX": "Isole Aland",
+        "Country_AX": "Isole Ã…land",
         "Country_AZ": "Azerbaigian",
-        "Country_BA": "Bosnia-Erzegovina",
+        "Country_BA": "Bosnia ed Erzegovina",
         "Country_BB": "Barbados",
         "Country_BD": "Bangladesh",
         "Country_BE": "Belgio",
@@ -46,7 +46,7 @@
         "Country_BY": "Bielorussia",
         "Country_BZ": "Belize",
         "Country_CA": "Canada",
-        "Country_CC": "Isole Cocos",
+        "Country_CC": "Isole Cocos (Keeling)",
         "Country_CD": "Congo - Kinshasa",
         "Country_CF": "Repubblica Centrafricana",
         "Country_CG": "Congo-Brazzaville",
@@ -61,7 +61,7 @@
         "Country_CU": "Cuba",
         "Country_CV": "Capo Verde",
         "Country_CW": "Curaçao",
-        "Country_CX": "Isola di Christmas",
+        "Country_CX": "Isola Christmas",
         "Country_CY": "Cipro",
         "Country_CZ": "Repubblica Ceca",
         "Country_DE": "Germania",
@@ -73,7 +73,7 @@
         "Country_EC": "Ecuador",
         "Country_EE": "Estonia",
         "Country_EG": "Egitto",
-        "Country_EH": "Sahara Occidentale",
+        "Country_EH": "Sahara occidentale",
         "Country_ER": "Eritrea",
         "Country_ES": "Spagna",
         "Country_ET": "Etiopia",
@@ -81,13 +81,13 @@
         "Country_FJ": "Figi",
         "Country_FK": "Isole Falkland",
         "Country_FM": "Micronesia",
-        "Country_FO": "Isole Faroe",
+        "Country_FO": "Isole Fær Øer",
         "Country_FR": "Francia",
         "Country_GA": "Gabon",
         "Country_GB": "Regno Unito",
         "Country_GD": "Grenada",
         "Country_GE": "Georgia",
-        "Country_GF": "Guiana Francese",
+        "Country_GF": "Guyana francese",
         "Country_GG": "Guernsey",
         "Country_GH": "Ghana",
         "Country_GI": "Gibilterra",
@@ -97,7 +97,7 @@
         "Country_GP": "Guadalupa",
         "Country_GQ": "Guinea Equatoriale",
         "Country_GR": "Grecia",
-        "Country_GS": "Georgia del Sud e isole Sandwich meridionali",
+        "Country_GS": "Georgia del Sud e isole Sandwich australi",
         "Country_GT": "Guatemala",
         "Country_GU": "Guam",
         "Country_GW": "Guinea-Bissau",
@@ -113,7 +113,7 @@
         "Country_IL": "Israele",
         "Country_IM": "Isola di Man",
         "Country_IN": "India",
-        "Country_IO": "Territorio Britannico dell’Oceano Indiano",
+        "Country_IO": "Territorio britannico dell’Oceano Indiano",
         "Country_IQ": "Iraq",
         "Country_IR": "Iran",
         "Country_IS": "Islanda",
@@ -156,7 +156,7 @@
         "Country_MM": "Myanmar (Birmania)",
         "Country_MN": "Mongolia",
         "Country_MO": "RAS di Macao",
-        "Country_MP": "Isole Marianne Settentrionali",
+        "Country_MP": "Isole Marianne settentrionali",
         "Country_MQ": "Martinica",
         "Country_MR": "Mauritania",
         "Country_MS": "Montserrat",
@@ -165,7 +165,7 @@
         "Country_MV": "Maldive",
         "Country_MW": "Malawi",
         "Country_MX": "Messico",
-        "Country_MY": "Malesia",
+        "Country_MY": "Malaysia",
         "Country_MZ": "Mozambico",
         "Country_NA": "Namibia",
         "Country_NC": "Nuova Caledonia",
@@ -182,7 +182,7 @@
         "Country_OM": "Oman",
         "Country_PA": "Panamá",
         "Country_PE": "Perù",
-        "Country_PF": "Polinesia Francese",
+        "Country_PF": "Polinesia francese",
         "Country_PG": "Papua Nuova Guinea",
         "Country_PH": "Filippine",
         "Country_PK": "Pakistan",
@@ -195,13 +195,13 @@
         "Country_PW": "Palau",
         "Country_PY": "Paraguay",
         "Country_QA": "Qatar",
-        "Country_RE": "Réunion",
+        "Country_RE": "Riunione",
         "Country_RO": "Romania",
         "Country_RS": "Serbia",
-        "Country_RU": "Federazione Russa",
+        "Country_RU": "Russia",
         "Country_RW": "Ruanda",
         "Country_SA": "Arabia Saudita",
-        "Country_SB": "Isole Solomon",
+        "Country_SB": "Isole Salomone",
         "Country_SC": "Seychelles",
         "Country_SD": "Sudan",
         "Country_SE": "Svezia",
@@ -215,7 +215,7 @@
         "Country_SN": "Senegal",
         "Country_SO": "Somalia",
         "Country_SR": "Suriname",
-        "Country_SS": "Sudan del Sud",
+        "Country_SS": "Sud Sudan",
         "Country_ST": "São Tomé e Príncipe",
         "Country_SV": "El Salvador",
         "Country_SX": "Sint Maarten",
@@ -223,12 +223,12 @@
         "Country_SZ": "Swaziland",
         "Country_TC": "Isole Turks e Caicos",
         "Country_TD": "Ciad",
-        "Country_TF": "Territori australi francesi",
+        "Country_TF": "Terre australi francesi",
         "Country_TG": "Togo",
-        "Country_TH": "Tailandia",
+        "Country_TH": "Thailandia",
         "Country_TJ": "Tagikistan",
         "Country_TK": "Tokelau",
-        "Country_TL": "Timor Est",
+        "Country_TL": "Timor Leste",
         "Country_TM": "Turkmenistan",
         "Country_TN": "Tunisia",
         "Country_TO": "Tonga",
@@ -239,7 +239,7 @@
         "Country_TZ": "Tanzania",
         "Country_UA": "Ucraina",
         "Country_UG": "Uganda",
-        "Country_UM": "Isole minori lontane dagli USA",
+        "Country_UM": "Altre isole americane del Pacifico",
         "Country_US": "Stati Uniti",
         "Country_UY": "Uruguay",
         "Country_UZ": "Uzbekistan",
@@ -344,7 +344,7 @@
         "Language_cr": "Cree",
         "Language_cs": "Ceco",
         "Language_cu": "Slavo della Chiesa",
-        "Language_cv": "Chuvash",
+        "Language_cv": "Ciuvascio",
         "Language_cy": "Gallese",
         "Language_da": "Danese",
         "Language_de": "Tedesco",
@@ -369,7 +369,7 @@
         "Language_gl": "Galiziano",
         "Language_gn": "Guaraní",
         "Language_gu": "Gujarati",
-        "Language_gv": "Manx",
+        "Language_gv": "Mannese",
         "Language_ha": "Hausa",
         "Language_he": "Ebraico",
         "Language_hi": "Hindi",
@@ -396,7 +396,7 @@
         "Language_ki": "Kikuyu",
         "Language_kj": "Kuanyama",
         "Language_kk": "Kazako",
-        "Language_kl": "Kalaallisut",
+        "Language_kl": "Groenlandese",
         "Language_km": "Khmer",
         "Language_kn": "Kannada",
         "Language_ko": "Coreano",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s secondi",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 giorno",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Italiano",
-        "PeriodDay": "Giorno",
+        "PeriodDay": "giorno",
         "PeriodDays": "giorni",
-        "PeriodMonth": "Mese",
+        "PeriodMonth": "mese",
         "PeriodMonths": "mesi",
-        "PeriodWeek": "Settimana",
+        "PeriodWeek": "settimana",
         "PeriodWeeks": "settimane",
-        "PeriodYear": "Anno",
+        "PeriodYear": "anno",
         "PeriodYears": "anni",
         "Seconds": "secondi",
         "Time_AM": "AM",
diff --git a/plugins/Intl/lang/ja.json b/plugins/Intl/lang/ja.json
index 9007463ce280addd9e009ef036a99628f34d6520..b1434f36d6ec6482be59e7f7488464aa0f5920f7 100644
--- a/plugins/Intl/lang/ja.json
+++ b/plugins/Intl/lang/ja.json
@@ -86,7 +86,7 @@
         "Country_GA": "ガボン",
         "Country_GB": "イギリス",
         "Country_GD": "グレナダ",
-        "Country_GE": "グルジア",
+        "Country_GE": "ジョージア",
         "Country_GF": "仏領ギアナ",
         "Country_GG": "ガーンジー",
         "Country_GH": "ガーナ",
@@ -391,7 +391,7 @@
         "Language_iu": "イヌクウティトット語",
         "Language_ja": "日本語",
         "Language_jv": "ジャワ語",
-        "Language_ka": "グルジア語",
+        "Language_ka": "ジョージア語",
         "Language_kg": "コンゴ語",
         "Language_ki": "キクユ語",
         "Language_kj": "クワニャマ語",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s 分",
         "NSeconds": "%s 秒",
         "NSecondsShort": "%s秒",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 æ—¥",
         "OneMinute": "1 分",
         "OneMinuteShort": "1 分",
diff --git a/plugins/Intl/lang/ka.json b/plugins/Intl/lang/ka.json
index 7c6e7406e4cf7e5ab8b44938fb1c00d05697df15..819f7ba2a0903a2ed1f30aeda29cc7fcf60d7cb6 100644
--- a/plugins/Intl/lang/ka.json
+++ b/plugins/Intl/lang/ka.json
@@ -301,18 +301,18 @@
         "Day_Short_StandAlone_7": "კვი",
         "EnglishLanguageName": "Georgian",
         "Format_DateTime_Long": "EEEE, dd MMMM, y HH:mm:ss",
-        "Format_DateTime_Short": "d MMM, y HH:mm:ss",
+        "Format_DateTime_Short": "d MMM. y HH:mm:ss",
         "Format_Date_Day_Month": "E, d MMM",
         "Format_Date_Long": "EEEE, dd MMMM, y",
-        "Format_Date_Short": "d MMM, y",
+        "Format_Date_Short": "d MMM. y",
         "Format_Interval_Long_D": "d–d MMMM, y",
-        "Format_Interval_Long_M": "dd MM – dd MM, y",
-        "Format_Interval_Long_Y": "dd MMMM, y – d MMMM, y",
+        "Format_Interval_Long_M": "dd MMMM. – dd MMMM. y",
+        "Format_Interval_Long_Y": "dd MMMM. y – d MMMM. y",
         "Format_Interval_Short_D": "d–d MMM, y",
-        "Format_Interval_Short_M": "dd MM – dd MM, y",
-        "Format_Interval_Short_Y": "dd MMM, y – d MMM, y",
+        "Format_Interval_Short_M": "dd MMM. – dd MMM. y",
+        "Format_Interval_Short_Y": "dd MMM. y – d MMM. y",
         "Format_Month_Long": "MMMM, y",
-        "Format_Month_Short": "MMM, y",
+        "Format_Month_Short": "MMM. y",
         "Format_Time": "HH:mm:ss",
         "Format_Year": "y",
         "Hours": "საათი",
@@ -536,6 +536,14 @@
         "NMinutesShort": "%s წთ",
         "NSeconds": "%s წამი",
         "NSecondsShort": "%sწმ",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 დღე",
         "OneMinute": "1 წუთი",
         "OneMinuteShort": "1 წთ",
diff --git a/plugins/Intl/lang/ko.json b/plugins/Intl/lang/ko.json
index e59b06b83b237e3b36f2f1c53667e5b07ca9a3f8..70b13cb503d3f0814168cff8b172f2934388847f 100644
--- a/plugins/Intl/lang/ko.json
+++ b/plugins/Intl/lang/ko.json
@@ -9,7 +9,7 @@
         "Continent_eur": "유럽",
         "Continent_oce": "오세아니아",
         "Country_AD": "안도라",
-        "Country_AE": "아랍에미리트 연합",
+        "Country_AE": "아랍에미리트",
         "Country_AF": "아프가니스탄",
         "Country_AG": "앤티가 바부다",
         "Country_AI": "앵귈라",
@@ -46,13 +46,13 @@
         "Country_BY": "벨라루스",
         "Country_BZ": "벨리즈",
         "Country_CA": "캐나다",
-        "Country_CC": "코코스제도",
+        "Country_CC": "코코스 제도",
         "Country_CD": "콩고-킨샤사",
         "Country_CF": "중앙 아프리카 공화국",
         "Country_CG": "콩고",
         "Country_CH": "스위스",
         "Country_CI": "코트디부아르",
-        "Country_CK": "쿡제도",
+        "Country_CK": "쿡 제도",
         "Country_CL": "ì¹ ë ˆ",
         "Country_CM": "카메룬",
         "Country_CN": "중국",
@@ -76,7 +76,7 @@
         "Country_EH": "서사하라",
         "Country_ER": "에리트리아",
         "Country_ES": "스페인",
-        "Country_ET": "이디오피아",
+        "Country_ET": "에티오피아",
         "Country_FI": "핀란드",
         "Country_FJ": "피지",
         "Country_FK": "포클랜드 제도",
@@ -102,7 +102,7 @@
         "Country_GU": "괌",
         "Country_GW": "기니비사우",
         "Country_GY": "가이아나",
-        "Country_HK": "홍콩, 중국 특별행정구",
+        "Country_HK": "홍콩(중국 특별행정구)",
         "Country_HM": "허드 맥도널드 제도",
         "Country_HN": "온두라스",
         "Country_HR": "크로아티아",
@@ -131,7 +131,7 @@
         "Country_KP": "조선민주주의인민공화국",
         "Country_KR": "대한민국",
         "Country_KW": "쿠웨이트",
-        "Country_KY": "케이맨제도",
+        "Country_KY": "케이맨 제도",
         "Country_KZ": "카자흐스탄",
         "Country_LA": "라오스",
         "Country_LB": "레바논",
@@ -148,14 +148,14 @@
         "Country_MC": "모나코",
         "Country_MD": "몰도바",
         "Country_ME": "몬테네그로",
-        "Country_MF": "생 마르탱",
+        "Country_MF": "생마르탱",
         "Country_MG": "마다가스카르",
-        "Country_MH": "마샬 군도",
+        "Country_MH": "마셜 제도",
         "Country_MK": "마케도니아",
         "Country_ML": "말리",
         "Country_MM": "미얀마",
         "Country_MN": "몽골",
-        "Country_MO": "마카오, 중국 특별행정구",
+        "Country_MO": "마카오(중국 특별행정구)",
         "Country_MP": "북마리아나제도",
         "Country_MQ": "마르티니크",
         "Country_MR": "모리타니",
@@ -243,7 +243,7 @@
         "Country_US": "미국",
         "Country_UY": "우루과이",
         "Country_UZ": "우즈베키스탄",
-        "Country_VA": "바티칸시국",
+        "Country_VA": "바티칸 시국",
         "Country_VC": "세인트빈센트그레나딘",
         "Country_VE": "베네수엘라",
         "Country_VG": "영국령 버진아일랜드",
@@ -324,7 +324,7 @@
         "Language_am": "암하라어",
         "Language_an": "아라곤어",
         "Language_ar": "아랍어",
-        "Language_as": "아샘어",
+        "Language_as": "아삼어",
         "Language_av": "아바릭어",
         "Language_ay": "아이마라어",
         "Language_az": "아제르바이잔어",
@@ -363,7 +363,7 @@
         "Language_fj": "피지어",
         "Language_fo": "페로어",
         "Language_fr": "프랑스어",
-        "Language_fy": "프리지아어",
+        "Language_fy": "서프리지아어",
         "Language_ga": "아일랜드어",
         "Language_gd": "스코틀랜드 게일어",
         "Language_gl": "갈리시아어",
@@ -447,7 +447,7 @@
         "Language_ps": "파슈토어",
         "Language_pt": "포르투갈어",
         "Language_qu": "케추아어",
-        "Language_rm": "레토로만어",
+        "Language_rm": "로만시어",
         "Language_rn": "룬디어",
         "Language_ro": "루마니아어",
         "Language_ru": "러시아어",
@@ -492,7 +492,7 @@
         "Language_vi": "베트남어",
         "Language_vo": "볼라퓌크어",
         "Language_wa": "왈론어",
-        "Language_wo": "올로프어",
+        "Language_wo": "월로프어",
         "Language_xh": "코사어",
         "Language_yi": "이디시어",
         "Language_yo": "요루바어",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s분",
         "NSeconds": "%sì´ˆ",
         "NSecondsShort": "%sì´ˆ",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1일",
         "OneMinute": "1분",
         "OneMinuteShort": "1분",
diff --git a/plugins/Intl/lang/lt.json b/plugins/Intl/lang/lt.json
index f41cb594c2b306cdc0af48ee2b9e73a018dba1f6..7dc87c76a14896cca2a12937e42286f3c7ca3178 100644
--- a/plugins/Intl/lang/lt.json
+++ b/plugins/Intl/lang/lt.json
@@ -308,10 +308,10 @@
         "Format_Interval_Long_D": "y MMMM d–d",
         "Format_Interval_Long_M": "y MMMM d – MMMM d",
         "Format_Interval_Long_Y": "y MMMM d – y MMMM d",
-        "Format_Interval_Short_D": "y-MM-dd – y-MM-dd",
-        "Format_Interval_Short_M": "y-MM-dd – y-MM-dd",
-        "Format_Interval_Short_Y": "y-MM-dd – y-MM-dd",
-        "Format_Month_Long": "y LLLL",
+        "Format_Interval_Short_D": "y MMM d–d",
+        "Format_Interval_Short_M": "y MMM d – MMM d",
+        "Format_Interval_Short_Y": "y MMM d – y MMM d",
+        "Format_Month_Long": "y 'm'. LLLL",
         "Format_Month_Short": "y-MM",
         "Format_Time": "HH:mm:ss",
         "Format_Year": "y",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min.",
         "NSeconds": "%s sekundžių",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 diena",
         "OneMinute": "1 minutÄ—",
         "OneMinuteShort": "1 min.",
         "OriginalLanguageName": "Lietuvių",
-        "PeriodDay": "Diena",
+        "PeriodDay": "diena",
         "PeriodDays": "dienos",
-        "PeriodMonth": "MÄ—nuo",
+        "PeriodMonth": "mÄ—nuo",
         "PeriodMonths": "mÄ—nesiai",
-        "PeriodWeek": "SavaitÄ—",
+        "PeriodWeek": "savaitÄ—",
         "PeriodWeeks": "savaitÄ—s",
-        "PeriodYear": "Metai",
+        "PeriodYear": "metai",
         "PeriodYears": "metai",
         "Seconds": "sekundÄ—s",
         "Time_AM": "priešpiet",
diff --git a/plugins/Intl/lang/lv.json b/plugins/Intl/lang/lv.json
index 99c485e289958bb9dc625fcd0654ae64dcd04f15..2a91a4b6fb7fa59a5d1acfa1586991c586fea698 100644
--- a/plugins/Intl/lang/lv.json
+++ b/plugins/Intl/lang/lv.json
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min.",
         "NSeconds": "%s sekundes",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 diena",
         "OneMinute": "1 minūte",
         "OneMinuteShort": "1 min.",
         "OriginalLanguageName": "Latviešu",
         "PeriodDay": "diena",
         "PeriodDays": "dienas",
-        "PeriodMonth": "MÄ“nesis",
+        "PeriodMonth": "mēnesis",
         "PeriodMonths": "mēneši",
         "PeriodWeek": "nedēļa",
         "PeriodWeeks": "nedēļas",
-        "PeriodYear": "Gads",
+        "PeriodYear": "gads",
         "PeriodYears": "gadi",
         "Seconds": "sekundes",
         "Time_AM": "priekšpusdienā",
diff --git a/plugins/Intl/lang/nb.json b/plugins/Intl/lang/nb.json
index 21d1a4ba6c3cb10c986f3208f57a589c81e1f8b5..84d427bd0b4cfb4075621b1ed75b6304d95b201a 100644
--- a/plugins/Intl/lang/nb.json
+++ b/plugins/Intl/lang/nb.json
@@ -292,13 +292,13 @@
         "Day_Short_5": "Fre.",
         "Day_Short_6": "Lør.",
         "Day_Short_7": "Søn.",
-        "Day_Short_StandAlone_1": "Ma.",
-        "Day_Short_StandAlone_2": "Ti.",
-        "Day_Short_StandAlone_3": "On.",
-        "Day_Short_StandAlone_4": "To.",
-        "Day_Short_StandAlone_5": "Fr.",
-        "Day_Short_StandAlone_6": "Lø.",
-        "Day_Short_StandAlone_7": "Sø.",
+        "Day_Short_StandAlone_1": "Man.",
+        "Day_Short_StandAlone_2": "Tir.",
+        "Day_Short_StandAlone_3": "Ons.",
+        "Day_Short_StandAlone_4": "Tor.",
+        "Day_Short_StandAlone_5": "Fre.",
+        "Day_Short_StandAlone_6": "Lør.",
+        "Day_Short_StandAlone_7": "Søn.",
         "EnglishLanguageName": "Norwegian Bokmål",
         "Format_DateTime_Long": "EEEE d. MMMM y HH.mm.ss",
         "Format_DateTime_Short": "d. MMM y HH.mm.ss",
@@ -344,7 +344,7 @@
         "Language_cr": "Cree",
         "Language_cs": "Tsjekkisk",
         "Language_cu": "Kirkeslavisk",
-        "Language_cv": "Tsjuvansk",
+        "Language_cv": "Tsjuvasjisk",
         "Language_cy": "Walisisk",
         "Language_da": "Dansk",
         "Language_de": "Tysk",
@@ -415,7 +415,7 @@
         "Language_lt": "Litauisk",
         "Language_lu": "Luba-katanga",
         "Language_lv": "Latvisk",
-        "Language_mg": "Madagassisk",
+        "Language_mg": "Gassisk",
         "Language_mh": "Marshallesisk",
         "Language_mi": "Maori",
         "Language_mk": "Makedonsk",
@@ -470,7 +470,7 @@
         "Language_su": "Sundanesisk",
         "Language_sv": "Svensk",
         "Language_sw": "Swahili",
-        "Language_ta": "Tamilsk",
+        "Language_ta": "Tamil",
         "Language_te": "Telugu",
         "Language_tg": "Tadsjikisk",
         "Language_th": "Thai",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekunder",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "¤ #,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 døgn",
         "OneMinute": "1 minutt",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Norsk bokmål",
-        "PeriodDay": "Dag",
+        "PeriodDay": "dag",
         "PeriodDays": "døgn",
-        "PeriodMonth": "MÃ¥ned",
+        "PeriodMonth": "måned",
         "PeriodMonths": "måneder",
-        "PeriodWeek": "Uke",
+        "PeriodWeek": "uke",
         "PeriodWeeks": "uker",
-        "PeriodYear": "Ã…r",
+        "PeriodYear": "Ã¥r",
         "PeriodYears": "Ã¥r",
         "Seconds": "sekunder",
         "Time_AM": "a.m.",
diff --git a/plugins/Intl/lang/nl.json b/plugins/Intl/lang/nl.json
index e3f6c279a99c03be48494c08cb2f29411ea3582f..8c9cfa595392ff2f106ffa37a58ef2b33cbd1deb 100644
--- a/plugins/Intl/lang/nl.json
+++ b/plugins/Intl/lang/nl.json
@@ -43,7 +43,7 @@
         "Country_BT": "Bhutan",
         "Country_BV": "Bouveteiland",
         "Country_BW": "Botswana",
-        "Country_BY": "Wit-Rusland",
+        "Country_BY": "Belarus",
         "Country_BZ": "Belize",
         "Country_CA": "Canada",
         "Country_CC": "Cocoseilanden",
@@ -223,7 +223,7 @@
         "Country_SZ": "Swaziland",
         "Country_TC": "Turks- en Caicoseilanden",
         "Country_TD": "Tsjaad",
-        "Country_TF": "Franse Zuidelijke Gebieden",
+        "Country_TF": "Franse Gebieden in de zuidelijke Indische Oceaan",
         "Country_TG": "Togo",
         "Country_TH": "Thailand",
         "Country_TJ": "Tadzjikistan",
@@ -473,7 +473,7 @@
         "Language_ta": "Tamil",
         "Language_te": "Telugu",
         "Language_tg": "Tadzjieks",
-        "Language_th": "Thais",
+        "Language_th": "Thai",
         "Language_ti": "Tigrinya",
         "Language_tk": "Turkmeens",
         "Language_tl": "Tagalog",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s seconden",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "¤ #,##0.00;¤ -#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dag",
         "OneMinute": "1 minuut",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Nederlands",
-        "PeriodDay": "Dag",
+        "PeriodDay": "dag",
         "PeriodDays": "dagen",
-        "PeriodMonth": "Maand",
+        "PeriodMonth": "maand",
         "PeriodMonths": "maanden",
-        "PeriodWeek": "Week",
+        "PeriodWeek": "week",
         "PeriodWeeks": "weken",
-        "PeriodYear": "Jaar",
+        "PeriodYear": "jaar",
         "PeriodYears": "jaar",
         "Seconds": "seconden",
         "Time_AM": "a.m.",
diff --git a/plugins/Intl/lang/nn.json b/plugins/Intl/lang/nn.json
index 860fdaf1d7b4f946fa9d6d0531c27582872f07f2..6f913f08ead4cd6a48989e76fdec6c850f28f57c 100644
--- a/plugins/Intl/lang/nn.json
+++ b/plugins/Intl/lang/nn.json
@@ -551,6 +551,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s s",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 d",
         "OneMinute": "1 min",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/pl.json b/plugins/Intl/lang/pl.json
index f3b23056a5bd0df0ae5dd264d10d99892092dbe6..7183cd5cbcc994107fd7fe4865cc829d4d51707d 100644
--- a/plugins/Intl/lang/pl.json
+++ b/plugins/Intl/lang/pl.json
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekundy",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dzień",
         "OneMinute": "1 minuta",
         "OneMinuteShort": "1 min",
diff --git a/plugins/Intl/lang/pt-br.json b/plugins/Intl/lang/pt-br.json
index 500ac319c5926e7b09233e31e45ad9a9fc6acdfe..4e934e942dea2888ba10afbed5f608a1ba6ae1c4 100644
--- a/plugins/Intl/lang/pt-br.json
+++ b/plugins/Intl/lang/pt-br.json
@@ -344,7 +344,7 @@
         "Language_cr": "Cree",
         "Language_cs": "Tcheco",
         "Language_cu": "Eslavo eclesiástico",
-        "Language_cv": "Chuvash",
+        "Language_cv": "Tchuvache",
         "Language_cy": "Galês",
         "Language_da": "Dinamarquês",
         "Language_de": "Alemão",
@@ -451,7 +451,7 @@
         "Language_rn": "Rundi",
         "Language_ro": "Romeno",
         "Language_ru": "Russo",
-        "Language_rw": "Kinyarwanda",
+        "Language_rw": "Quiniaruanda",
         "Language_sa": "Sânscrito",
         "Language_sc": "Sardo",
         "Language_sd": "Sindi",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segundos",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dia",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Português do Brasil",
-        "PeriodDay": "Dia",
+        "PeriodDay": "dia",
         "PeriodDays": "dias",
-        "PeriodMonth": "Mês",
+        "PeriodMonth": "mês",
         "PeriodMonths": "meses",
-        "PeriodWeek": "Semana",
+        "PeriodWeek": "semana",
         "PeriodWeeks": "semanas",
-        "PeriodYear": "Ano",
+        "PeriodYear": "ano",
         "PeriodYears": "anos",
         "Seconds": "segundos",
         "Time_AM": "AM",
diff --git a/plugins/Intl/lang/pt.json b/plugins/Intl/lang/pt.json
index 5dbf6f299a9ffd32deb55532db7ea2dd5a2623fb..bacafa576db44460eab38d80dde2575ec7530873 100644
--- a/plugins/Intl/lang/pt.json
+++ b/plugins/Intl/lang/pt.json
@@ -22,11 +22,11 @@
         "Country_AT": "Áustria",
         "Country_AU": "Austrália",
         "Country_AW": "Aruba",
-        "Country_AX": "Ilhas Ã…land",
+        "Country_AX": "Alanda",
         "Country_AZ": "Azerbaijão",
         "Country_BA": "Bósnia e Herzegovina",
         "Country_BB": "Barbados",
-        "Country_BD": "Bangladesh",
+        "Country_BD": "Bangladeche",
         "Country_BE": "Bélgica",
         "Country_BF": "Burquina Faso",
         "Country_BG": "Bulgária",
@@ -39,14 +39,14 @@
         "Country_BO": "Bolívia",
         "Country_BQ": "Países Baixos Caribenhos",
         "Country_BR": "Brasil",
-        "Country_BS": "Bahamas",
+        "Country_BS": "Baamas",
         "Country_BT": "Butão",
         "Country_BV": "Ilha Bouvet",
         "Country_BW": "Botsuana",
         "Country_BY": "Bielorrússia",
         "Country_BZ": "Belize",
         "Country_CA": "Canadá",
-        "Country_CC": "Ilhas Cocos (Keeling)",
+        "Country_CC": "Ilhas dos Cocos (Keeling)",
         "Country_CD": "Congo-Kinshasa",
         "Country_CF": "República Centro-Africana",
         "Country_CG": "Congo-Brazzaville",
@@ -61,11 +61,11 @@
         "Country_CU": "Cuba",
         "Country_CV": "Cabo Verde",
         "Country_CW": "Curaçau",
-        "Country_CX": "Ilha Christmas",
+        "Country_CX": "Ilha do Natal",
         "Country_CY": "Chipre",
         "Country_CZ": "República Checa",
         "Country_DE": "Alemanha",
-        "Country_DJ": "Djibuti",
+        "Country_DJ": "Jibuti",
         "Country_DK": "Dinamarca",
         "Country_DM": "Domínica",
         "Country_DO": "República Dominicana",
@@ -127,7 +127,7 @@
         "Country_KH": "Camboja",
         "Country_KI": "Quiribati",
         "Country_KM": "Comores",
-        "Country_KN": "São Cristóvão e Nevis",
+        "Country_KN": "São Cristóvão e Neves",
         "Country_KP": "Coreia do Norte",
         "Country_KR": "Coreia do Sul",
         "Country_KW": "Kuwait",
@@ -136,8 +136,8 @@
         "Country_LA": "Laos",
         "Country_LB": "Líbano",
         "Country_LC": "Santa Lúcia",
-        "Country_LI": "Liechtenstein",
-        "Country_LK": "Sri Lanka",
+        "Country_LI": "Listenstaine",
+        "Country_LK": "Sri Lanca",
         "Country_LR": "Libéria",
         "Country_LS": "Lesoto",
         "Country_LT": "Lituânia",
@@ -163,7 +163,7 @@
         "Country_MT": "Malta",
         "Country_MU": "Maurícia",
         "Country_MV": "Maldivas",
-        "Country_MW": "Malawi",
+        "Country_MW": "Maláui",
         "Country_MX": "México",
         "Country_MY": "Malásia",
         "Country_MZ": "Moçambique",
@@ -173,7 +173,7 @@
         "Country_NF": "Ilha Norfolk",
         "Country_NG": "Nigéria",
         "Country_NI": "Nicarágua",
-        "Country_NL": "Holanda",
+        "Country_NL": "Países Baixos",
         "Country_NO": "Noruega",
         "Country_NP": "Nepal",
         "Country_NR": "Nauru",
@@ -187,8 +187,8 @@
         "Country_PH": "Filipinas",
         "Country_PK": "Paquistão",
         "Country_PL": "Polónia",
-        "Country_PM": "Saint Pierre e Miquelon",
-        "Country_PN": "Pitcairn",
+        "Country_PM": "São Pedro e Miquelão",
+        "Country_PN": "Ilhas Pitcairn",
         "Country_PR": "Porto Rico",
         "Country_PS": "Territórios palestinianos",
         "Country_PT": "Portugal",
@@ -211,17 +211,17 @@
         "Country_SJ": "Svalbard e Jan Mayen",
         "Country_SK": "Eslováquia",
         "Country_SL": "Serra Leoa",
-        "Country_SM": "São Marino",
+        "Country_SM": "São Marinho",
         "Country_SN": "Senegal",
         "Country_SO": "Somália",
         "Country_SR": "Suriname",
         "Country_SS": "Sudão do Sul",
         "Country_ST": "São Tomé e Príncipe",
-        "Country_SV": "El Salvador",
+        "Country_SV": "Salvador",
         "Country_SX": "Sint Maarten",
         "Country_SY": "Síria",
         "Country_SZ": "Suazilândia",
-        "Country_TC": "Ilhas Turks e Caicos",
+        "Country_TC": "Ilhas Turcas e Caicos",
         "Country_TD": "Chade",
         "Country_TF": "Territórios Franceses do Sul",
         "Country_TG": "Togo",
@@ -239,10 +239,10 @@
         "Country_TZ": "Tanzânia",
         "Country_UA": "Ucrânia",
         "Country_UG": "Uganda",
-        "Country_UM": "Ilhas Menores Distantes dos EUA",
+        "Country_UM": "Ilhas Menores Afastadas dos EUA",
         "Country_US": "Estados Unidos",
         "Country_UY": "Uruguai",
-        "Country_UZ": "Uzbequistão",
+        "Country_UZ": "Usbequistão",
         "Country_VA": "Cidade do Vaticano",
         "Country_VC": "São Vicente e Granadinas",
         "Country_VE": "Venezuela",
@@ -285,20 +285,20 @@
         "Day_Min_StandAlone_5": "Sex",
         "Day_Min_StandAlone_6": "Sáb",
         "Day_Min_StandAlone_7": "Dom",
-        "Day_Short_1": "Seg",
-        "Day_Short_2": "Ter",
-        "Day_Short_3": "Qua",
-        "Day_Short_4": "Qui",
-        "Day_Short_5": "Sex",
-        "Day_Short_6": "Sáb",
-        "Day_Short_7": "Dom",
-        "Day_Short_StandAlone_1": "Seg",
-        "Day_Short_StandAlone_2": "Ter",
-        "Day_Short_StandAlone_3": "Qua",
-        "Day_Short_StandAlone_4": "Qui",
-        "Day_Short_StandAlone_5": "Sex",
-        "Day_Short_StandAlone_6": "Sáb",
-        "Day_Short_StandAlone_7": "Dom",
+        "Day_Short_1": "Segunda",
+        "Day_Short_2": "Terça",
+        "Day_Short_3": "Quarta",
+        "Day_Short_4": "Quinta",
+        "Day_Short_5": "Sexta",
+        "Day_Short_6": "Sábado",
+        "Day_Short_7": "Domingo",
+        "Day_Short_StandAlone_1": "Segunda",
+        "Day_Short_StandAlone_2": "Terça",
+        "Day_Short_StandAlone_3": "Quarta",
+        "Day_Short_StandAlone_4": "Quinta",
+        "Day_Short_StandAlone_5": "Sexta",
+        "Day_Short_StandAlone_6": "Sábado",
+        "Day_Short_StandAlone_7": "Domingo",
         "EnglishLanguageName": "Portuguese",
         "Format_DateTime_Long": "EEEE, d 'de' MMMM 'de' y HH:mm:ss",
         "Format_DateTime_Short": "dd\/MM\/y HH:mm:ss",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s segundos",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dia",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Português",
-        "PeriodDay": "Dia",
+        "PeriodDay": "dia",
         "PeriodDays": "dias",
-        "PeriodMonth": "Mês",
+        "PeriodMonth": "mês",
         "PeriodMonths": "meses",
-        "PeriodWeek": "Semana",
+        "PeriodWeek": "semana",
         "PeriodWeeks": "semanas",
-        "PeriodYear": "Ano",
+        "PeriodYear": "ano",
         "PeriodYears": "anos",
         "Seconds": "segundos",
         "Time_AM": "da manhã",
diff --git a/plugins/Intl/lang/ro.json b/plugins/Intl/lang/ro.json
index bb805dd6564a80741c9016b127a2300528c722e1..2e8973de3017c8ed8b9c2477d1d01e9f4032db7c 100644
--- a/plugins/Intl/lang/ro.json
+++ b/plugins/Intl/lang/ro.json
@@ -165,12 +165,12 @@
         "Country_MV": "Maldive",
         "Country_MW": "Malawi",
         "Country_MX": "Mexic",
-        "Country_MY": "Malaezia",
+        "Country_MY": "Malaysia",
         "Country_MZ": "Mozambic",
         "Country_NA": "Namibia",
         "Country_NC": "Noua Caledonie",
         "Country_NE": "Niger",
-        "Country_NF": "Insulele Norfolk",
+        "Country_NF": "Insula Norfolk",
         "Country_NG": "Nigeria",
         "Country_NI": "Nicaragua",
         "Country_NL": "Țările de Jos",
@@ -214,7 +214,7 @@
         "Country_SM": "San Marino",
         "Country_SN": "Senegal",
         "Country_SO": "Somalia",
-        "Country_SR": "Surinam",
+        "Country_SR": "Suriname",
         "Country_SS": "Sudanul de Sud",
         "Country_ST": "Sao Tome și Principe",
         "Country_SV": "El Salvador",
@@ -244,7 +244,7 @@
         "Country_UY": "Uruguay",
         "Country_UZ": "Uzbekistan",
         "Country_VA": "Statul Cetății Vaticanului",
-        "Country_VC": "Saint Vincent și Grenadine",
+        "Country_VC": "Saint Vincent și Grenadinele",
         "Country_VE": "Venezuela",
         "Country_VG": "Insulele Virgine Britanice",
         "Country_VI": "Insulele Virgine S.U.A.",
@@ -271,13 +271,13 @@
         "Day_Long_StandAlone_5": "Vineri",
         "Day_Long_StandAlone_6": "Sâmbătă",
         "Day_Long_StandAlone_7": "Duminică",
-        "Day_Min_1": "Lu",
-        "Day_Min_2": "Ma",
-        "Day_Min_3": "Mi",
-        "Day_Min_4": "Jo",
-        "Day_Min_5": "Vi",
-        "Day_Min_6": "Sâ",
-        "Day_Min_7": "Du",
+        "Day_Min_1": "Lu.",
+        "Day_Min_2": "Ma.",
+        "Day_Min_3": "Mi.",
+        "Day_Min_4": "Jo.",
+        "Day_Min_5": "Vi.",
+        "Day_Min_6": "Sâ.",
+        "Day_Min_7": "Du.",
         "Day_Min_StandAlone_1": "Lu",
         "Day_Min_StandAlone_2": "Ma",
         "Day_Min_StandAlone_3": "Mi",
@@ -285,20 +285,20 @@
         "Day_Min_StandAlone_5": "Vi",
         "Day_Min_StandAlone_6": "Sâ",
         "Day_Min_StandAlone_7": "Du",
-        "Day_Short_1": "Lun",
-        "Day_Short_2": "Mar",
-        "Day_Short_3": "Mie",
+        "Day_Short_1": "Lun.",
+        "Day_Short_2": "Mar.",
+        "Day_Short_3": "Mie.",
         "Day_Short_4": "Joi",
-        "Day_Short_5": "Vin",
-        "Day_Short_6": "Sâm",
-        "Day_Short_7": "Dum",
-        "Day_Short_StandAlone_1": "Lun",
-        "Day_Short_StandAlone_2": "Mar",
-        "Day_Short_StandAlone_3": "Mie",
+        "Day_Short_5": "Vin.",
+        "Day_Short_6": "Sâm.",
+        "Day_Short_7": "Dum.",
+        "Day_Short_StandAlone_1": "Lun.",
+        "Day_Short_StandAlone_2": "Mar.",
+        "Day_Short_StandAlone_3": "Mie.",
         "Day_Short_StandAlone_4": "Joi",
-        "Day_Short_StandAlone_5": "Vin",
-        "Day_Short_StandAlone_6": "Sâm",
-        "Day_Short_StandAlone_7": "Dum",
+        "Day_Short_StandAlone_5": "Vin.",
+        "Day_Short_StandAlone_6": "Sâm.",
+        "Day_Short_StandAlone_7": "Dum.",
         "EnglishLanguageName": "Romanian",
         "Format_DateTime_Long": "EEEE, d MMMM y HH:mm:ss",
         "Format_DateTime_Short": "d MMM y HH:mm:ss",
@@ -430,7 +430,7 @@
         "Language_nd": "Ndebele de nord",
         "Language_ne": "Nepaleză",
         "Language_ng": "Ndonga",
-        "Language_nl": "Olandeză",
+        "Language_nl": "Neerlandeză",
         "Language_nn": "Norvegiană nynorsk",
         "Language_no": "Norvegiană",
         "Language_nr": "Ndebele de sud",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min.",
         "NSeconds": "%s de secunde",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 zi",
         "OneMinute": "1 minut",
         "OneMinuteShort": "1 min.",
diff --git a/plugins/Intl/lang/ru.json b/plugins/Intl/lang/ru.json
index d6247dba3705a50f543f10e7e1ffa5f2f48956a6..b26d8829715701463e1ed4282bc85ffb2ab74ac1 100644
--- a/plugins/Intl/lang/ru.json
+++ b/plugins/Intl/lang/ru.json
@@ -102,7 +102,7 @@
         "Country_GU": "Гуам",
         "Country_GW": "Гвинея-Бисау",
         "Country_GY": "Гайана",
-        "Country_HK": "Гонконг (особый район)",
+        "Country_HK": "Гонконг (специальный административный район)",
         "Country_HM": "О-ва Херд и Макдональд",
         "Country_HN": "Гондурас",
         "Country_HR": "Хорватия",
@@ -155,7 +155,7 @@
         "Country_ML": "Мали",
         "Country_MM": "Мьянма (Бирма)",
         "Country_MN": "Монголия",
-        "Country_MO": "Макао (особый район)",
+        "Country_MO": "Макао (специальный административный район)",
         "Country_MP": "Северные Марианские о-ва",
         "Country_MQ": "Мартиника",
         "Country_MR": "Мавритания",
@@ -188,7 +188,7 @@
         "Country_PK": "Пакистан",
         "Country_PL": "Польша",
         "Country_PM": "Сен-Пьер и Микелон",
-        "Country_PN": "Питкерн",
+        "Country_PN": "Острова Питкэрн",
         "Country_PR": "Пуэрто-Рико",
         "Country_PS": "Палестинские территории",
         "Country_PT": "Португалия",
@@ -311,8 +311,8 @@
         "Format_Interval_Short_D": "d–d MMM y 'г'.",
         "Format_Interval_Short_M": "d MMM – d MMM y 'г'.",
         "Format_Interval_Short_Y": "d MMM y – d MMM y 'г'.",
-        "Format_Month_Long": "LLLL y",
-        "Format_Month_Short": "LLL y",
+        "Format_Month_Long": "LLLL y 'г'.",
+        "Format_Month_Short": "LLL y 'г'.",
         "Format_Time": "H:mm:ss",
         "Format_Year": "y",
         "Hours": "часы",
@@ -430,7 +430,7 @@
         "Language_nd": "Северный ндебели",
         "Language_ne": "Непальский",
         "Language_ng": "Ндонга",
-        "Language_nl": "Голландский",
+        "Language_nl": "Нидерландский",
         "Language_nn": "Норвежский нюнорск",
         "Language_no": "Норвежский",
         "Language_nr": "Ндебели южный",
@@ -530,11 +530,11 @@
         "Month_Short_11": "Нояб.",
         "Month_Short_12": "Дек.",
         "Month_Short_2": "Февр.",
-        "Month_Short_3": "Марта",
+        "Month_Short_3": "Мар.",
         "Month_Short_4": "Апр.",
         "Month_Short_5": "Мая",
-        "Month_Short_6": "Июня",
-        "Month_Short_7": "Июля",
+        "Month_Short_6": "Июн.",
+        "Month_Short_7": "Июл.",
         "Month_Short_8": "Авг.",
         "Month_Short_9": "Сент.",
         "Month_Short_StandAlone_1": "Янв.",
@@ -555,21 +555,29 @@
         "NMinutesShort": "%s мин",
         "NSeconds": "%s секунды",
         "NSecondsShort": "%s с",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 день",
         "OneMinute": "1 минута",
         "OneMinuteShort": "1 мин",
         "OriginalLanguageName": "Русский",
-        "PeriodDay": "День",
+        "PeriodDay": "день",
         "PeriodDays": "дни",
-        "PeriodMonth": "Месяц",
+        "PeriodMonth": "месяц",
         "PeriodMonths": "месяцы",
-        "PeriodWeek": "Неделя",
+        "PeriodWeek": "неделя",
         "PeriodWeeks": "недели",
-        "PeriodYear": "Год",
+        "PeriodYear": "год",
         "PeriodYears": "годы",
         "Seconds": "секунды",
-        "Time_AM": "AM",
-        "Time_PM": "PM",
+        "Time_AM": "ДП",
+        "Time_PM": "ПП",
         "Today": "Сегодня",
         "Year_Short": "г.",
         "Yesterday": "Вчера"
diff --git a/plugins/Intl/lang/sk.json b/plugins/Intl/lang/sk.json
index 7d8482f6fe0ae6fd7b9291405da69a1a4612e217..d926c8f1bd6874b7c2f297504ff04a28a2d7f68b 100644
--- a/plugins/Intl/lang/sk.json
+++ b/plugins/Intl/lang/sk.json
@@ -302,17 +302,17 @@
         "EnglishLanguageName": "Slovak",
         "Format_DateTime_Long": "EEEE, d. MMMM y H:mm:ss",
         "Format_DateTime_Short": "d. M. y H:mm:ss",
-        "Format_Date_Day_Month": "E, d. M.",
+        "Format_Date_Day_Month": "E d. M.",
         "Format_Date_Long": "EEEE, d. MMMM y",
         "Format_Date_Short": "d. M. y",
-        "Format_Interval_Long_D": "d. – d. MMMM y",
-        "Format_Interval_Long_M": "y MMMM d – MMMM d",
-        "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y",
-        "Format_Interval_Short_D": "d. – d. MMM y",
-        "Format_Interval_Short_M": "y MMM d – MMM d",
-        "Format_Interval_Short_Y": "d. MMM y – d. MMM y",
+        "Format_Interval_Long_D": "d. – d. M. y",
+        "Format_Interval_Long_M": "d. M. – d. M. y",
+        "Format_Interval_Long_Y": "d. M. y – d. M. y",
+        "Format_Interval_Short_D": "d. – d. M. y",
+        "Format_Interval_Short_M": "d. M. – d. M. y",
+        "Format_Interval_Short_Y": "d. M. y – d. M. y",
         "Format_Month_Long": "LLLL y",
-        "Format_Month_Short": "LLLL y",
+        "Format_Month_Short": "M\/y",
         "Format_Time": "H:mm:ss",
         "Format_Year": "y",
         "Hours": "hodiny",
@@ -350,7 +350,7 @@
         "Language_de": "Nemčina",
         "Language_dv": "Divehi",
         "Language_dz": "Dzongkä",
-        "Language_ee": "Ewe",
+        "Language_ee": "Eweština",
         "Language_el": "Gréčtina",
         "Language_en": "Angličtina",
         "Language_eo": "Esperanto",
@@ -367,7 +367,7 @@
         "Language_ga": "Írčina",
         "Language_gd": "Škótska gaelčina",
         "Language_gl": "Galícijčina",
-        "Language_gn": "Guaraní",
+        "Language_gn": "Guaraníjčina",
         "Language_gu": "Gudžarátčina",
         "Language_gv": "Mančina",
         "Language_ha": "Hauština",
@@ -413,7 +413,7 @@
         "Language_ln": "Lingalčina",
         "Language_lo": "Laoština",
         "Language_lt": "Litovčina",
-        "Language_lu": "Luba-katanga",
+        "Language_lu": "Lubčina (katanžská)",
         "Language_lv": "Lotyština",
         "Language_mg": "Malgaština",
         "Language_mh": "Kajin-majol",
@@ -426,12 +426,12 @@
         "Language_mt": "Maltčina",
         "Language_my": "Barmčina",
         "Language_na": "Nauru",
-        "Language_nb": "Nórsky bokmål",
+        "Language_nb": "Nórčina (bokmål)",
         "Language_nd": "Severné ndebele",
         "Language_ne": "Nepálčina",
         "Language_ng": "Ndonga",
         "Language_nl": "Holandčina",
-        "Language_nn": "Nórsky nynorsk",
+        "Language_nn": "Nórčina (nynorsk)",
         "Language_no": "Nórčina",
         "Language_nr": "Južná ndebelčina",
         "Language_nv": "Navajo",
@@ -455,7 +455,7 @@
         "Language_sa": "Sanskrit",
         "Language_sc": "Sardínčina",
         "Language_sd": "Sindhčina",
-        "Language_se": "Severné sami",
+        "Language_se": "Lapončina (severná)",
         "Language_sg": "Sango",
         "Language_si": "Sinhalčina",
         "Language_sk": "Slovenčina",
@@ -492,8 +492,8 @@
         "Language_vi": "Vietnamčina",
         "Language_vo": "Volapük",
         "Language_wa": "Valónčina",
-        "Language_wo": "Wolof",
-        "Language_xh": "Xhosa",
+        "Language_wo": "Wolofčina",
+        "Language_xh": "Xhoština",
         "Language_yi": "Jidiš",
         "Language_yo": "Jorubčina",
         "Language_za": "Čuangčina",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekúnd",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 deň",
         "OneMinute": "1 minúta",
         "OneMinuteShort": "1 min",
@@ -568,8 +576,8 @@
         "PeriodYear": "rok",
         "PeriodYears": "roky",
         "Seconds": "sekundy",
-        "Time_AM": "dopoludnia",
-        "Time_PM": "odpoludnia",
+        "Time_AM": "AM",
+        "Time_PM": "PM",
         "Today": "Dnes",
         "Year_Short": "r.",
         "Yesterday": "Včera"
diff --git a/plugins/Intl/lang/sl.json b/plugins/Intl/lang/sl.json
index 8b418062b6a0cc276a6c590f162ae450da820366..054f53ca8b1c4302a05f40621c596a30aff08eda 100644
--- a/plugins/Intl/lang/sl.json
+++ b/plugins/Intl/lang/sl.json
@@ -306,11 +306,11 @@
         "Format_Date_Long": "EEEE, dd. MMMM y",
         "Format_Date_Short": "d. MMM y",
         "Format_Interval_Long_D": "d.–d. MMMM y",
-        "Format_Interval_Long_M": "d. MMMM – d. MMMM y",
-        "Format_Interval_Long_Y": "d. MMMM y – d. MMMM y",
+        "Format_Interval_Long_M": "d. MMMM–d. MMMM y",
+        "Format_Interval_Long_Y": "d. MMMM y–d. MMMM y",
         "Format_Interval_Short_D": "d.–d. MMM y",
-        "Format_Interval_Short_M": "d. MMM – d. MMM y",
-        "Format_Interval_Short_Y": "d. MMM y – d. MMM y",
+        "Format_Interval_Short_M": "d. MMM–d. MMM y",
+        "Format_Interval_Short_Y": "d. MMM y–d. MMM y",
         "Format_Month_Long": "MMMM y",
         "Format_Month_Short": "MMM y",
         "Format_Time": "HH:mm:ss",
@@ -492,7 +492,7 @@
         "Language_vo": "Volapuk",
         "Language_wa": "Valonščina",
         "Language_wo": "Volofščina",
-        "Language_xh": "Xhosa",
+        "Language_xh": "Koščina",
         "Language_yi": "Jidiš",
         "Language_yo": "Jorubščina",
         "Language_zh": "Kitajščina",
@@ -553,17 +553,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekund",
         "NSecondsShort": "%s s",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dan",
         "OneMinute": "1 minuta",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Slovenščina",
         "PeriodDay": "Dan",
         "PeriodDays": "dni",
-        "PeriodMonth": "Mesec",
+        "PeriodMonth": "mesec",
         "PeriodMonths": "mesecev",
-        "PeriodWeek": "Teden",
+        "PeriodWeek": "teden",
         "PeriodWeeks": "tednov",
-        "PeriodYear": "Leto",
+        "PeriodYear": "leto",
         "PeriodYears": "let",
         "Seconds": "sekund",
         "Time_AM": "dop.",
diff --git a/plugins/Intl/lang/sq.json b/plugins/Intl/lang/sq.json
index 80de7ed92a1eab2e054ec2bc9e0df3aa0ee4d151..ee9aa0eae3a14bc4b9213192faeb193563eabc65 100644
--- a/plugins/Intl/lang/sq.json
+++ b/plugins/Intl/lang/sq.json
@@ -28,12 +28,12 @@
         "Country_BB": "Barbados",
         "Country_BD": "Bangladesh",
         "Country_BE": "Belgjikë",
-        "Country_BF": "Burkina Faso",
+        "Country_BF": "Burkina-Faso",
         "Country_BG": "Bullgari",
         "Country_BH": "Bahrein",
         "Country_BI": "Burund",
         "Country_BJ": "Benin",
-        "Country_BL": "Shën Bartolemeo",
+        "Country_BL": "Shën-Bartolemeo",
         "Country_BM": "Bermudë",
         "Country_BN": "Brunej",
         "Country_BO": "Bolivi",
@@ -41,12 +41,12 @@
         "Country_BR": "Brazil",
         "Country_BS": "Bahamas",
         "Country_BT": "Butan",
-        "Country_BV": "Ishujt Bove",
-        "Country_BW": "Botsvanë",
+        "Country_BV": "Ishujt Bove’",
+        "Country_BW": "Botsuanë",
         "Country_BY": "Bjellorusi",
         "Country_BZ": "Belizë",
         "Country_CA": "Kanada",
-        "Country_CC": "Ishujt Kokos",
+        "Country_CC": "Ishujt Kokosë",
         "Country_CD": "Kongo-Kinshasa",
         "Country_CF": "Republika Afrikano-Qendrore",
         "Country_CG": "Kongo-Brazavilë",
@@ -57,7 +57,7 @@
         "Country_CM": "Kamerun",
         "Country_CN": "Kinë",
         "Country_CO": "Kolumbi",
-        "Country_CR": "Kosta Rikë",
+        "Country_CR": "Kosta-Rikë",
         "Country_CU": "Kubë",
         "Country_CV": "Kepi i Gjelbër",
         "Country_CW": "Kuraçao",
@@ -97,13 +97,13 @@
         "Country_GP": "Guadalupe",
         "Country_GQ": "Guineja Ekuatoriale",
         "Country_GR": "Greqi",
-        "Country_GS": "Xhorxha Jugore dhe Ishujt Senduiç të Jugut",
+        "Country_GS": "Xhorxha Jugore dhe Ishujt Senduiçë të Jugut",
         "Country_GT": "Guatemalë",
         "Country_GU": "Guam",
         "Country_GW": "Guine-Bisau",
         "Country_GY": "Guajanë",
         "Country_HK": "RVAK i Hong Kongut",
-        "Country_HM": "Ishulli Hërd dhe Ishujt Mekdonald",
+        "Country_HM": "Ishulli Hërd dhe Ishujt Mekdonaldë",
         "Country_HN": "Honduras",
         "Country_HR": "Kroaci",
         "Country_HT": "Haiti",
@@ -127,7 +127,7 @@
         "Country_KH": "Kamboxhia",
         "Country_KI": "Qiribati",
         "Country_KM": "Komore",
-        "Country_KN": "Shën Kits e Nevis",
+        "Country_KN": "Shën-Kits dhe Nevis",
         "Country_KP": "Koreja e Veriut",
         "Country_KR": "Koreja e Jugut",
         "Country_KW": "Kuvajt",
@@ -135,9 +135,9 @@
         "Country_KZ": "Kazakistan",
         "Country_LA": "Laos",
         "Country_LB": "Liban",
-        "Country_LC": "Shën Luçia",
+        "Country_LC": "Shën-Luçia",
         "Country_LI": "Lihtënshtajn",
-        "Country_LK": "Sri Lankë",
+        "Country_LK": "Sri-Lankë",
         "Country_LR": "Liberi",
         "Country_LS": "Lesoto",
         "Country_LT": "Lituani",
@@ -148,7 +148,7 @@
         "Country_MC": "Monako",
         "Country_MD": "Moldavi",
         "Country_ME": "Mali i Zi",
-        "Country_MF": "Shën Martin",
+        "Country_MF": "Shën-Martin",
         "Country_MG": "Madagaskar",
         "Country_MH": "Ishujt Marshallë",
         "Country_MK": "Maqedoni",
@@ -170,7 +170,7 @@
         "Country_NA": "Namibi",
         "Country_NC": "Kaledonia e Re",
         "Country_NE": "Niger",
-        "Country_NF": "Ishujt Norfolkë",
+        "Country_NF": "Ishulli Norfolk",
         "Country_NG": "Nigeri",
         "Country_NI": "Nikaragua",
         "Country_NL": "Holandë",
@@ -187,9 +187,9 @@
         "Country_PH": "Filipine",
         "Country_PK": "Pakistan",
         "Country_PL": "Poloni",
-        "Country_PM": "Shën Peir dhe Mikuelon",
+        "Country_PM": "Shën-Peir dhe Mikuelon",
         "Country_PN": "Ishujt Pitkernë",
-        "Country_PR": "Porto Riko",
+        "Country_PR": "Porto-Riko",
         "Country_PS": "Territoret Palestineze",
         "Country_PT": "Portugali",
         "Country_PW": "Palau",
@@ -206,21 +206,21 @@
         "Country_SD": "Sudan",
         "Country_SE": "Suedi",
         "Country_SG": "Singapor",
-        "Country_SH": "Shën Helena",
+        "Country_SH": "Shën-Helena",
         "Country_SI": "Slloveni",
-        "Country_SJ": "Svalbard e Zhan Majen",
+        "Country_SJ": "Svalbard e Zhan-Majen",
         "Country_SK": "Sllovaki",
-        "Country_SL": "Siera Leone",
-        "Country_SM": "San Marino",
+        "Country_SL": "Siera-Leone",
+        "Country_SM": "San-Marino",
         "Country_SN": "Senegali",
         "Country_SO": "Somali",
         "Country_SR": "Surinami",
         "Country_SS": "Sudani i Jugut",
-        "Country_ST": "Sao Tome e Prinsipe",
+        "Country_ST": "Sao-Tome e Prinsipe",
         "Country_SV": "El Salvador",
-        "Country_SX": "Shën Martin (Sint Maarten-pjesa e Mbretërisë së Holandës)",
+        "Country_SX": "Shën-Martin (Sint Maarten - pjesa e Mbretërisë së Holandës)",
         "Country_SY": "Siri",
-        "Country_SZ": "Svazilandë",
+        "Country_SZ": "Suazilandë",
         "Country_TC": "Ishujt Turke dhe Kaike",
         "Country_TD": "Çad",
         "Country_TF": "Territoret Australiane Franceze",
@@ -244,7 +244,7 @@
         "Country_UY": "Uruguai",
         "Country_UZ": "Uzbekistan",
         "Country_VA": "Vatikan",
-        "Country_VC": "Shën Vinsent dhe Grenadinet",
+        "Country_VC": "Shën-Vinsent dhe Grenadinet",
         "Country_VE": "Venezuelë",
         "Country_VG": "Ishujt e Virgjër Britanikë",
         "Country_VI": "Ishujt e Virgjër Amerikanë",
@@ -300,8 +300,8 @@
         "Day_Short_StandAlone_6": "Sht",
         "Day_Short_StandAlone_7": "Die",
         "EnglishLanguageName": "Albanian",
-        "Format_DateTime_Long": "EEEE, d MMMM y HH:mm:ss",
-        "Format_DateTime_Short": "d MMM y HH:mm:ss",
+        "Format_DateTime_Long": "EEEE, d MMMM y h:mm:ss a",
+        "Format_DateTime_Short": "d MMM y h:mm:ss a",
         "Format_Date_Day_Month": "E, d MMM",
         "Format_Date_Long": "EEEE, d MMMM y",
         "Format_Date_Short": "d MMM y",
@@ -313,31 +313,33 @@
         "Format_Interval_Short_Y": "d MMM y – d MMM y",
         "Format_Month_Long": "MMMM y",
         "Format_Month_Short": "MMM y",
-        "Format_Time": "HH:mm:ss",
+        "Format_Time": "h:mm:ss a",
         "Format_Year": "y",
         "Hours": "orë",
         "Language_ab": "Abkazisht",
         "Language_af": "Afrikanisht",
         "Language_ak": "Akanisht",
-        "Language_am": "Amarike",
+        "Language_am": "Amarikisht",
         "Language_ar": "Arabisht",
         "Language_as": "Asamezisht",
-        "Language_az": "Azere",
+        "Language_az": "Azerbajxhanisht",
         "Language_ba": "Bashkirisht",
         "Language_be": "Bjellorusisht",
         "Language_bg": "Bullgarisht",
-        "Language_bm": "Bambara",
+        "Language_bm": "Bambarisht",
         "Language_bn": "Bengalisht",
         "Language_bo": "Tibetisht",
-        "Language_br": "Bretone",
+        "Language_br": "Bretonisht",
         "Language_bs": "Boshnjakisht",
         "Language_ca": "Katalonisht",
+        "Language_ce": "Çeçenisht",
         "Language_co": "Korsikanisht",
         "Language_cs": "Çekisht",
+        "Language_cv": "Çuvashisht",
         "Language_cy": "Uellsisht",
         "Language_da": "Danisht",
         "Language_de": "Gjermanisht",
-        "Language_dz": "Xongka",
+        "Language_dz": "Xhongaisht",
         "Language_ee": "Juisht",
         "Language_el": "Greqisht",
         "Language_en": "Anglisht",
@@ -347,40 +349,40 @@
         "Language_eu": "Baskisht",
         "Language_fa": "Persisht",
         "Language_fi": "Finlandisht",
-        "Language_fj": "Fixhiane",
+        "Language_fj": "Fixhianisht",
         "Language_fo": "Faroisht",
         "Language_fr": "Frëngjisht",
         "Language_fy": "Frizianisht",
-        "Language_ga": "Irlandezçe",
+        "Language_ga": "Irlandisht",
         "Language_gl": "Galike",
         "Language_gn": "Guaranisht",
         "Language_gu": "Guxharatisht",
-        "Language_gv": "Mankse",
+        "Language_gv": "Manksisht",
         "Language_ha": "Hausisht",
         "Language_he": "Hebraisht",
-        "Language_hi": "Indishte",
+        "Language_hi": "Indisht",
         "Language_hr": "Kroatisht",
-        "Language_ht": "Haitiançe",
+        "Language_ht": "Haitianisht",
         "Language_hu": "Hungarisht",
         "Language_hy": "Armenisht",
         "Language_id": "Indonezisht",
-        "Language_ig": "Igbe",
+        "Language_ig": "Igboisht",
         "Language_ii": "Sishuanisht",
         "Language_is": "Islandisht",
         "Language_it": "Italisht",
-        "Language_iu": "Inuktitut",
+        "Language_iu": "Inuktitutisht",
         "Language_ja": "Japonisht",
         "Language_jv": "Javanisht",
         "Language_ka": "Gjeorgjisht",
         "Language_ki": "Kikujuisht",
         "Language_kk": "Kazakisht",
-        "Language_kl": "Kalalisute",
+        "Language_kl": "Kalalisutisht",
         "Language_km": "Kmere",
         "Language_kn": "Kanade",
         "Language_ko": "Koreanisht",
         "Language_ks": "Kashmire",
         "Language_ku": "Kurde",
-        "Language_kw": "Kornisht",
+        "Language_kw": "Kornishisht",
         "Language_ky": "Kirgizisht",
         "Language_la": "Latinisht",
         "Language_lb": "Luksemburgase",
@@ -388,12 +390,12 @@
         "Language_ln": "Lingalisht",
         "Language_lo": "Laosisht",
         "Language_lt": "Lituanisht",
-        "Language_lu": "Lubakatange",
+        "Language_lu": "Lubakatangisht",
         "Language_lv": "Letonisht",
-        "Language_mg": "Malageze",
+        "Language_mg": "Malagezisht",
         "Language_mi": "Maorisht",
         "Language_mk": "Maqedonisht",
-        "Language_ml": "Malajalame",
+        "Language_ml": "Malajalamisht",
         "Language_mn": "Mongolisht",
         "Language_mr": "Maratisht",
         "Language_ms": "Malajisht",
@@ -405,22 +407,22 @@
         "Language_nl": "Holandisht",
         "Language_nn": "Ninorske norvegjeze",
         "Language_om": "Oromoisht",
-        "Language_or": "Orije",
-        "Language_pa": "Panxhabe",
+        "Language_or": "Orijaisht",
+        "Language_pa": "Panxhabisht",
         "Language_pl": "Polonisht",
-        "Language_ps": "Pashto",
+        "Language_ps": "Pashtoisht",
         "Language_pt": "Portugalisht",
-        "Language_qu": "Keçua",
+        "Language_qu": "Keçuaisht",
         "Language_rm": "Rome",
         "Language_rn": "Rundisht",
         "Language_ro": "Rumanisht",
         "Language_ru": "Rusisht",
         "Language_rw": "Kiniaruandisht",
         "Language_sa": "Sanskritisht",
-        "Language_sd": "Sindi",
+        "Language_sd": "Sindisht",
         "Language_se": "Samishte veriore",
         "Language_sg": "Sangoisht",
-        "Language_si": "Sinhale",
+        "Language_si": "Sinhalisht",
         "Language_sk": "Sllovakisht",
         "Language_sl": "Sllovenisht",
         "Language_sn": "Shonisht",
@@ -445,10 +447,10 @@
         "Language_uz": "Uzbeke",
         "Language_vi": "Vietnamisht",
         "Language_wo": "Ulufisht",
-        "Language_xh": "Xhose",
+        "Language_xh": "Xhozaisht",
         "Language_yo": "Jorubisht",
         "Language_zh": "Kinezisht",
-        "Language_zu": "Zulu",
+        "Language_zu": "Zuluisht",
         "LayoutDirection": "ltr",
         "Minutes": "minuta",
         "Month_Long_1": "Janar",
@@ -505,6 +507,14 @@
         "NMinutesShort": "%s min.",
         "NSeconds": "%s sekonda",
         "NSecondsShort": "%s sek.",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ditë",
         "OneMinute": "1 minutë",
         "OneMinuteShort": "1 min.",
@@ -518,8 +528,8 @@
         "PeriodYear": "vit",
         "PeriodYears": "vjet",
         "Seconds": "sekonda",
-        "Time_AM": "paradite",
-        "Time_PM": "pasdite",
+        "Time_AM": "e paradites",
+        "Time_PM": "e pasdites",
         "Today": "Sot",
         "Year_Short": "vit",
         "Yesterday": "Dje"
diff --git a/plugins/Intl/lang/sr.json b/plugins/Intl/lang/sr.json
index ee7ccab1c6d45a9e8adf05e6d5ecdfd017f4bb0a..003e91483c3337e4cbdcba7feea1787d03a06062 100644
--- a/plugins/Intl/lang/sr.json
+++ b/plugins/Intl/lang/sr.json
@@ -46,7 +46,7 @@
         "Country_BY": "Белорусија",
         "Country_BZ": "Белизе",
         "Country_CA": "Канада",
-        "Country_CC": "Кокос (Келинг) Острва",
+        "Country_CC": "Кокосова (Килингова) Острва",
         "Country_CD": "Конго - Киншаса",
         "Country_CF": "Централноафричка Република",
         "Country_CG": "Конго - Бразавил",
@@ -102,7 +102,7 @@
         "Country_GU": "Гуам",
         "Country_GW": "Гвинеја-Бисао",
         "Country_GY": "Гвајана",
-        "Country_HK": "Хонг Конг С. А. Р. Кина",
+        "Country_HK": "САР Хонгконг (Кина)",
         "Country_HM": "Острва Херд и Мекдоналд",
         "Country_HN": "Хондурас",
         "Country_HR": "Хрватска",
@@ -170,7 +170,7 @@
         "Country_NA": "Намибија",
         "Country_NC": "Нова Каледонија",
         "Country_NE": "Нигер",
-        "Country_NF": "Норфолк Острво",
+        "Country_NF": "Острво Норфок",
         "Country_NG": "Нигерија",
         "Country_NI": "Никарагва",
         "Country_NL": "Холандија",
@@ -369,13 +369,13 @@
         "Language_gl": "Галицијски",
         "Language_gn": "Гварани",
         "Language_gu": "Гуџарати",
-        "Language_gv": "Манкс",
+        "Language_gv": "Мански",
         "Language_ha": "Хауса",
         "Language_he": "Хебрејски",
         "Language_hi": "Хинди",
         "Language_ho": "Хири Моту",
         "Language_hr": "Хрватски",
-        "Language_ht": "Хаитски",
+        "Language_ht": "Хаићански",
         "Language_hu": "Мађарски",
         "Language_hy": "Јерменски",
         "Language_hz": "Хереро",
@@ -467,12 +467,12 @@
         "Language_sr": "Српски",
         "Language_ss": "Свати",
         "Language_st": "Сесото",
-        "Language_su": "Судански",
+        "Language_su": "Сундански",
         "Language_sv": "Шведски",
         "Language_sw": "Свахили",
         "Language_ta": "Тамилски",
         "Language_te": "Телугу",
-        "Language_tg": "Тађик",
+        "Language_tg": "Таџички",
         "Language_th": "Тајландски",
         "Language_ti": "Тигриња",
         "Language_tk": "Туркменски",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s мин",
         "NSeconds": "%s секунди",
         "NSecondsShort": "%s сек",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 дан",
         "OneMinute": "1 минут",
         "OneMinuteShort": "1 мин",
diff --git a/plugins/Intl/lang/sv.json b/plugins/Intl/lang/sv.json
index 393557236327badad36af63f87bd412edc187f53..c829d8841880b1608f28514530ffe331176b22b4 100644
--- a/plugins/Intl/lang/sv.json
+++ b/plugins/Intl/lang/sv.json
@@ -102,7 +102,7 @@
         "Country_GU": "Guam",
         "Country_GW": "Guinea-Bissau",
         "Country_GY": "Guyana",
-        "Country_HK": "Hongkong (S.A.R. Kina)",
+        "Country_HK": "Hongkong, S.A.R. Kina",
         "Country_HM": "Heardön och McDonaldöarna",
         "Country_HN": "Honduras",
         "Country_HR": "Kroatien",
@@ -155,7 +155,7 @@
         "Country_ML": "Mali",
         "Country_MM": "Myanmar (Burma)",
         "Country_MN": "Mongoliet",
-        "Country_MO": "Macao (S.A.R. Kina)",
+        "Country_MO": "Macao, S.A.R. Kina",
         "Country_MP": "Nordmarianerna",
         "Country_MQ": "Martinique",
         "Country_MR": "Mauretanien",
@@ -295,7 +295,7 @@
         "Day_Short_StandAlone_1": "MÃ¥n",
         "Day_Short_StandAlone_2": "Tis",
         "Day_Short_StandAlone_3": "Ons",
-        "Day_Short_StandAlone_4": "Tor",
+        "Day_Short_StandAlone_4": "Tors",
         "Day_Short_StandAlone_5": "Fre",
         "Day_Short_StandAlone_6": "Lör",
         "Day_Short_StandAlone_7": "Sön",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s min",
         "NSeconds": "%s sekunder",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0 %",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "−",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 dygn",
         "OneMinute": "1 minut",
         "OneMinuteShort": "1 min",
         "OriginalLanguageName": "Svenska",
-        "PeriodDay": "Dag",
+        "PeriodDay": "dag",
         "PeriodDays": "dygn",
-        "PeriodMonth": "MÃ¥nad",
+        "PeriodMonth": "månad",
         "PeriodMonths": "månader",
-        "PeriodWeek": "Vecka",
+        "PeriodWeek": "vecka",
         "PeriodWeeks": "veckor",
-        "PeriodYear": "Ã…r",
+        "PeriodYear": "Ã¥r",
         "PeriodYears": "Ã¥r",
         "Seconds": "sekunder",
         "Time_AM": "fm",
diff --git a/plugins/Intl/lang/ta.json b/plugins/Intl/lang/ta.json
index 5db28a36aad042882df4d7b25c955e0adc93fcad..43708c2ba90f5fc7b23adf26cec4d1628d73950a 100644
--- a/plugins/Intl/lang/ta.json
+++ b/plugins/Intl/lang/ta.json
@@ -14,7 +14,7 @@
         "Country_AG": "ஆண்டிகுவா மற்றும் பார்புடா",
         "Country_AI": "அங்குய்லா",
         "Country_AL": "அல்பேனியா",
-        "Country_AM": "ஆர்மேனியா",
+        "Country_AM": "அர்மேனியா",
         "Country_AO": "அங்கோலா",
         "Country_AQ": "அண்டார்டிகா",
         "Country_AR": "அர்ஜென்டினா",
@@ -24,7 +24,7 @@
         "Country_AW": "அரூபா",
         "Country_AX": "ஆலந்து தீவுகள்",
         "Country_AZ": "அசர்பைஜான்",
-        "Country_BA": "போஸ்னியா மற்றும் ஹெர்ஸிகோவினா",
+        "Country_BA": "போஸ்னியா & ஹெர்ஸகோவினா",
         "Country_BB": "பார்படோஸ்",
         "Country_BD": "பங்களாதேஷ்",
         "Country_BE": "பெல்ஜியம்",
@@ -95,18 +95,18 @@
         "Country_GM": "காம்பியா",
         "Country_GN": "கினியா",
         "Country_GP": "க்வாதேலோப்",
-        "Country_GQ": "ஈக்குவாடோரியல் கினியா",
+        "Country_GQ": "ஈக்வடோரியல் கினியா",
         "Country_GR": "கிரீஸ்",
         "Country_GS": "தென் ஜியார்ஜியா மற்றும் தென் சான்ட்விச் தீவுகள்",
         "Country_GT": "கவுதமாலா",
         "Country_GU": "குவாம்",
-        "Country_GW": "கினி-பிஸ்ஸாவ்",
+        "Country_GW": "கினியா-பிஸ்ஸாவ்",
         "Country_GY": "கயானா",
         "Country_HK": "ஹாங்காங் எஸ்ஏஆர் சீனா",
         "Country_HM": "ஹேர்ட் மற்றும் மெக்டொனால்டு தீவுகள்",
         "Country_HN": "ஹோண்டூராஸ்",
-        "Country_HR": "குரோசியா",
-        "Country_HT": "ஹெய்தி",
+        "Country_HR": "குரேஷியா",
+        "Country_HT": "ஹைட்டி",
         "Country_HU": "ஹங்கேரி",
         "Country_ID": "இந்தோனேஷியா",
         "Country_IE": "அயர்லாந்து",
@@ -127,11 +127,11 @@
         "Country_KH": "கம்போடியா",
         "Country_KI": "கிரிபடி",
         "Country_KM": "கோமரோஸ்",
-        "Country_KN": "செயின்ட் கிட்ஸ் மற்றும் நெவிஸ்",
+        "Country_KN": "செயின்ட் கிட்ஸ் & நெவிஸ்",
         "Country_KP": "வட கொரியா",
         "Country_KR": "தென் கொரியா",
         "Country_KW": "குவைத்",
-        "Country_KY": "கேமென் தீவுகள்",
+        "Country_KY": "கெய்மென் தீவுகள்",
         "Country_KZ": "கஸகஸ்தான்",
         "Country_LA": "லாவோஸ்",
         "Country_LB": "லெபனான்",
@@ -155,22 +155,22 @@
         "Country_ML": "மாலி",
         "Country_MM": "மியான்மார் (பர்மா)",
         "Country_MN": "மங்கோலியா",
-        "Country_MO": "மகாவோ எஸ்ஏஆர் சீனா",
+        "Country_MO": "மகாவ் எஸ்ஏஆர் சீனா",
         "Country_MP": "வடக்கு மரியானா தீவுகள்",
         "Country_MQ": "மார்டினிக்",
         "Country_MR": "மௌரிடானியா",
-        "Country_MS": "மௌன்ட்செராட்",
+        "Country_MS": "மாண்ட்செராட்",
         "Country_MT": "மால்டா",
         "Country_MU": "மொரிசியஸ்",
         "Country_MV": "மாலத்தீவு",
-        "Country_MW": "மாலவி",
+        "Country_MW": "மலாவி",
         "Country_MX": "மெக்சிகோ",
-        "Country_MY": "மலேஷியா",
+        "Country_MY": "மலேசியா",
         "Country_MZ": "மொசாம்பிக்",
         "Country_NA": "நமீபியா",
         "Country_NC": "நியூ கேலிடோனியா",
         "Country_NE": "நைஜர்",
-        "Country_NF": "நார்ஃபாக் தீவுகள்",
+        "Country_NF": "நார்ஃபோக் தீவுகள்",
         "Country_NG": "நைஜீரியா",
         "Country_NI": "நிகரகுவா",
         "Country_NL": "நெதர்லாந்து",
@@ -183,11 +183,11 @@
         "Country_PA": "பனாமா",
         "Country_PE": "பெரு",
         "Country_PF": "பிரெஞ்சு பாலினேஷியா",
-        "Country_PG": "பாப்புவா நியூ கினி",
+        "Country_PG": "பப்புவா நியூ கினியா",
         "Country_PH": "பிலிப்பைன்ஸ்",
         "Country_PK": "பாகிஸ்தான்",
         "Country_PL": "போலந்து",
-        "Country_PM": "செயின்ட் பியர் மற்றும் மிக்வேலான்",
+        "Country_PM": "செயின்ட் பியர் & மிக்வேலான்",
         "Country_PN": "பிட்கெய்ர்ன் தீவுகள்",
         "Country_PR": "பியூர்டோ ரிகோ",
         "Country_PS": "பாலஸ்தீனிய பிரதேசங்கள்",
@@ -202,26 +202,26 @@
         "Country_RW": "ருவான்டா",
         "Country_SA": "சவூதி அரேபியா",
         "Country_SB": "சாலமன் தீவுகள்",
-        "Country_SC": "ஸேசேல்ஸ்",
+        "Country_SC": "சீஷெல்ஸ்",
         "Country_SD": "சூடான்",
         "Country_SE": "ஸ்வீடன்",
         "Country_SG": "சிங்கப்பூர்",
         "Country_SH": "செயின்ட் ஹெலெனா",
         "Country_SI": "ஸ்லோவேனியா",
-        "Country_SJ": "ஸ்வல்பார்டு மற்றும் ஜான் மேயன்",
+        "Country_SJ": "ஸ்வல்பார்டு & ஜான் மேயன்",
         "Country_SK": "ஸ்லோவாகியா",
-        "Country_SL": "சியர்ரா லியோன்",
-        "Country_SM": "சான் மெரினோ",
+        "Country_SL": "சியாரா லியோன்",
+        "Country_SM": "சான் மரினோ",
         "Country_SN": "செனெகல்",
         "Country_SO": "சோமாலியா",
         "Country_SR": "சுரினாம்",
         "Country_SS": "தெற்கு சூடான்",
-        "Country_ST": "சாவ் தோம் மற்றும் ப்ரின்சிபி",
+        "Country_ST": "சாவ் தோம் & ப்ரின்சிபி",
         "Country_SV": "எல் சால்வடார்",
         "Country_SX": "சின்ட் மார்டென்",
         "Country_SY": "சிரியா",
         "Country_SZ": "ஸ்வாஸிலாந்து",
-        "Country_TC": "டர்க்ஸ் மற்றும் கைகோஸ் தீவுகள்",
+        "Country_TC": "டர்க்ஸ் & கைகோஸ் தீவுகள்",
         "Country_TD": "சாட்",
         "Country_TF": "பிரெஞ்சு தெற்கு பிரதேசங்கள்",
         "Country_TG": "டோகோ",
@@ -233,18 +233,18 @@
         "Country_TN": "டுனிசியா",
         "Country_TO": "டோங்கா",
         "Country_TR": "துருக்கி",
-        "Country_TT": "ட்ரினிடாட் மற்றும் டுபாகோ",
+        "Country_TT": "ட்ரினிடாட் & டொபாகோ",
         "Country_TV": "துவாலூ",
         "Country_TW": "தைவான்",
         "Country_TZ": "தான்சானியா",
         "Country_UA": "உக்ரைன்",
         "Country_UG": "உகாண்டா",
-        "Country_UM": "யூஎஸ் அவுட்லேயிங் தீவுகள்",
+        "Country_UM": "யூ.எஸ். வெளிப்புற தீவுகள்",
         "Country_US": "அமெரிக்கா",
         "Country_UY": "உருகுவே",
         "Country_UZ": "உஸ்பெகிஸ்தான்",
         "Country_VA": "வாடிகன் நகரம்",
-        "Country_VC": "செயின்ட் வின்சென்ட் மற்றும் கிரெனடைன்ஸ்",
+        "Country_VC": "செயின்ட் வின்சென்ட் & கிரெனடைன்ஸ்",
         "Country_VE": "வெனிசுலா",
         "Country_VG": "பிரிட்டீஷ் கன்னித் தீவுகள்",
         "Country_VI": "யூ.எஸ். கன்னித் தீவுகள்",
@@ -253,7 +253,7 @@
         "Country_WF": "வாலிஸ் மற்றும் ஃபுடுனா",
         "Country_WS": "சமோவா",
         "Country_YE": "ஏமன்",
-        "Country_YT": "மயோத்",
+        "Country_YT": "மயோட்",
         "Country_ZA": "தென் ஆப்பிரிக்கா",
         "Country_ZM": "ஜாம்பியா",
         "Country_ZW": "ஜிம்பாப்வே",
@@ -285,23 +285,23 @@
         "Day_Min_StandAlone_5": "வெ",
         "Day_Min_StandAlone_6": "ச",
         "Day_Min_StandAlone_7": "ஞா",
-        "Day_Short_1": "தி",
-        "Day_Short_2": "செ",
-        "Day_Short_3": "பு",
-        "Day_Short_4": "வி",
-        "Day_Short_5": "வெ",
-        "Day_Short_6": "ச",
-        "Day_Short_7": "ஞா",
-        "Day_Short_StandAlone_1": "தி",
-        "Day_Short_StandAlone_2": "செ",
-        "Day_Short_StandAlone_3": "பு",
-        "Day_Short_StandAlone_4": "வி",
-        "Day_Short_StandAlone_5": "வெ",
-        "Day_Short_StandAlone_6": "ச",
-        "Day_Short_StandAlone_7": "ஞா",
+        "Day_Short_1": "திங்.",
+        "Day_Short_2": "செவ்.",
+        "Day_Short_3": "புத.",
+        "Day_Short_4": "வியா.",
+        "Day_Short_5": "வெள்.",
+        "Day_Short_6": "சனி",
+        "Day_Short_7": "ஞாயி.",
+        "Day_Short_StandAlone_1": "திங்.",
+        "Day_Short_StandAlone_2": "செவ்.",
+        "Day_Short_StandAlone_3": "புத.",
+        "Day_Short_StandAlone_4": "வியா.",
+        "Day_Short_StandAlone_5": "வெள்.",
+        "Day_Short_StandAlone_6": "சனி",
+        "Day_Short_StandAlone_7": "ஞாயி.",
         "EnglishLanguageName": "Tamil",
-        "Format_DateTime_Long": "EEEE, d MMMM, y h:mm:ss a",
-        "Format_DateTime_Short": "d MMM, y h:mm:ss a",
+        "Format_DateTime_Long": "EEEE, d MMMM, y a h:mm:ss",
+        "Format_DateTime_Short": "d MMM, y a h:mm:ss",
         "Format_Date_Day_Month": "MMM d, E",
         "Format_Date_Long": "EEEE, d MMMM, y",
         "Format_Date_Short": "d MMM, y",
@@ -313,7 +313,7 @@
         "Format_Interval_Short_Y": "d MMM, y – d MMM, y",
         "Format_Month_Long": "MMMM y",
         "Format_Month_Short": "MMM y",
-        "Format_Time": "h:mm:ss a",
+        "Format_Time": "a h:mm:ss",
         "Format_Year": "y",
         "Hours": "மணிநேரங்கள்",
         "Language_aa": "அஃபார்",
@@ -324,11 +324,11 @@
         "Language_am": "அம்ஹாரிக்",
         "Language_an": "ஆர்கோனீஸ்",
         "Language_ar": "அரபிக்",
-        "Language_as": "அஸ்ஸாமி",
+        "Language_as": "அஸ்ஸாமீஸ்",
         "Language_av": "அவேரிக்",
         "Language_ay": "அய்மரா",
         "Language_az": "அஸர்பைஜானி",
-        "Language_ba": "பாஷ்கிர்",
+        "Language_ba": "பஷ்கிர்",
         "Language_be": "பெலாருஷியன்",
         "Language_bg": "பல்கேரியன்",
         "Language_bi": "பிஸ்லாமா",
@@ -338,14 +338,14 @@
         "Language_br": "பிரெட்டன்",
         "Language_bs": "போஸ்னியன்",
         "Language_ca": "கேட்டலான்",
-        "Language_ce": "செசென்",
+        "Language_ce": "செச்சென்",
         "Language_ch": "சாமோரோ",
-        "Language_co": "கோர்சிகன்",
+        "Language_co": "கார்சிகன்",
         "Language_cr": "க்ரீ",
         "Language_cs": "செக்",
         "Language_cu": "சர்ச் ஸ்லாவிக்",
         "Language_cv": "சுவாஷ்",
-        "Language_cy": "வெல்ஷ்",
+        "Language_cy": "வேல்ஷ்",
         "Language_da": "டேனிஷ்",
         "Language_de": "ஜெர்மன்",
         "Language_dv": "திவேஹி",
@@ -356,14 +356,14 @@
         "Language_eo": "எஸ்பரேன்டோ",
         "Language_es": "ஸ்பானிஷ்",
         "Language_et": "எஸ்டோனியன்",
-        "Language_eu": "பஸ்க்",
+        "Language_eu": "பாஸ்க்",
         "Language_fa": "பெர்ஷியன்",
         "Language_ff": "ஃபுலா",
         "Language_fi": "ஃபின்னிஷ்",
         "Language_fj": "ஃபிஜியன்",
         "Language_fo": "ஃபரோயிஸ்",
         "Language_fr": "பிரெஞ்சு",
-        "Language_fy": "மேற்கத்திய ஃப்ரிஷியன்",
+        "Language_fy": "மேற்கு ஃப்ரிஷியன்",
         "Language_ga": "ஐரிஷ்",
         "Language_gd": "ஸ்காட்ஸ் கேலிக்",
         "Language_gl": "காலிஸியன்",
@@ -386,11 +386,11 @@
         "Language_ii": "சிசுவான் ஈ",
         "Language_ik": "இனுபியாக்",
         "Language_io": "இடோ",
-        "Language_is": "ஐஸ்லென்டிக்",
+        "Language_is": "ஐஸ்லேண்டிக்",
         "Language_it": "இத்தாலியன்",
         "Language_iu": "இனுகிடூட்",
         "Language_ja": "ஜப்பானியம்",
-        "Language_jv": "ஜாவானீஸ்",
+        "Language_jv": "ஜாவனீஸ்",
         "Language_ka": "ஜார்ஜியன்",
         "Language_kg": "காங்கோ",
         "Language_ki": "கிகுயூ",
@@ -424,7 +424,7 @@
         "Language_mr": "மராத்தி",
         "Language_ms": "மலாய்",
         "Language_mt": "மால்டிஸ்",
-        "Language_my": "பர்மிஸ்",
+        "Language_my": "பர்மீஸ்",
         "Language_na": "நவ்ரூ",
         "Language_nb": "நார்வேஜியன் பொக்மால்",
         "Language_nd": "வடக்கு தெபெலே",
@@ -475,11 +475,11 @@
         "Language_tg": "தாஜிக்",
         "Language_th": "தாய்",
         "Language_ti": "டிக்ரின்யா",
-        "Language_tk": "டர்க்மென்",
+        "Language_tk": "துருக்மென்",
         "Language_tl": "டாகாலோக்",
         "Language_tn": "ஸ்வானா",
         "Language_to": "டோங்கான்",
-        "Language_tr": "டர்கிஷ்",
+        "Language_tr": "துருக்கிஷ்",
         "Language_ts": "ஸோங்கா",
         "Language_tt": "டாடர்",
         "Language_tw": "ட்வி",
@@ -552,9 +552,17 @@
         "NDays": "%s நாட்கள்",
         "NHoursShort": "%s ம.நே.",
         "NMinutes": "%s நிமிடங்கள்",
-        "NMinutesShort": "%s நிமிடங்கள்",
+        "NMinutesShort": "%s நிமிட",
         "NSeconds": "%s விநாடிகள்",
         "NSecondsShort": "%s வி.",
+        "NumberFormatCurrency": "¤ #,##,##0.00",
+        "NumberFormatNumber": "#,##,##0.###",
+        "NumberFormatPercent": "#,##,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 நாள்",
         "OneMinute": "1 நிமிடம்",
         "OneMinuteShort": "1 நிமிடம்",
@@ -571,7 +579,7 @@
         "Time_AM": "முற்பகல்",
         "Time_PM": "பிற்பகல்",
         "Today": "இன்று",
-        "Year_Short": "ஆண்டு",
+        "Year_Short": "ஆ.",
         "Yesterday": "நேற்று"
     }
 }
\ No newline at end of file
diff --git a/plugins/Intl/lang/te.json b/plugins/Intl/lang/te.json
index 8b8a14f24b8c5af2be48213a30bb29751ebeb1ad..7c9679b3a13fe4bbd4dd5540a5f2e40e7e3d1b52 100644
--- a/plugins/Intl/lang/te.json
+++ b/plugins/Intl/lang/te.json
@@ -402,7 +402,7 @@
         "Language_ko": "కొరియన్",
         "Language_kr": "కానురి",
         "Language_ks": "కాశ్మీరి",
-        "Language_ku": "కర్డిష్",
+        "Language_ku": "కుర్దిష్",
         "Language_kv": "కోమి",
         "Language_kw": "కోర్నిష్",
         "Language_ky": "కిర్గిజ్",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s నిమి.",
         "NSeconds": "%s సెకన్లు",
         "NSecondsShort": "%sసె",
+        "NumberFormatCurrency": "¤#,##,##0.00",
+        "NumberFormatNumber": "#,##,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 రోజు",
         "OneMinute": "1 నిమిషం",
         "OneMinuteShort": "1 నిమి.",
diff --git a/plugins/Intl/lang/th.json b/plugins/Intl/lang/th.json
index 085880e0d39a5c9ea5eeb10decff00c7384a7d34..afe4e21c493ed32e5ae4a30d9abf30a60d7be519 100644
--- a/plugins/Intl/lang/th.json
+++ b/plugins/Intl/lang/th.json
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s นาที",
         "NSeconds": "%s วินาที",
         "NSecondsShort": "%sวิ",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 วัน",
         "OneMinute": "1 นาที",
         "OneMinuteShort": "1 นาที",
diff --git a/plugins/Intl/lang/tl.json b/plugins/Intl/lang/tl.json
index 8a16e108850ebdffc966bdccaac552700d095f2e..caebf74edfd81e9900382177c8e4531ad6ea09f8 100644
--- a/plugins/Intl/lang/tl.json
+++ b/plugins/Intl/lang/tl.json
@@ -3,7 +3,7 @@
         "Continent_afr": "Africa",
         "Continent_amc": "Gitnang Amerika",
         "Continent_amn": "Hilagang Amerika",
-        "Continent_ams": "South America",
+        "Continent_ams": "Timog Amerika",
         "Continent_ant": "Antarctica",
         "Continent_asi": "Asya",
         "Continent_eur": "Europe",
@@ -128,8 +128,8 @@
         "Country_KI": "Kiribati",
         "Country_KM": "Comoros",
         "Country_KN": "Saint Kitts and Nevis",
-        "Country_KP": "North Korea",
-        "Country_KR": "South Korea",
+        "Country_KP": "Hilagang Korea",
+        "Country_KR": "Timog Korea",
         "Country_KW": "Kuwait",
         "Country_KY": "Cayman Islands",
         "Country_KZ": "Kazakhstan",
@@ -315,7 +315,7 @@
         "Format_Month_Short": "MMM y",
         "Format_Time": "h:mm:ss a",
         "Format_Year": "y",
-        "Hours": "oras",
+        "Hours": "mga oras",
         "Language_ab": "Abkhazian",
         "Language_af": "Afrikaans",
         "Language_ak": "Akan",
@@ -333,8 +333,10 @@
         "Language_br": "Breton",
         "Language_bs": "Bosnian",
         "Language_ca": "Catalan",
+        "Language_ce": "Chechen",
         "Language_co": "Corsican",
         "Language_cs": "Czech",
+        "Language_cv": "Chuvash",
         "Language_cy": "Welsh",
         "Language_da": "Danish",
         "Language_de": "German",
@@ -344,7 +346,7 @@
         "Language_el": "Greek",
         "Language_en": "Ingles",
         "Language_eo": "Esperanto",
-        "Language_es": "Spanish",
+        "Language_es": "Espanyol",
         "Language_et": "Estonian",
         "Language_eu": "Basque",
         "Language_fa": "Persian",
@@ -352,7 +354,7 @@
         "Language_fj": "Fijian",
         "Language_fo": "Faroese",
         "Language_fr": "French",
-        "Language_fy": "Western Frisian",
+        "Language_fy": "Kanlurang Frisian",
         "Language_ga": "Irish",
         "Language_gd": "Scots Gaelic",
         "Language_gl": "Galician",
@@ -406,7 +408,7 @@
         "Language_mt": "Maltese",
         "Language_my": "Burmese",
         "Language_nb": "Norwegian Bokmal",
-        "Language_nd": "North Ndebele",
+        "Language_nd": "Hilagang Ndebele",
         "Language_ne": "Nepali",
         "Language_nl": "Dutch",
         "Language_nn": "Norwegian Nynorsk",
@@ -428,7 +430,7 @@
         "Language_rw": "Kinyarwanda",
         "Language_sa": "Sanskrit",
         "Language_sd": "Sindhi",
-        "Language_se": "Northern Sami",
+        "Language_se": "Hilagang Sami",
         "Language_sg": "Sango",
         "Language_si": "Sinhala",
         "Language_sk": "Slovak",
@@ -468,7 +470,7 @@
         "Language_zh": "Chinese",
         "Language_zu": "Zulu",
         "LayoutDirection": "ltr",
-        "Minutes": "minuto",
+        "Minutes": "mga minuto",
         "Month_Long_1": "Enero",
         "Month_Long_10": "Oktubre",
         "Month_Long_11": "Nobyembre",
@@ -517,29 +519,37 @@
         "Month_Short_StandAlone_7": "Hul",
         "Month_Short_StandAlone_8": "Ago",
         "Month_Short_StandAlone_9": "Set",
-        "NDays": "%s araw",
-        "NHoursShort": "%sh",
-        "NMinutes": "%s minuto",
+        "NDays": "%s na araw",
+        "NHoursShort": "%s oras",
+        "NMinutes": "%s na minuto",
         "NMinutesShort": "%s min.",
-        "NSeconds": "%s segundo",
+        "NSeconds": "%s na segundo",
         "NSecondsShort": "%ss",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 araw",
         "OneMinute": "1 minuto",
         "OneMinuteShort": "1 min.",
         "OriginalLanguageName": "Filipino",
-        "PeriodDay": "Araw",
+        "PeriodDay": "araw",
         "PeriodDays": "araw",
-        "PeriodMonth": "Buwan",
-        "PeriodMonths": "buwan",
-        "PeriodWeek": "Linggo",
-        "PeriodWeeks": "linggo",
-        "PeriodYear": "Taon",
-        "PeriodYears": "taon",
-        "Seconds": "segundo",
+        "PeriodMonth": "buwan",
+        "PeriodMonths": "mga buwan",
+        "PeriodWeek": "linggo",
+        "PeriodWeeks": "mga linggo",
+        "PeriodYear": "taon",
+        "PeriodYears": "mga taon",
+        "Seconds": "mga segundo",
         "Time_AM": "AM",
         "Time_PM": "PM",
         "Today": "Ngayong araw",
-        "Year_Short": "yr.",
+        "Year_Short": "taon",
         "Yesterday": "Kahapon"
     }
 }
\ No newline at end of file
diff --git a/plugins/Intl/lang/tr.json b/plugins/Intl/lang/tr.json
index b4f8db1189da147c0a9d29d0ca31f56cbfd9949e..0d2b4082e6cf17af335d8c5573af43042dabd6c7 100644
--- a/plugins/Intl/lang/tr.json
+++ b/plugins/Intl/lang/tr.json
@@ -412,7 +412,7 @@
         "Language_li": "Limburgca",
         "Language_ln": "Lingala",
         "Language_lo": "Laoca",
-        "Language_lt": "Litvanyaca",
+        "Language_lt": "Litvanca",
         "Language_lu": "Luba-Katanga",
         "Language_lv": "Letonca",
         "Language_mg": "Malgaşça",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s dk.",
         "NSeconds": "%s saniye",
         "NSecondsShort": "%ssn",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "%#,##0",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 gün",
         "OneMinute": "1 dakika",
         "OneMinuteShort": "1 dk.",
diff --git a/plugins/Intl/lang/uk.json b/plugins/Intl/lang/uk.json
index 3b677b7ee9cbde0361dc7d38856671637c2b2461..69ec802cbb394b9b14da0ff8f17e7f75a7499155 100644
--- a/plugins/Intl/lang/uk.json
+++ b/plugins/Intl/lang/uk.json
@@ -2,7 +2,7 @@
     "Intl": {
         "Continent_afr": "Африка",
         "Continent_amc": "Центральна Америка",
-        "Continent_amn": "Північноамериканський континент",
+        "Continent_amn": "Північна Америка",
         "Continent_ams": "Південна Америка",
         "Continent_ant": "Антарктика",
         "Continent_asi": "Азія",
@@ -34,12 +34,12 @@
         "Country_BI": "Бурунді",
         "Country_BJ": "Бенін",
         "Country_BL": "Сен-Бартельмі",
-        "Country_BM": "Бермуди",
+        "Country_BM": "Бермудські острови",
         "Country_BN": "Бруней",
         "Country_BO": "Болівія",
         "Country_BQ": "Нідерландські Карибські острови",
         "Country_BR": "Бразилія",
-        "Country_BS": "Багами",
+        "Country_BS": "Багамські Острови",
         "Country_BT": "Бутан",
         "Country_BV": "Острів Буве",
         "Country_BW": "Ботсвана",
@@ -155,7 +155,7 @@
         "Country_ML": "Малі",
         "Country_MM": "Мʼянма (Бірма)",
         "Country_MN": "Монголія",
-        "Country_MO": "Макао О.А.Р. Китаю",
+        "Country_MO": "Макао, О.А.Р Китаю",
         "Country_MP": "Північні Маріанські острови",
         "Country_MQ": "Мартиніка",
         "Country_MR": "Мавританія",
@@ -228,7 +228,7 @@
         "Country_TH": "Таїланд",
         "Country_TJ": "Таджикистан",
         "Country_TK": "Токелау",
-        "Country_TL": "Східний Тимор",
+        "Country_TL": "Тимор-Лешті",
         "Country_TM": "Туркменістан",
         "Country_TN": "Туніс",
         "Country_TO": "Тонга",
@@ -254,7 +254,7 @@
         "Country_WS": "Самоа",
         "Country_YE": "Ємен",
         "Country_YT": "Майотта",
-        "Country_ZA": "ПАР",
+        "Country_ZA": "Південно-Африканська Республіка",
         "Country_ZM": "Замбія",
         "Country_ZW": "Зімбабве",
         "Day_Long_1": "Понеділок",
@@ -363,7 +363,7 @@
         "Language_fj": "Фіджі",
         "Language_fo": "Фарерська",
         "Language_fr": "Французька",
-        "Language_fy": "Західно-фризька",
+        "Language_fy": "Західнофризька",
         "Language_ga": "Ірландська",
         "Language_gd": "Гаельська",
         "Language_gl": "Галісійська",
@@ -555,17 +555,25 @@
         "NMinutesShort": "%s хв",
         "NSeconds": "%s секунди",
         "NSecondsShort": "%s с",
+        "NumberFormatCurrency": "#,##0.00 ¤",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": " ",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 день",
         "OneMinute": "1 хвилина",
         "OneMinuteShort": "1 хв",
         "OriginalLanguageName": "Українська",
-        "PeriodDay": "День",
+        "PeriodDay": "день",
         "PeriodDays": "дні",
-        "PeriodMonth": "Місяць",
+        "PeriodMonth": "місяць",
         "PeriodMonths": "місяці",
-        "PeriodWeek": "Тиждень",
+        "PeriodWeek": "тиждень",
         "PeriodWeeks": "тижні",
-        "PeriodYear": "Рік",
+        "PeriodYear": "рік",
         "PeriodYears": "роки",
         "Seconds": "секунди",
         "Time_AM": "дп",
diff --git a/plugins/Intl/lang/vi.json b/plugins/Intl/lang/vi.json
index 4d00266994292b0cbe5e88f7778ed8ecf6f77825..e89f2f527b26c65c0fa47485af171b78e2f1d420 100644
--- a/plugins/Intl/lang/vi.json
+++ b/plugins/Intl/lang/vi.json
@@ -33,7 +33,7 @@
         "Country_BH": "Bahrain",
         "Country_BI": "Burundi",
         "Country_BJ": "Benin",
-        "Country_BL": "Saint Barthélemy",
+        "Country_BL": "St. Barthélemy",
         "Country_BM": "Bermuda",
         "Country_BN": "Brunei",
         "Country_BO": "Bolivia",
@@ -102,8 +102,8 @@
         "Country_GU": "Guam",
         "Country_GW": "Guinea-Bissau",
         "Country_GY": "Guyana",
-        "Country_HK": "Đặc khu hành chính Hồng Kông - Trung Quốc",
-        "Country_HM": "Đảo Heard và Quần đảo McDonald",
+        "Country_HK": "Hồng Kông, Trung Quốc",
+        "Country_HM": "Quần đảo Heard và McDonald",
         "Country_HN": "Honduras",
         "Country_HR": "Croatia",
         "Country_HT": "Haiti",
@@ -127,7 +127,7 @@
         "Country_KH": "Campuchia",
         "Country_KI": "Kiribati",
         "Country_KM": "Comoros",
-        "Country_KN": "Saint Kitts và Nevis",
+        "Country_KN": "St. Kitts và Nevis",
         "Country_KP": "Triều Tiên",
         "Country_KR": "Hàn Quốc",
         "Country_KW": "Cô-oét",
@@ -135,7 +135,7 @@
         "Country_KZ": "Kazakhstan",
         "Country_LA": "Lào",
         "Country_LB": "Li-băng",
-        "Country_LC": "Saint Lucia",
+        "Country_LC": "St. Lucia",
         "Country_LI": "Liechtenstein",
         "Country_LK": "Sri Lanka",
         "Country_LR": "Liberia",
@@ -148,14 +148,14 @@
         "Country_MC": "Monaco",
         "Country_MD": "Moldova",
         "Country_ME": "Montenegro",
-        "Country_MF": "Saint Martin",
+        "Country_MF": "St. Martin",
         "Country_MG": "Madagascar",
         "Country_MH": "Quần đảo Marshall",
         "Country_MK": "Macedonia",
         "Country_ML": "Mali",
         "Country_MM": "Myanmar (Miến Điện)",
         "Country_MN": "Mông Cổ",
-        "Country_MO": "Đặc khu hành chính Macao - Trung Quốc",
+        "Country_MO": "Macao, Trung Quốc",
         "Country_MP": "Quần đảo Bắc Mariana",
         "Country_MQ": "Martinique",
         "Country_MR": "Mauritania",
@@ -206,7 +206,7 @@
         "Country_SD": "Sudan",
         "Country_SE": "Thụy Điển",
         "Country_SG": "Singapore",
-        "Country_SH": "Saint Helena",
+        "Country_SH": "St. Helena",
         "Country_SI": "Slovenia",
         "Country_SJ": "Svalbard và Jan Mayen",
         "Country_SK": "Slovakia",
@@ -244,7 +244,7 @@
         "Country_UY": "Uruguay",
         "Country_UZ": "Uzbekistan",
         "Country_VA": "Thành Vatican",
-        "Country_VC": "Saint Vincent và Grenadines",
+        "Country_VC": "St. Vincent và Grenadines",
         "Country_VE": "Venezuela",
         "Country_VG": "Quần đảo Virgin thuộc Anh",
         "Country_VI": "Quần đảo Virgin thuộc Mỹ",
@@ -301,15 +301,15 @@
         "Day_Short_StandAlone_7": "CN",
         "EnglishLanguageName": "Vietnamese",
         "Format_DateTime_Long": "EEEE, 'ngày' dd MMMM 'năm' y HH:mm:ss",
-        "Format_DateTime_Short": "dd-MM-y HH:mm:ss",
-        "Format_Date_Day_Month": "E, dd MMM",
+        "Format_DateTime_Short": "d MMM, y HH:mm:ss",
+        "Format_Date_Day_Month": "E, d MMM",
         "Format_Date_Long": "EEEE, 'ngày' dd MMMM 'năm' y",
-        "Format_Date_Short": "dd-MM-y",
-        "Format_Interval_Long_D": "'Ngày' dd - 'Ngày' dd 'tháng' M 'năm' y",
-        "Format_Interval_Long_M": "'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' y",
+        "Format_Date_Short": "d MMM, y",
+        "Format_Interval_Long_D": "d – d MMMM, y",
+        "Format_Interval_Long_M": "d MMMM – d MMMM, y",
         "Format_Interval_Long_Y": "'Ngày' dd 'tháng' M 'năm' y - 'Ngày' dd 'tháng' M 'năm' y",
-        "Format_Interval_Short_D": "'Ngày' dd - 'Ngày' dd 'tháng' M 'năm' y",
-        "Format_Interval_Short_M": "'Ngày' dd 'tháng' M - 'Ngày' dd 'tháng' M 'năm' y",
+        "Format_Interval_Short_D": "d – d MMM, y",
+        "Format_Interval_Short_M": "d MMM – d MMM, y",
         "Format_Interval_Short_Y": "'Ngày' dd 'tháng' M 'năm' y - 'Ngày' dd 'tháng' M 'năm' y",
         "Format_Month_Long": "MMMM 'năm' y",
         "Format_Month_Short": "MMM y",
@@ -467,7 +467,7 @@
         "Language_sr": "Tiếng Serbia",
         "Language_ss": "Tiếng Swati",
         "Language_st": "Tiếng Sesotho",
-        "Language_su": "Tiếng Sudan",
+        "Language_su": "Tiếng Sunda",
         "Language_sv": "Tiếng Thụy Điển",
         "Language_sw": "Tiếng Swahili",
         "Language_ta": "Tiếng Tamil",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s phút",
         "NSeconds": "%s giây",
         "NSecondsShort": "%s giây",
+        "NumberFormatCurrency": "¤ #,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ",",
+        "NumberSymbolGroup": ".",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 ngày",
         "OneMinute": "1 phút",
         "OneMinuteShort": "1 phút",
diff --git a/plugins/Intl/lang/zh-cn.json b/plugins/Intl/lang/zh-cn.json
index c0907c8b49104f22f20b9ac54ac0c563d0355984..5b48c6c6d84ef1c681edf1158b5ca11e2cc2044a 100644
--- a/plugins/Intl/lang/zh-cn.json
+++ b/plugins/Intl/lang/zh-cn.json
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s分钟",
         "NSeconds": "%s秒钟",
         "NSecondsShort": "%s秒",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1天",
         "OneMinute": "1分钟",
         "OneMinuteShort": "1分钟",
diff --git a/plugins/Intl/lang/zh-tw.json b/plugins/Intl/lang/zh-tw.json
index 0200a46ad153dc91305e8765139b372f97606d6e..5fac85b0ec8cbe8d9a1a89b52a63fcf723f56a6b 100644
--- a/plugins/Intl/lang/zh-tw.json
+++ b/plugins/Intl/lang/zh-tw.json
@@ -103,7 +103,7 @@
         "Country_GW": "幾內亞比索",
         "Country_GY": "蓋亞那",
         "Country_HK": "中華人民共和國香港特別行政區",
-        "Country_HM": "赫德及麥當勞群島",
+        "Country_HM": "赫德島和麥克唐納群島",
         "Country_HN": "宏都拉斯",
         "Country_HR": "克羅埃西亞",
         "Country_HT": "海地",
@@ -221,7 +221,7 @@
         "Country_SX": "荷屬聖馬丁",
         "Country_SY": "敘利亞",
         "Country_SZ": "史瓦濟蘭",
-        "Country_TC": "英屬土克凱可群島",
+        "Country_TC": "土克斯及開科斯群島",
         "Country_TD": "查德",
         "Country_TF": "法屬南方屬地",
         "Country_TG": "多哥",
@@ -251,7 +251,7 @@
         "Country_VN": "越南",
         "Country_VU": "萬那杜",
         "Country_WF": "瓦利斯和富圖納群島",
-        "Country_WS": "薩摩亞群島",
+        "Country_WS": "薩摩亞",
         "Country_YE": "葉門",
         "Country_YT": "馬約特",
         "Country_ZA": "南非",
@@ -555,6 +555,14 @@
         "NMinutesShort": "%s 分鐘",
         "NSeconds": "%s 秒",
         "NSecondsShort": "%s秒",
+        "NumberFormatCurrency": "¤#,##0.00",
+        "NumberFormatNumber": "#,##0.###",
+        "NumberFormatPercent": "#,##0%",
+        "NumberSymbolDecimal": ".",
+        "NumberSymbolGroup": ",",
+        "NumberSymbolMinus": "-",
+        "NumberSymbolPercent": "%",
+        "NumberSymbolPlus": "+",
         "OneDay": "1 天",
         "OneMinute": "1 分鐘",
         "OneMinuteShort": "1 分鐘",
@@ -562,7 +570,7 @@
         "PeriodDay": "æ—¥",
         "PeriodDays": "天",
         "PeriodMonth": "月",
-        "PeriodMonths": "個月",
+        "PeriodMonths": "月",
         "PeriodWeek": "週",
         "PeriodWeeks": "週",
         "PeriodYear": "å¹´",
diff --git a/plugins/LeftMenu/API.php b/plugins/LeftMenu/API.php
deleted file mode 100644
index 3d0d38b6468708a0fa2c6e8712fdcd118f1c9763..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/API.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?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\LeftMenu;
-
-/**
- * API for plugin LeftMenu
- *
- * @method static \Piwik\Plugins\LeftMenu\API getInstance()
- */
-class API extends \Piwik\Plugin\API
-{
-    /**
-     * Returns true if the left menu is enabled for the current user.
-     *
-     * @return bool
-     */
-    public function isEnabled()
-    {
-        $settings = new Settings('LeftMenu');
-        $default  = $settings->globalEnabled->getValue();
-
-        if (!$settings->userEnabled->isReadableByCurrentUser()) {
-            return $default;
-        }
-
-        $user = $settings->userEnabled->getValue();
-
-        if (empty($user) || $user === 'system') {
-            return $default;
-        }
-
-        if ($user === 'no') {
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/plugins/LeftMenu/LeftMenu.php b/plugins/LeftMenu/LeftMenu.php
deleted file mode 100755
index 522965e6b8a81bd799c89cf51eb8920ac38a090a..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/LeftMenu.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?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\LeftMenu;
-
-class LeftMenu extends \Piwik\Plugin
-{
-    public function registerEvents()
-    {
-        return array(
-            'AssetManager.getStylesheetFiles' => array('function' => 'getStylesheetFiles', 'after' => true),
-            'Template.bodyClass' => 'addClassToBody'
-        );
-    }
-
-    public function addClassToBody(&$str, $layout)
-    {
-        if (API::getInstance()->isEnabled() && 'dashboard' === $layout) {
-            $str .= ' leftMenuPlugin';
-        }
-    }
-
-    public function getStylesheetFiles(&$stylesheets)
-    {
-        $stylesheets[] = "plugins/LeftMenu/stylesheets/theme.less";
-    }
-
-}
-
diff --git a/plugins/LeftMenu/Settings.php b/plugins/LeftMenu/Settings.php
deleted file mode 100644
index b22c1bc40a967f686bae41adb255602a43d25810..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/Settings.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?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\LeftMenu;
-
-use Piwik\Piwik;
-use Piwik\Settings\SystemSetting;
-use Piwik\Settings\UserSetting;
-
-/**
- * Defines Settings for LeftMenu.
- */
-class Settings extends \Piwik\Plugin\Settings
-{
-    /** @var SystemSetting */
-    public $globalEnabled;
-
-    /** @var UserSetting */
-    public $userEnabled;
-
-    protected function init()
-    {
-        $this->setIntroduction($this->t('SettingsIntroduction'));
-
-        $this->createGlobalEnabledSetting();
-
-        $this->createUserEnabledSetting();
-    }
-
-    private function createGlobalEnabledSetting()
-    {
-        $this->globalEnabled = new SystemSetting('globalEnabled', $this->t('GlobalSettingTitle'));
-        $this->globalEnabled->type = static::TYPE_BOOL;
-        $this->globalEnabled->inlineHelp   = $this->t('GlobalSettingDescription') . ' ' . $this->t('GlobalSettingInlineHelp');
-        $this->globalEnabled->defaultValue = false;
-        $this->globalEnabled->readableByCurrentUser = true;
-
-        $this->addSetting($this->globalEnabled);
-    }
-
-    private function createUserEnabledSetting()
-    {
-        $this->userEnabled = new UserSetting('userEnabled', $this->t('UserSettingTitle'));
-        $this->userEnabled->type            = static::TYPE_STRING;
-        $this->userEnabled->uiControlType   = static::CONTROL_RADIO;
-        $this->userEnabled->defaultValue    = 'system';
-        $this->userEnabled->inlineHelp      = $this->t('UserSettingInlineHelp');
-        $this->userEnabled->availableValues = array(
-            'system' => Piwik::translate('General_Default'),
-            'yes'    => Piwik::translate('General_Yes'),
-            'no'     => Piwik::translate('General_No')
-        );
-
-        $this->addSetting($this->userEnabled);
-    }
-
-    private function t($key)
-    {
-        return Piwik::translate('LeftMenu_' . $key);
-    }
-
-}
diff --git a/plugins/LeftMenu/lang/bg.json b/plugins/LeftMenu/lang/bg.json
deleted file mode 100644
index 4c5cc8fc3670e22f1fbf2c84fe80e0b76199bc2a..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/bg.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "LeftMenu": {
-        "UserSettingTitle": "Активиране на лявото меню за отчет"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/cs.json b/plugins/LeftMenu/lang/cs.json
deleted file mode 100644
index e15938a574086816b06043197734a813c6330151..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/cs.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Umístit menu nástěnky nalevo.",
-        "SettingsIntroduction": "Zásuvný modul levé menu přesune menu hlášení na levou stranu (je-li povolen). To je především užitečné na velkých displejích.",
-        "GlobalSettingTitle": "Levé menu je ve výchozím stavu povoleno",
-        "GlobalSettingDescription": "Definuje systémovou výchozí hodnotu pro všechny uživatele.",
-        "GlobalSettingInlineHelp": "Uživatelé si mohou zakázat\/povolit levé menu nezávisle na systémové výchozí hodnotě.",
-        "UserSettingTitle": "Povolit levé menu hlášení",
-        "UserSettingInlineHelp": "Toto povolí nebo zakáže levé menu jen pro vás bez ohledu na jiné uživatele. Super uživatel může nastavit výchozí systémovou hodnotu."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/da.json b/plugins/LeftMenu/lang/da.json
deleted file mode 100644
index 27da2b16515a247bd0886dd361eb9fea1951f92b..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/da.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "LeftMenu": {
-        "SettingsIntroduction": "Venstre menu udvidelsen vil flytte rapportmenuen fra toppen til venstre, hvis aktiveret. Dette er især nyttigt for store skærme.",
-        "GlobalSettingTitle": "Venstre menu aktiveret som standard",
-        "GlobalSettingDescription": "Definerer systemets standard indstillinger for alle brugerne.",
-        "GlobalSettingInlineHelp": "Brugerne er i stand til at aktivere\/deaktivere venstremenuen uafhængigt af systemets standard indstillinger.",
-        "UserSettingTitle": "Aktiver rapportmenu til venstre",
-        "UserSettingInlineHelp": "Dette vil kun aktivere eller deaktivere venstre menuen for dig og påvirker ikke andre brugere. En superbruger kan ændre standardindstillingen for alle brugere."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/de.json b/plugins/LeftMenu/lang/de.json
deleted file mode 100644
index 997daaca2847f1a0cc70b9741dfc49ee74c6e8af..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/de.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Platziert das Dashboardmenü auf die linke Seite",
-        "SettingsIntroduction": "Das LeftMenu Plug-In verschiebt die Menüs für die Reporte auf die linke Seite. Dies ist für umfangreiche Reporte hilfreich.",
-        "GlobalSettingTitle": "LeftMenu aktiviert als Voreinstellung",
-        "GlobalSettingDescription": "Legt die Standardeinstellung für alle Benutzer fest.",
-        "GlobalSettingInlineHelp": "Die Benutzer können es unabhängig von der Vorgabe aktivieren\/deaktivieren.",
-        "UserSettingTitle": "LeftMenu aktiviert",
-        "UserSettingInlineHelp": "Legt die Einstellung für den aktuellen Benutzer fest, ob LeftMenu aktiviert oder deaktiviert sein soll. Ein Administrator kann die Standardeinstellung für alle Benutzer festlegen."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/el.json b/plugins/LeftMenu/lang/el.json
deleted file mode 100644
index e8ef94446e17835c9c33d004f18b153c8d45df1a..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/el.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Τοποθέτηση του μενού του πίνακα ελέγχου στα αριστερά.",
-        "SettingsIntroduction": "Το πρόσθετο για το αριστερό μενού θα μετακινήσει το μενού αναφορών από την κορυφή προς τα αριστερά αν ενεργοποιηθεί. Αυτό είναι ιδιαίτερα χρήσιμο για μεγάλες οθόνες.",
-        "GlobalSettingTitle": "Το αριστερό μενού είναι εξ' ορισμού ενεργοποιημένο.",
-        "GlobalSettingDescription": "Ορίζει την προεπιλογή για όλους τους χρήστες.",
-        "GlobalSettingInlineHelp": "Οι χρήστες μπορούν να απενεργοποιούν\/ενεργοποιούν το αριστερό μενού ανεξάρτητα από την προεπιλεγμένη ρύθμιση του συστήματος.",
-        "UserSettingTitle": "Ενεργοποίηση του αριστερού μενού αναφορών",
-        "UserSettingInlineHelp": "Αυτό θα ενεργοποιήσει ή απενεργοποιήσει το αριστερό μενού μόνο για εσάς και δε θα επηρεάσει άλλους χρήστες. Ένας Υπερχρήστης μπορεί να αλλάξει την προκαθορισμένη ρύθμιση για όλους τους χρήστες."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/en.json b/plugins/LeftMenu/lang/en.json
deleted file mode 100644
index 2869b864792d3aa79f4590702d50aaff89fb1352..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/en.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Position the dashboard menu to the left.",
-        "SettingsIntroduction": "The left menu plugin will move the reporting menu from the top to the left if enabled. This is especially useful for large displays.",
-        "GlobalSettingTitle": "Left menu enabled by default",
-        "GlobalSettingDescription": "Defines the system default for all of your users.",
-        "GlobalSettingInlineHelp": "Users are able to disable/enable the left menu independent of the system default.",
-        "UserSettingTitle": "Enable left reporting menu",
-        "UserSettingInlineHelp": "This will enable or disable the left menu only for you and not affect any other users. A Super User can change the default for all users."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/es.json b/plugins/LeftMenu/lang/es.json
deleted file mode 100644
index 66a3ed43f7ed1157feb6cbafb33e003b8fb1d347..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/es.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Ubicar el menú del tablero a la izquierda.",
-        "SettingsIntroduction": "El menú izquierdo del complemento moverá el menú de información desde la parte superior a la izquierda si es habilitado. Especialmente útil para pantallas grandes.",
-        "GlobalSettingTitle": "Menú izquierdo activado por defecto",
-        "GlobalSettingDescription": "Define el sistema predeterminado para todos sus usuarios.",
-        "GlobalSettingInlineHelp": "Los usuarios están habilitados a habilitar\/deshabilitar el menú izquierdo independientemente del sistema predeterminado.",
-        "UserSettingTitle": "Habilitar menú izquierdo de información",
-        "UserSettingInlineHelp": "Esto habilitará o deshabilitará el menú izquierdo solo para usted y no afectará a ningún otro usuario. Un Super Usuario puede cambiar el modo predeterminado para todos los demás usuarios."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/fi.json b/plugins/LeftMenu/lang/fi.json
deleted file mode 100644
index d2007c8cf4bb0f69b17336dc7d5bbf110283a9e0..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/fi.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "LeftMenu": {
-        "GlobalSettingTitle": "Vasen valikko oletuksena käytössä",
-        "GlobalSettingDescription": "Määrittää järjestelmän oletusasetuksen kaikille käyttäjille.",
-        "GlobalSettingInlineHelp": "Käyttäjät voivat poistaa käytöstä\/ottaa käyttöön vasemman valikon riippumatta järjestelmän oletusasetuksesta.",
-        "UserSettingTitle": "Ota vasen raportointivalikko käyttöön"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/fr.json b/plugins/LeftMenu/lang/fr.json
deleted file mode 100644
index 52b8c6b0b8953f6f803b960ab345b852d1f46001..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/fr.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Positionne le menu du tableau de bord sur la gauche.",
-        "SettingsIntroduction": "Le composant de menu à gauche va déplacer le menu de rapport d'en haut vers la gauche s'il est activé. C'est particulièrement utile pour les affichages larges.",
-        "GlobalSettingTitle": "Menu de gauche activé par défaut",
-        "GlobalSettingDescription": "Définit les valeurs système par défaut pour tous les utilisateurs.",
-        "GlobalSettingInlineHelp": "Les utilisateurs peuvent activer\/désactiver le menu de gauche indépendant des valeurs par défaut du système.",
-        "UserSettingTitle": "Activer le menu de rapport de gauche",
-        "UserSettingInlineHelp": "Cela va activer ou désactiver le menu de gauche pour vous uniquement et ne pas affecter les autres utilisateurs. Un super utilisateur peut modifier le paramètre par défaut pour tous les utilisateurs."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/hi.json b/plugins/LeftMenu/lang/hi.json
deleted file mode 100644
index b45521c7e659a65a8ebb75277981307353f95567..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/hi.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "बाईं ओर डैशबोर्ड मेनू स्थिति।",
-        "SettingsIntroduction": "अगर सक्रिय बाएँ मेनू प्लगइन बाईं ओर ऊपर से रिपोर्टिंग मेनू कदम होगा। इस बड़े डिस्प्ले के लिए विशेष रूप से उपयोगी है।",
-        "GlobalSettingTitle": "डिफ़ॉल्ट रूप से सक्षम बाएँ मेनू",
-        "GlobalSettingDescription": "आपके सभी उपयोगकर्ताओं के लिए सिस्टम मूलभूत को परिभाषित करता है।",
-        "GlobalSettingInlineHelp": "उपयोगकर्ता निष्क्रिय \/ सिस्टम डिफ़ॉल्ट के बाईं ओर मेनू स्वतंत्र सक्षम करने में सक्षम हैं।",
-        "UserSettingTitle": "छोड़ दिया रिपोर्टिंग मेनू सक्षम करें",
-        "UserSettingInlineHelp": "इस सक्षम है या केवल आप के लिए छोड़ दिया मेनू को अक्षम और किसी भी अन्य उपयोगकर्ताओं को प्रभावित नहीं करेगा । एक सुपर उपयोगकर्ता सभी उपयोगकर्ताओं के लिए डिफ़ॉल्ट बदल सकते हैं।"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/it.json b/plugins/LeftMenu/lang/it.json
deleted file mode 100644
index 844623abbc92a421674bb85a8f1a3f3dc2090e89..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/it.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Posiziona il menù dashboard sulla sinistra.",
-        "SettingsIntroduction": "Il plugin menù di sinistra sposta il menu di segnalazione dalla parte superiore a sinistra, se abilitato. Ciò è particolarmente utile per i display di grandi dimensioni.",
-        "GlobalSettingTitle": "Il menù di sinistra è abilitato di default",
-        "GlobalSettingDescription": "Definisce le impostazioni predefinite di sistema per tutti gli utenti.",
-        "GlobalSettingInlineHelp": "Gli utenti possono disabilitare o abilitare il menù di sinistra indipendentemente dalle impostazioni predefinite del sistema.",
-        "UserSettingTitle": "Abilita il menù di segnalazione di sinistra",
-        "UserSettingInlineHelp": "Questo abilita o disabilita il menù di sinistra solo per te e non ha effetto per gli altri utenti. Un Super User può cambiare per tutti gli utenti le impostazioni predefinite."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/ja.json b/plugins/LeftMenu/lang/ja.json
deleted file mode 100644
index 6d4e82e5ec44515c8b46aa296b31a5e092067525..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/ja.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "LeftMenu": {
-        "SettingsIntroduction": "左メニューのプラグインは、有効化されている場合、レポートメニューをトップから左に移動します。この移動は、特に大きなディスプレイをお使いの場合、便利です。",
-        "GlobalSettingTitle": "デフォルトにより有効化された左メニュー",
-        "GlobalSettingDescription": "全サイトユーザーのためのシステムデフォルトを定義",
-        "GlobalSettingInlineHelp": "ユーザーは、システムデフォルトの左メニューの独立を無効 \/ 有効にすることができます。",
-        "UserSettingTitle": "左のレポートメニューを有効にする",
-        "UserSettingInlineHelp": "これは、左メニューをあなたのためだけに有効または無効にし、他のユーザーには影響しません。スーパーユーザーは、全てのユーザーに対するデフォルト設定を変更できます。"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/nl.json b/plugins/LeftMenu/lang/nl.json
deleted file mode 100644
index f3dcf078a814ce92d6e32674d892a872d10003f7..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/nl.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Plaats het dashboard menu aan de linkerzijde",
-        "SettingsIntroduction": "De linkermenu plugin verplaatst indien ingeschakeld het menu van bovenaan de pagina naar links. Deze optie is vooral handig bij het gebruik van een groot scherm.",
-        "GlobalSettingTitle": "Linker menu standaard ingeschakeld",
-        "GlobalSettingDescription": "Definieert het systeem standaard voor al uw gebruikers.",
-        "GlobalSettingInlineHelp": "De gebruikers hebben de mogelijkheid om het linkermenu in of uit te schakelen los van de algemene instellingen.",
-        "UserSettingTitle": "Schakel het linker menu in.",
-        "UserSettingInlineHelp": "Dit zal het linkermenu alleen voor u en niet voor andere gebruikers inschakelen. Een Super User kan de standaard instelling voor alle gebruikers aanpassen."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/pl.json b/plugins/LeftMenu/lang/pl.json
deleted file mode 100644
index c75b2ea5d800936fa50ad410f05d655c63d67f74..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/pl.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "LeftMenu": {
-        "GlobalSettingTitle": "Menu po lewej stronie domyślnie włączone",
-        "GlobalSettingDescription": "Definiuje domyślne systemu dla wszystkich użytkowników."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/pt-br.json b/plugins/LeftMenu/lang/pt-br.json
deleted file mode 100644
index 69c7444974d6cc909fc5f91c5ab65375637e6249..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/pt-br.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Posiciona o menu do painel de controle à esquerda.",
-        "SettingsIntroduction": "O plugin de menu lateral irá mover o menu de relatórios do topo para a esquerda, se habilitado. Isto é útil especialmente para telas de grandes proporções.",
-        "GlobalSettingTitle": "Menu lateral habilitado por padrão",
-        "GlobalSettingDescription": "Define o padrão do sistema para todos os usuários.",
-        "GlobalSettingInlineHelp": "Usuários podem habilitar ou desabilitar o menu lateral independentemente do padrão do sistema.",
-        "UserSettingTitle": "Habilitar o menu lateral de relatórios",
-        "UserSettingInlineHelp": "Isto irá habilitar ou desabilitar o menu lateral apenas para você, sem afetar nenhum outro usuário. Um superusuário poderá alterar o padrão para todos os usuários."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/pt.json b/plugins/LeftMenu/lang/pt.json
deleted file mode 100644
index 787044a2ec73b2edaaa0a0e09485d78262a3c698..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/pt.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Posiçionar o painel do menu na esquerda.",
-        "SettingsIntroduction": "O plugin menu à esquerda irá mover o menu dos relatórios do topo à esquerda se estiver ativado. Isto é especialmente útil para grandes ecrãs.",
-        "GlobalSettingTitle": "Menu esquerdo ativo por padrão.",
-        "GlobalSettingDescription": "Definição do sistema padrão para todos os usuários.",
-        "GlobalSettingInlineHelp": "Os utilizadores são capazes de ativar ou desativar o menu na esquerda independentemente da preferência padrão do sistema.",
-        "UserSettingTitle": "Ative o menu relatório na esquerda.",
-        "UserSettingInlineHelp": "Isso irá ativar ou desativar o menu à esquerda apenas para ti e não afecta quaisquer outros utilizadores. Um super user pode alterar o padrão para todos os utilizadores."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/ro.json b/plugins/LeftMenu/lang/ro.json
deleted file mode 100644
index fa63c4cac6924772cbcee86f5cea59e6ea480ca0..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/ro.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "LeftMenu": {
-        "SettingsIntroduction": "Modulul meniului din stânga va muta meniul de raportare din partea de sus în partea stângă dacă este activat. Acesta este folositor în special în cazul ecranelor mari.",
-        "GlobalSettingTitle": "Meniul din stânnga este activat implicit",
-        "GlobalSettingDescription": "Definește valoarea implicită pentru toți utilizatorii.",
-        "GlobalSettingInlineHelp": "Utilizatorii pot dezactiva\/activa meniul din stânga independet de valoare implicită.",
-        "UserSettingTitle": "Activează meniul de raportare din stânga",
-        "UserSettingInlineHelp": "Acesta va activa sau dezactiva meniul din stânga doar pentru dumneavoastra și nu va afecta alți utilizatori. Un Super Utilizator va putea schimba modul implicit pentru toți utilizatorii."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/ru.json b/plugins/LeftMenu/lang/ru.json
deleted file mode 100644
index e0d825348b4165d89048efe2a07f1ac67b18f3c1..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/ru.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "LeftMenu": {
-        "SettingsIntroduction": "Если включить плагин LeftMenu, он переместит главное меню сверху налево. Это будет удобно для больших экранов.",
-        "GlobalSettingTitle": "Левое меню включено поумолчанию",
-        "GlobalSettingDescription": "Определяет значение по умолчанию для всех пользователей.",
-        "GlobalSettingInlineHelp": "Пользователи имеют возможность отключить\/включить левое меню независимо от значения по умолчанию.",
-        "UserSettingInlineHelp": "Это включает или отключает левое меню только для вас и не влияет на других пользователей. Суперпользователь может изменить настройки по умолчанию для всех пользователей."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/sr.json b/plugins/LeftMenu/lang/sr.json
deleted file mode 100644
index e2aaa6bbc15094efafab9f1d5324c1c621b9f2ac..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/sr.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Postavi meni za konzolu na levu stranu.",
-        "SettingsIntroduction": "Dodatak za levi meni će pomeriti meni za izveštaje sa vrha na levu stranu. Ovo je praktično od velikih monitora.",
-        "GlobalSettingTitle": "Levi meni je podrazumevano uključen",
-        "GlobalSettingDescription": "Postavljanje podrazumevanih vrednosti za sve korisnike.",
-        "GlobalSettingInlineHelp": "Korisnici mogu da uključuju i isključuju levi meni nezavisno od podrazumevanih sistemskih podešavanja.",
-        "UserSettingTitle": "Omogući meni sa leve strane",
-        "UserSettingInlineHelp": "Ova opcija će uključiti ili isključiti meni sa leve strane samo za vas a ne i za ostale korisnike. Superkorisnik može da promeni podrazumevane vrednosti za sve korisnike."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/sv.json b/plugins/LeftMenu/lang/sv.json
deleted file mode 100644
index aeaa07d522745808c8846454b1dfc699c5006212..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/sv.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
-    "LeftMenu": {
-        "PluginDescription": "Placera menyn till vänster.",
-        "SettingsIntroduction": "Tillägget för vänstermeny kommer, ifall det är aktiverat, flytta rapportmenyn till den vänstra sidan. Detta är speciellt användbart för större skärmar.",
-        "GlobalSettingTitle": "Vänster meny aktiverad som standard",
-        "GlobalSettingDescription": "Definierar systemets standardinställning för alla dina användare.",
-        "GlobalSettingInlineHelp": "Användare har möjlighet att aktivera\/deaktivera vänstermenyn oavhängigt systeminställningarna.",
-        "UserSettingTitle": "Aktivera vänster rapporteringsmeny",
-        "UserSettingInlineHelp": "Detta kommer aktivera\/deaktivera för dig utan att påverka andra användare. En Super User kan ändra inställningen för samtliga användare."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/tl.json b/plugins/LeftMenu/lang/tl.json
deleted file mode 100644
index 2a6a0045b6e1bf8aa9d0cf975ca52e998b56d870..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/tl.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "LeftMenu": {
-        "SettingsIntroduction": "Ang kaliwang menu na may plugin ay pwedeng ilipat ang menu kung saan makikita ang ulat mula sa taas papunta sa kaliwa kung ito ay gumagana. Ito ay lalong mapapakinabangan sa malalaking display.",
-        "GlobalSettingTitle": "Ang kaliwa menu ay gumagana bilang default",
-        "GlobalSettingDescription": "Tinutukoy ang default system para sa lahat ng iyong mga user.",
-        "GlobalSettingInlineHelp": "Ang user ay maari makapag pagana o hindi makapag pagana ng menu sa kaliwa na independent sa system default.",
-        "UserSettingTitle": "Pagahanin ang kaliwang menu na pang ulat",
-        "UserSettingInlineHelp": "Ang menu sa kaliwa ay pwede mong paganahin o wag paganahin at hindi maapektuhan ang ibang mga user. Ang Super User ay pwedeng baguhin ang lahat pangunahing pagpipilian sa lahat ng users."
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/tr.json b/plugins/LeftMenu/lang/tr.json
deleted file mode 100644
index ab8dbb51d8aaeae02348223b37b180dc62bbe28c..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/tr.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "LeftMenu": {
-        "UserSettingTitle": "Sol raporlama menüsünü etkinleştir"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/lang/zh-cn.json b/plugins/LeftMenu/lang/zh-cn.json
deleted file mode 100644
index fef3e18afd1c7c8a887f95bc3433ec6a480c66e2..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/lang/zh-cn.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "LeftMenu": {
-        "GlobalSettingTitle": "左菜单默认打开",
-        "UserSettingTitle": "开启左边的报表菜单"
-    }
-}
\ No newline at end of file
diff --git a/plugins/LeftMenu/stylesheets/theme.less b/plugins/LeftMenu/stylesheets/theme.less
deleted file mode 100644
index 6c15ee301e197ca1c29274eb4f6d7c51a03c80e4..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/stylesheets/theme.less
+++ /dev/null
@@ -1,150 +0,0 @@
-.leftMenuPlugin {
-
-  #container {
-    clear: left;
-  }
-
-  #root .Menu--dashboard {
-    border: 0px;
-
-    > .Menu-tabList {
-      margin-left: 5px;
-      margin-bottom: 0;
-      margin-top: 0.1em;
-      border: 1px solid @theme-color-background-lowContrast;
-    }
-    
-    > li {
-      border-bottom: 1px solid @theme-color-background-lowContrast;
-    }
-  }
-
-  #content.home {
-    padding-top: 15px;
-    display:inline-block;
-    width:100%;
-  }
-
-  .Menu--dashboard {
-    padding: 0;
-    float: left;
-    width: 240px;
-    padding-top: 24px;
-    clear: left;
-
-    > .Menu-tabList {
-      -moz-background-size: 5px 100%;
-      background-size: 5px 100%;
-      background-position: 0 0, 100% 0;
-      background-repeat: no-repeat;
-
-      > li {
-        > ul {
-          min-height: 0;
-          max-height: 0;
-          padding: 0;
-          overflow: hidden;
-          position: static;
-          float: none;
-        }
-
-        > span,
-        > a {
-          display: block;
-          padding: 5px 10px;
-          font-size: 18px;
-          line-height: 24px;
-          text-decoration: none;
-          float: none;
-        }
-      }
-
-      > .sfActive > ul {
-        padding-bottom: 5px;
-        max-height: 500px; /* That's a hack for CSS transitions */
-      }
-
-      li {
-        list-style: none;
-        margin: 0;
-        float: none;
-        border: 0;
-        border-radius: 0;
-        background: transparent;
-
-        a:hover {
-          text-decoration: underline;
-        }
-
-        li {
-          float: none;
-          text-align: left;
-
-          a {
-            text-decoration: none;
-            padding: 0.6em 0.9em;
-            font: 14px Arial, Helvetica, sans-serif;
-            display: block;
-
-            &.current {
-              background: #defdbb;
-            }
-
-            &:link,
-            &:visited {
-              text-decoration: none;
-            }
-          }
-
-        }
-      }
-
-      a {
-        height: auto;
-      }
-
-      > .sfActive > a,
-      > li > a:hover {
-        background: #f1f1f1;
-      }
-
-      > .sfActive .sfHover > a {
-        font-weight: bold;
-      }
-    }
-  }
-
-  .top_controls {
-    clear: none;
-    left: 34px;
-  }
-
-  .nav_sep {
-    display: none;
-  }
-
-  .top_bar_sites_selector {
-    float: left;
-  }
-
-  .pageWrap {
-    margin-left: 240px;
-    margin-top: 0;
-    max-height: none;
-  }
-
-  .widget:first-child {
-    margin-top: 0;
-  }
-
-  .sites_selector_in_dashboard {
-    margin-top: 0px;
-    margin-left: 5px;
-  }
-
-  .sites_autocomplete .custom_select_main_link {
-    padding-top: 7px;
-    padding-bottom: 7px;
-  }
-
-}
diff --git a/plugins/LeftMenu/tests/Integration/APITest.php b/plugins/LeftMenu/tests/Integration/APITest.php
deleted file mode 100644
index c53616590592d62073ee27973dbaede60761a25e..0000000000000000000000000000000000000000
--- a/plugins/LeftMenu/tests/Integration/APITest.php
+++ /dev/null
@@ -1,149 +0,0 @@
-<?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\LeftMenu\tests\Integration;
-
-use Piwik\Plugins\LeftMenu\API;
-use Piwik\Plugins\LeftMenu\Settings;
-use Piwik\Tests\Framework\Mock\FakeAccess;
-use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
-
-/**
- * @group LeftMenu
- * @group APITest
- * @group Plugins
- */
-class APITest extends IntegrationTestCase
-{
-    /**
-     * @var API
-     */
-    private $api;
-
-    /**
-     * @var Settings
-     */
-    private $settings;
-
-    public function setUp()
-    {
-        parent::setUp();
-
-        $this->api = API::getInstance();
-        $this->createSettings();
-    }
-
-    public function test_isEnabled_shouldReturnFalse_ByDefault()
-    {
-        $this->assertLeftMenuIsDisabled();
-
-        $this->setUser();
-        $this->assertLeftMenuIsDisabled();
-
-        $this->setSuperUser();
-        $this->assertLeftMenuIsDisabled();
-    }
-
-    public function test_isEnabled_shouldReturnTrue_IfEnabledSystemWideAndNoUserPreference()
-    {
-        $this->enableLeftMenuForAll();
-
-        $this->assertLeftMenuIsEnabled();
-
-        $this->setUser();
-        $this->assertLeftMenuIsEnabled();
-
-        $this->setAnonymous();
-        $this->assertLeftMenuIsEnabled();
-    }
-
-    public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultDisabled()
-    {
-        $this->assertLeftMenuIsDisabled();
-
-        $this->setUser();
-        $this->setUserSettingValue('yes');
-
-        $this->assertLeftMenuIsEnabled();
-
-        $this->setAnonymous();
-        $this->assertLeftMenuIsDisabled();
-    }
-
-    public function test_isEnabled_AUserPreferenceShouldOverwriteASystemPreference_DefaultEnabled()
-    {
-        $this->enableLeftMenuForAll();
-
-        $this->assertLeftMenuIsEnabled();
-
-        $this->setUser();
-        $this->setUserSettingValue('no');
-
-        $this->assertLeftMenuIsDisabled();
-
-        $this->setAnonymous();
-        $this->assertLeftMenuIsEnabled();
-    }
-
-    private function assertLeftMenuIsEnabled()
-    {
-        $this->assertTrue($this->api->isEnabled());
-    }
-
-    private function assertLeftMenuIsDisabled()
-    {
-        $this->assertFalse($this->api->isEnabled());
-    }
-
-    private function setSuperUser()
-    {
-        FakeAccess::$superUser = true;
-        FakeAccess::$superUserLogin = 'superUserLogin';
-
-        $this->createSettings();
-    }
-
-    private function setAnonymous()
-    {
-        FakeAccess::clearAccess();
-        $this->createSettings();
-    }
-
-    private function setUser()
-    {
-        FakeAccess::$idSitesView = array(1);
-        FakeAccess::$identity    = 'userLogin';
-
-        $this->createSettings();
-    }
-
-    private function enableLeftMenuForAll()
-    {
-        $this->setSuperUser();
-        $this->settings->globalEnabled->setValue(true);
-        $this->settings->save();
-    }
-
-    private function createSettings()
-    {
-        $this->settings = new Settings('LeftMenu');
-    }
-
-    private function setUserSettingValue($value)
-    {
-        $this->settings->userEnabled->setValue($value);
-        $this->settings->save();
-    }
-
-    public function provideContainerConfig()
-    {
-        return array(
-            'Piwik\Access' => new FakeAccess()
-        );
-    }
-}
diff --git a/plugins/Live/stylesheets/live.less b/plugins/Live/stylesheets/live.less
index a071c10f0aa65f4fd6f98365c222310c4b8f6b66..230893a741a02c08037683007ceecba55b08110e 100644
--- a/plugins/Live/stylesheets/live.less
+++ b/plugins/Live/stylesheets/live.less
@@ -251,11 +251,18 @@ a.visitor-log-visitor-profile-link {
 
 .action-list-action-icon {
     float:left;
-    margin-top:6px;
     margin-right:4px;
 
     &.event {
-      margin-top: 1px;
+      margin-top: 0;
+    }
+    &.outlink {
+      margin-top: 4px;
+      margin-right: 4px;
+      margin-left: 4px;
+    }
+    &.search {
+      margin-right: 4px;
     }
 }
 
diff --git a/plugins/Live/templates/_actionsList.twig b/plugins/Live/templates/_actionsList.twig
index 3d6f1a107518dd06a3aefcbf2cd11825006b8718..82f651d7d30cc1775c52dbda2b8d5bed50d7c29c 100644
--- a/plugins/Live/templates/_actionsList.twig
+++ b/plugins/Live/templates/_actionsList.twig
@@ -83,7 +83,7 @@
             {% endif %}
             {% if action.siteSearchKeyword is defined %}
                 {% if action.type == 'search' %}
-                    <img src='{{ action.icon }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}' class="action-list-action-icon">
+                    <img src='{{ action.icon }}' title='{{ 'Actions_SubmenuSitesearch'|translate }}' class="action-list-action-icon search">
                 {% endif %}
                 <span class="truncated-text-line">{{ action.siteSearchKeyword }}</span>
             {% endif %}
@@ -94,7 +94,7 @@
             {% if action.url is not empty %}
                 {% if action.type == 'action' and action.pageTitle|default(false) is not empty %}<p>{% endif %}
                 {% if action.type == 'download' or action.type == 'outlink' %}
-                    <img src='{{ action.icon }}' class="action-list-action-icon">
+                    <img src='{{ action.icon }}' class="action-list-action-icon {{ action.type }}">
                 {% endif %}
 
                 {% if action.eventCategory|default(false) is not empty
diff --git a/plugins/MobileMessaging/ReportRenderer/Sms.php b/plugins/MobileMessaging/ReportRenderer/Sms.php
index f3c19d77b4e2947b88ff921f1044ef3912e87b8b..96b72912404bc985c0dd95dd2626a9d760d6f30c 100644
--- a/plugins/MobileMessaging/ReportRenderer/Sms.php
+++ b/plugins/MobileMessaging/ReportRenderer/Sms.php
@@ -95,7 +95,8 @@ class Sms extends ReportRenderer
                  $evolutionMetrics,
                  function ($value) use ($floatRegex) {
                      $matched = preg_match($floatRegex, $value, $matches);
-                     return $matched ? sprintf("%+d", $matches[0]) : $value;
+                     $formatted = $matched ? sprintf("%+d", $matches[0]) : $value;
+                     return \Piwik\NumberFormatter::getInstance()->formatPercentEvolution($formatted);
                  }
             )
         );
diff --git a/plugins/MobileMessaging/templates/SMSReport.twig b/plugins/MobileMessaging/templates/SMSReport.twig
index 6c0d38f2cdadd522ed503616492c0053dd4b1b4a..09f41ece8076a1dc588ce6d71c08f6212a205336 100644
--- a/plugins/MobileMessaging/templates/SMSReport.twig
+++ b/plugins/MobileMessaging/templates/SMSReport.twig
@@ -11,33 +11,33 @@
     {%- if displaySiteName -%}{{ rowMetrics.label|raw }}: {% endif -%}
 
     {# visits #}
-    {{- rowMetrics.nb_visits }} {{ 'General_ColumnNbVisits'|translate }}
-    {%- if rowMetrics.visits_evolution != 0 %} ({{ rowMetrics.visits_evolution }}%){%- endif -%}
+    {{- rowMetrics.nb_visits|number }} {{ 'General_ColumnNbVisits'|translate }}
+    {%- if rowMetrics.visits_evolution != 0 %} ({{ rowMetrics.visits_evolution|percentEvolution }}){%- endif -%}
 
     {%- if rowMetrics.nb_visits != 0 -%}
         {#- actions -#}
-        , {{ rowMetrics.nb_actions }} {{ 'General_ColumnNbActions'|translate }}
-        {%- if rowMetrics.actions_evolution != 0 %} ({{ rowMetrics.actions_evolution }}%){%- endif -%}
+        , {{ rowMetrics.nb_actions|number }} {{ 'General_ColumnNbActions'|translate }}
+        {%- if rowMetrics.actions_evolution != 0 %} ({{ rowMetrics.actions_evolution|percentEvolution }}){%- endif -%}
 
         {%- if isGoalPluginEnabled -%}
 
             {# goal metrics #}
             {%- if rowMetrics.nb_conversions != 0 -%}
                 , {{ 'General_ColumnRevenue'|translate }}: {{ rowMetrics.revenue|raw }}
-                {%- if rowMetrics.revenue_evolution != 0 %} ({{ rowMetrics.revenue_evolution }}%){%- endif -%}
+                {%- if rowMetrics.revenue_evolution != 0 %} ({{ rowMetrics.revenue_evolution|percentEvolution }}){%- endif -%}
 
-                , {{ rowMetrics.nb_conversions }} {{ 'Goals_GoalConversions'|translate }}
-                {%- if rowMetrics.nb_conversions_evolution != 0 %} ({{ rowMetrics.nb_conversions_evolution }}%){%- endif -%}
+                , {{ rowMetrics.nb_conversions|number }} {{ 'Goals_GoalConversions'|translate }}
+                {%- if rowMetrics.nb_conversions_evolution != 0 %} ({{ rowMetrics.nb_conversions_evolution|percentEvolution }}){%- endif -%}
             {%- endif -%}
 
             {# eCommerce metrics #}
             {%- if siteHasECommerce[rowMetadata.idsite] -%}
 
                 , {{ 'General_ProductRevenue'|translate }}: {{ rowMetrics.ecommerce_revenue|raw }}
-                {%- if rowMetrics.ecommerce_revenue_evolution != 0 %} ({{ rowMetrics.ecommerce_revenue_evolution }}%){%- endif -%}
+                {%- if rowMetrics.ecommerce_revenue_evolution != 0 %} ({{ rowMetrics.ecommerce_revenue_evolution|percentEvolution }}){%- endif -%}
 
-                , {{ rowMetrics.orders }} {{ 'General_EcommerceOrders'|translate }}
-                {%- if rowMetrics.orders_evolution != 0 %} ({{ rowMetrics.orders_evolution }}%){%- endif -%}
+                , {{ rowMetrics.orders|number }} {{ 'General_EcommerceOrders'|translate }}
+                {%- if rowMetrics.orders_evolution != 0 %} ({{ rowMetrics.orders_evolution|percentEvolution }}){%- endif -%}
             {%- endif -%}
 
         {%- endif -%}
diff --git a/plugins/Morpheus/Menu.php b/plugins/Morpheus/Menu.php
index 740263e3818629977f8e8a8294974e1f5e33a3f2..c2bd081cdfc3cc2c1da31e46849713e46afcbc53 100644
--- a/plugins/Morpheus/Menu.php
+++ b/plugins/Morpheus/Menu.php
@@ -17,12 +17,23 @@ class Menu extends \Piwik\Plugin\Menu
 {
     public function configureAdminMenu(MenuAdmin $menu)
     {
+        $menu->registerMenuIcon('CoreAdminHome_MenuDevelopment', 'icon-admin-development');
+        $menu->registerMenuIcon('CoreAdminHome_MenuDiagnostic', 'icon-admin-diagnostic');
+        $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-admin-platform');
+        $menu->registerMenuIcon('General_Settings', 'icon-admin-settings');
+        $menu->registerMenuIcon('CoreAdminHome_Administration', 'icon-admin-administration');
+
         if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) {
             $menu->addDevelopmentItem('UI Demo', $this->urlForAction('demo'));
         }
     }
+
     public function configureUserMenu(MenuUser $menu)
     {
+        $menu->registerMenuIcon('UsersManager_MenuPersonal', 'icon-user-personal');
+        $menu->registerMenuIcon('CoreAdminHome_MenuManage', 'icon-user-manage');
+        $menu->registerMenuIcon('CorePluginsAdmin_MenuPlatform', 'icon-user-platform');
+
         if (Development::isEnabled() && Piwik::isUserHasSomeAdminAccess()) {
             $menu->addPlatformItem('UI Demo', $this->urlForAction('demo'), $order = 15);
         }
diff --git a/plugins/Morpheus/fonts/piwik.eot b/plugins/Morpheus/fonts/piwik.eot
old mode 100644
new mode 100755
index bd41afad9edb7d1ea2aa18ac9b0b38e047a5082a..3bda40841acba8c6ab0a9fa6808758a9135b4e7f
Binary files a/plugins/Morpheus/fonts/piwik.eot and b/plugins/Morpheus/fonts/piwik.eot differ
diff --git a/plugins/Morpheus/fonts/piwik.ttf b/plugins/Morpheus/fonts/piwik.ttf
old mode 100644
new mode 100755
index c81d69e10c28ed59c451ad46f2579a98e269dbb9..7887145303ba8702d9a7b59d1bfc9467cc7990bf
Binary files a/plugins/Morpheus/fonts/piwik.ttf and b/plugins/Morpheus/fonts/piwik.ttf differ
diff --git a/plugins/Morpheus/images/logo.svg b/plugins/Morpheus/images/logo.svg
index d288e2072ec8f068fde88771531a55324440990e..8c0be81ce932426e9169e37e655e6fbce869d646 100644
--- a/plugins/Morpheus/images/logo.svg
+++ b/plugins/Morpheus/images/logo.svg
@@ -3,22 +3,22 @@
 <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
 	 width="170.666px" height="45.704px" viewBox="0 0 170.666 45.704" enable-background="new 0 0 170.666 45.704"
 	 xml:space="preserve">
-<path fill="#D42A1F" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345
+<path fill="#d4291f" d="M106.995,1.016c-2.57-0.739-5.251,0.751-5.987,3.329l-5.532,19.351L89.943,4.345
 	c-0.592-2.071-2.441-3.417-4.477-3.492c-0.103-0.009-0.203-0.004-0.306-0.007c-0.102,0.003-0.203-0.003-0.306,0.007
 	c-2.036,0.075-3.885,1.421-4.477,3.492l-5.509,19.27l-5.509-19.27c-0.737-2.578-3.418-4.068-5.987-3.329
 	c-2.57,0.739-4.056,3.428-3.319,6.005l10.075,35.24c0.583,2.038,2.384,3.376,4.382,3.49c0.121,0.011,0.239,0.006,0.359,0.008
 	c0.12-0.002,0.238,0.004,0.359-0.008c1.998-0.114,3.799-1.451,4.382-3.49l5.551-19.416l5.551,19.416
 	c0.588,2.056,2.416,3.398,4.434,3.491c0.111,0.01,0.219,0.005,0.33,0.007c0.11-0.003,0.219,0.003,0.33-0.007
 	c2.019-0.093,3.846-1.435,4.434-3.491l10.075-35.24C111.05,4.444,109.564,1.756,106.995,1.016z"/>
-<path fill="#D42A1F" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147
+<path fill="#d4291f" d="M116.502,40.44c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.147
 	c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44z"/>
-<path fill="#D42A1F" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164
+<path fill="#d4291f" d="M43.334,40.457c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322V6.164
 	c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.457z"/>
-<path fill="#D42A1F" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0
+<path fill="#d4291f" d="M155.406,23.156l13.779-13.779c1.974-1.974,1.974-5.097,0-7.071c-1.974-1.974-5.097-1.974-7.071,0
 	l-16.448,16.448V6.147c0-2.972-2.35-5.322-5.322-5.322c-2.972,0-5.322,2.35-5.322,5.322V40.44c0,2.972,2.35,5.322,5.322,5.322
 	c2.972,0,5.322-2.35,5.322-5.322v-7.544l2.669-2.669l13.618,13.857c1.957,1.992,5.079,2.019,7.071,0.062
 	c1.992-1.957,2.019-5.079,0.062-7.071L155.406,23.156z"/>
-<path fill="#D42A1F" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177
+<path fill="#d4291f" d="M37.292,16.816c0-8.58-6.787-15.557-15.283-15.9l0.007-0.033H5.322C2.35,0.883,0,3.233,0,6.205v34.177
 	c0,2.972,2.35,5.322,5.322,5.322c2.972,0,5.322-2.35,5.322-5.322v-7.63h11.371l-0.007-0.036
 	C30.505,32.372,37.292,25.396,37.292,16.816z M20.296,23.284l0-0.002h-9.651V10.491h9.464c3.535,0,6.401,2.866,6.401,6.401
 	C26.51,20.364,23.744,23.184,20.296,23.284z"/>
diff --git a/plugins/Morpheus/images/signout.png b/plugins/Morpheus/images/signout.png
new file mode 100644
index 0000000000000000000000000000000000000000..2d377ddf984d5b85c735cccb8c4a022da40df07e
Binary files /dev/null and b/plugins/Morpheus/images/signout.png differ
diff --git a/plugins/Morpheus/javascripts/piwikHelper.js b/plugins/Morpheus/javascripts/piwikHelper.js
index a8048c9b51fd0d9e01d85872a38823464bd205ae..1e413fba146c82ee76563e6e14296037ca271621 100644
--- a/plugins/Morpheus/javascripts/piwikHelper.js
+++ b/plugins/Morpheus/javascripts/piwikHelper.js
@@ -125,7 +125,8 @@ var piwikHelper = {
     compileAngularComponents: function (selector) {
         var $element = $(selector);
 
-        if (!$element || !$element.length) {
+        if (!$element.length) {
+
             return;
         }
 
@@ -135,6 +136,18 @@ var piwikHelper = {
         });
     },
 
+    /**
+     * Detection works currently only for directives defining an isolated scope. Functionality might need to be
+     * extended if needed. Under circumstances you might call this method before calling compileAngularComponents()
+     * to avoid compiling the same element twice.
+     * @param selector
+     */
+    isAlreadyCompiledAngularComponent: function (selector) {
+        var $element = $(selector);
+
+        return ($element.length && $element.hasClass('ng-isolate-scope'));
+    },
+
     /**
      * Displays a Modal dialog. Text will be taken from the DOM node domSelector.
      * Given callback handles will be mapped to the buttons having a role attriute
diff --git a/plugins/Morpheus/stylesheets/base/colors.less b/plugins/Morpheus/stylesheets/base/colors.less
index 21ac03438df44f2f265188b80f7bea3e5474aee7..89ec7ff92dbbaa430c9be4c766e9220d6016202f 100644
--- a/plugins/Morpheus/stylesheets/base/colors.less
+++ b/plugins/Morpheus/stylesheets/base/colors.less
@@ -42,4 +42,3 @@
 Qualitative data color series inspired from colorbrewer2.org/
 next ones could be: #cab2d6 #ffff99 # #b2df8a
 */
-
diff --git a/plugins/Morpheus/stylesheets/base/icons.css b/plugins/Morpheus/stylesheets/base/icons.css
index 3424d8a65501d146980c2117e812250c0ccc2380..d11c5592e3ab19e9e61b7382aa4236f1db5e6824 100644
--- a/plugins/Morpheus/stylesheets/base/icons.css
+++ b/plugins/Morpheus/stylesheets/base/icons.css
@@ -26,27 +26,15 @@
 .icon-alien:before {
     content: "\e600";
 }
-.icon-add:before {
-    content: "\e630";
-}
 .icon-annotation:before {
     content: "\e601";
 }
-.icon-arrow-bottom:before {
-    content: "\e63b";
-}
-.icon-arrow-collapsed:before {
-    content: "\e60b";
-}
 .icon-arrow-left:before {
     content: "\e602";
 }
 .icon-arrow-right:before {
     content: "\e603";
 }
-.icon-arrow-top:before {
-    content: "\e63a";
-}
 .icon-business:before {
     content: "\e604";
 }
@@ -56,24 +44,30 @@
 .icon-chart-bar:before {
     content: "\e606";
 }
-.icon-chart-line:before {
-    content: "\e608";
-}
 .icon-chart-line-details:before {
     content: "\e607";
 }
+.icon-chart-line:before {
+    content: "\e608";
+}
 .icon-chart-pie:before {
     content: "\e609";
 }
 .icon-close:before {
     content: "\e60a";
 }
-.icon-code:before {
-    content: "\e620";
+.icon-arrow-collapsed:before {
+    content: "\e60b";
 }
 .icon-configure:before {
     content: "\e60c";
 }
+.icon-datepicker-arr-l:before {
+	content: "\e60d";
+}
+.icon-datepicker-arr-r:before {
+	content: "\e60e";
+}
 .icon-delete:before {
     content: "\e60f";
 }
@@ -92,9 +86,6 @@
 .icon-ecommerce-order:before {
     content: "\e614";
 }
-.icon-edit:before {
-    content: "\e622";
-}
 .icon-email:before {
     content: "\e615";
 }
@@ -110,26 +101,32 @@
 .icon-finance:before {
     content: "\e619";
 }
-.icon-folder:before {
-    content: "\e61b";
-}
 .icon-folder-charts:before {
     content: "\e61a";
 }
+.icon-folder:before {
+    content: "\e61b";
+}
 .icon-fullscreen:before {
     content: "\e61c";
 }
 .icon-goal:before {
     content: "\e61d";
 }
+.icon-help-alt:before {
+    content: "\e61e";
+}
 .icon-help:before {
     content: "\e61f";
 }
-.icon-help-alt:before {
-    content: "\e61e";
+.icon-code:before {
+    content: "\e620";
 }
-.icon-hide:before {
-    content: "\e638";
+.icon-warning:before {
+    content: "\e621";
+}
+.icon-edit:before {
+    content: "\e622";
 }
 .icon-image:before {
     content: "\e623";
@@ -140,13 +137,13 @@
 .icon-insights:before {
     content: "\e625";
 }
-.icon-locked:before {
-    content: "\e627";
-}
 .icon-locked-2:before {
     content: "\e626";
 }
 .icon-locked-3:before {
+    content: "\e627";
+}
+.icon-locked:before {
     content: "\e628";
 }
 .icon-locked-4:before {
@@ -170,12 +167,12 @@
 .icon-open-source:before {
     content: "\e62f";
 }
-.icon-play:before {
-    content: "\e643";
-}
 .icon-plus:before {
     content: "\e630";
 }
+.icon-add:before {
+    content: "\e630";
+}
 .icon-puzzle:before {
     content: "\e631";
 }
@@ -191,48 +188,115 @@
 .icon-segment:before {
     content: "\e635";
 }
-.icon-server:before {
-    content: "\e637";
+.icon-users:before {
+    content: "\e635";
 }
 .icon-server-alt:before {
     content: "\e636";
 }
+.icon-server:before {
+    content: "\e637";
+}
+.icon-hide:before {
+    content: "\e638";
+}
 .icon-show:before {
     content: "\e639";
 }
+.icon-arrow-top:before {
+    content: "\e63a";
+}
+.icon-arrow-bottom:before {
+    content: "\e63b";
+}
 .icon-star:before {
     content: "\e63c";
 }
 .icon-success:before {
     content: "\e63d";
 }
-.icon-table:before {
-    content: "\e63f";
-}
 .icon-table-more:before {
     content: "\e63e";
 }
+.icon-table:before {
+    content: "\e63f";
+}
 .icon-tag-cloud:before {
     content: "\e640";
 }
-.icon-user:before {
-    content: "\e642";
-}
 .icon-user-add:before {
     content: "\e641";
 }
-.icon-users:before {
-    content: "\e635";
+.icon-user:before {
+    content: "\e642";
+}
+.icon-play:before {
+    content: "\e643";
 }
 .icon-visitor-profile:before {
     content: "\e644";
 }
-.icon-warning:before {
-    content: "\e621";
-}
 .icon-zoom-in:before {
     content: "\e645";
 }
 .icon-zoom-out:before {
     content: "\e646";
 }
+.icon-sign-out:before {
+    content: "\e647";
+}
+.icon-sign-in:before {
+	content: "\e648";
+}
+.icon-menu-hamburger:before {
+	content: "\e649";
+}
+.icon-more-horiz:before {
+	content: "\e64a";
+}
+.icon-more-verti:before {
+	content: "\e64b";
+}
+.icon-admin-administration:before {
+	content: "\e64c";
+}
+.icon-admin-development:before {
+	content: "\e64d";
+}
+.icon-admin-diagnostic:before {
+	content: "\e64e";
+}
+.icon-admin-platform:before {
+	content: "\e64f";
+}
+.icon-admin-settings:before {
+	content: "\e650";
+}
+.icon-reporting-actions:before {
+	content: "\e651";
+}
+.icon-reporting-dashboard:before {
+	content: "\e652";
+}
+.icon-reporting-ecommerce:before {
+	content: "\e653";
+}
+.icon-reporting-goal:before {
+	content: "\e654";
+}
+.icon-reporting-referer:before {
+	content: "\e655";
+}
+.icon-reporting-visitors:before {
+	content: "\e656";
+}
+.icon-user-manage:before {
+	content: "\e657";
+}
+.icon-user-personal:before {
+	content: "\e658";
+}
+.icon-user-platform:before {
+	content: "\e659";
+}
+
diff --git a/plugins/Morpheus/stylesheets/base/mixins.less b/plugins/Morpheus/stylesheets/base/mixins.less
index c9b6f5345d08283835d1abb2a51d3f3c1cceb582..2558a1446997ba3e86b8bc3cd47518119ccabcda 100644
--- a/plugins/Morpheus/stylesheets/base/mixins.less
+++ b/plugins/Morpheus/stylesheets/base/mixins.less
@@ -3,7 +3,7 @@
   &:after {
     content: "";
     display: table;
-    clear: both;
+    clear: right;
   }
   &:before {
     content: "";
diff --git a/plugins/Morpheus/stylesheets/general/_admin.less b/plugins/Morpheus/stylesheets/general/_admin.less
index 1f81d7797f5437fedd5503f3614612ec3e0cd9a0..c0f34c5e2d2b9a87161c0c112e2e07e4c86cc0ea 100644
--- a/plugins/Morpheus/stylesheets/general/_admin.less
+++ b/plugins/Morpheus/stylesheets/general/_admin.less
@@ -1,39 +1,3 @@
-.Menu--admin {
-    .Menu-tabList {
-        .border-radius(0px);
-        border-color: @theme-color-background-lowContrast;
-        background-image: none;
-        padding-left: 0;
-        border-top: 0;
-        > li:first-child span {
-          border-bottom: 3px solid @theme-color-brand;
-        }
-        > li {
-            padding-bottom: 0px;
-            > span {
-                color: @theme-color-text;
-                .font-default(18px, 26px);
-                border-top: 1px solid @theme-color-background-lowContrast;
-                border-bottom: 1px solid @theme-color-background-lowContrast;
-                padding: 12px 15px;
-            }
-            ul {
-                background-color: @theme-color-menu-contrast-background;
-
-                li {
-                    a {
-                        color: @theme-color-text-lighter !important;
-                        padding: 0.8em 1.1em;
-                        &:hover {
-                            color: @theme-color-text;
-                            text-decoration: none;
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
 
 .ui-state-highlight {
     border-color: @color-silver-l80 !important;
@@ -52,26 +16,12 @@
         cursor: pointer;
         min-height: 30px;
     }
-
-    .sites_autocomplete {
-        position: static !important;
-    }
 }
 
 .sites_autocomplete  {
     vertical-align: middle;
 }
 
-#loadingError {
-    color: @theme-color-brand;
-    font-weight: normal;
-}
-
-.sites_autocomplete .custom_select .custom_select_block .custom_select_container .custom_select_ul_list {
-    margin-top: 5px;
-    padding-bottom: 0;
-}
-
 .adminTable a {
     color: @theme-color-link;
 }
diff --git a/plugins/Morpheus/stylesheets/general/_forms.less b/plugins/Morpheus/stylesheets/general/_forms.less
index 49c5358f1d02d687089f155f4e170a585b555377..dcbe261807d02cc97f53a48ef642b580af602199 100644
--- a/plugins/Morpheus/stylesheets/general/_forms.less
+++ b/plugins/Morpheus/stylesheets/general/_forms.less
@@ -139,6 +139,7 @@ select {
 }
 
 .top_bar_sites_selector {
+    z-index: 143;
     .sites_autocomplete .custom_select {
         z-index: 139;
     }
@@ -148,30 +149,6 @@ select {
     input {
         min-height: 0;
     }
-    .custom_select {
-        border-color: @theme-color-background-lowContrast;
-        .border-radius(0px);
-        background: @theme-color-background-base;
-        padding: 0;
-        color: @theme-color-text;
-        text-transform: uppercase;
-        .font-default(10px, 12px);
-        min-height: 30px;
-        .box-sizing(border-box);
-        a {
-            color: @theme-color-text;
-            &:hover {
-                text-decoration: none;
-            }
-        }
-        .custom_select_block {
-            .custom_select_container {
-                .custom_select_ul_list {
-                    margin-top: 20px;
-                }
-            }
-        }
-    }
 }
 
 .ajaxError {
@@ -184,19 +161,6 @@ select {
     font-weight: normal;
 }
 
-.sites_autocomplete--dropdown {
-    .custom_select_main_link:not(.loading):before {
-        color: @theme-color-brand;
-        font-size: 0.7em;
-        top: 4px;
-        right: 10px;
-        content: '';
-        border-left: 4px solid transparent;
-        border-right: 4px solid transparent;
-        border-top: 5px solid @theme-color-brand;
-    }
-}
-
 .limitSelection {
     > ul {
         position: relative;
diff --git a/plugins/Morpheus/stylesheets/ieonly.css b/plugins/Morpheus/stylesheets/ieonly.css
index 234631ce716159555cd1297156bdd61d2fcbed93..45523c856afddb7c47b2b68b82fc4b58889cde75 100644
--- a/plugins/Morpheus/stylesheets/ieonly.css
+++ b/plugins/Morpheus/stylesheets/ieonly.css
@@ -11,14 +11,10 @@
 	overflow: hidden;
 }
 
-#topBars {
+#topLeftBar {
     z-index: 300!important;
 }
 
-.sites_autocomplete, .sites_autocomplete .custom_select {
-    z-index: 200!important;
-}
-
 .submit {
     height: 30px;
 }
diff --git a/plugins/Morpheus/stylesheets/main.less b/plugins/Morpheus/stylesheets/main.less
index 699fb1d159c25a48638a6ce17df8f15b136642dc..3bbe2602f5480d3f8329a90574224bd430f34111 100644
--- a/plugins/Morpheus/stylesheets/main.less
+++ b/plugins/Morpheus/stylesheets/main.less
@@ -72,110 +72,6 @@ table.entityTable tr td a:hover {
 #root {
     margin: 0 0 100px 0;
     padding: 0;
-
-    #header {
-        margin: 0 15px;
-        #topBars {
-            a {
-                color: @theme-color-link;
-                text-decoration: none;
-            }
-        }
-
-        .topBarElem {
-          padding: 0 3px;
-          color: @theme-color-text-lighter;
-            strong {
-                font-weight: normal;
-                color: @theme-color-text;
-            }
-        }
-    }
-
-    .top_bar_sites_selector {
-        margin-right: 10px;
-        label {
-            padding-top: 9px;
-            .font-default(13px, 15px);
-        }
-    }
-
-    .Menu--dashboard {
-        border-top: 1px solid @theme-color-background-lowContrast;
-        border-bottom: 0px;
-        > .Menu-tabList {
-            margin: 0;
-            a {
-               .font-default(18px, 22px);
-               padding: 14px 28px 11px;
-            }
-            > li {
-                .border-radius(0px);
-                border: 0;
-                background: none;
-                border-right: 1px solid @theme-color-background-lowContrast;
-                margin-bottom: -1px;
-                border-bottom: 0px;
-
-                > ul {
-                    li {
-                        a {
-                            color: @theme-color-menu-contrast-text;
-                            .font-default(15px, 18px);
-                            padding: 14px 22px 11px;
-                        }
-
-                        &:hover,
-                        &.sfHover {
-                            a {
-                                color: @theme-color-menu-contrast-textActive;
-                                font-weight: normal;
-                            }
-
-                        }
-                    }
-                }
-
-                &.sfActive {
-                    > a {
-                        color: @theme-color-text;
-                        text-decoration: none;
-                        position: relative;
-                        &:after {
-                            content: '';
-                            position: absolute;
-                            bottom: -3px;
-                            left: 0;
-                            width: 100%;
-                            height: 4px;
-                            background: @theme-color-brand;
-                        }
-                    }
-
-                }
-
-                &.sfHover {
-                    > a {
-                        border: 0;
-                        text-decoration: none;
-                        color: @theme-color-text;
-                    }
-                }
-            }
-        }
-    }
-
-    .nav_sep {
-        background: @theme-color-menu-contrast-background;
-        min-height: 57px;
-        .border-radius(0px);
-        border-color: @theme-color-background-lowContrast !important;
-        border-top: 0px !important;
-        border-right: 0px !important;
-        border-left: 0px !important;
-        box-shadow: inset 0 2px 4px #d8d8d8;
-    }
-
     .widgetize {
         width: auto;
     }
@@ -186,9 +82,7 @@ table.entityTable tr td a:hover {
   border: 1px solid @theme-color-background-lowContrast;
   background: @theme-color-background-base;
   z-index: 10;
-  padding: 8px 10px 8px 10px;
   .border-radius(0px);
-  .font-default(10px, 12px);
   > span {
     position: relative;
     background: none;
@@ -197,15 +91,16 @@ table.entityTable tr td a:hover {
       content: '';
       border-left: 4px solid transparent;
       border-right: 4px solid transparent;
-      border-top: 5px solid @theme-color-brand;
+      border-top: 5px solid @color-silver-l20;
       position: absolute;
       top: 3px;
-      right: 0;
+      right: 7px;
     }
   }
 
   ul.submenu {
     margin-left: 0;
+    padding-right: 0;
     li {
       list-style-type: none;
       > div {
@@ -236,24 +131,15 @@ table.entityTable tr td a:hover {
 .segmentEditorPanel {
   border: 1px solid @theme-color-background-lowContrast;
   background: @theme-color-background-base;
-  padding: 8px 10px 8px 10px;
   .border-radius(0px);
-  .segmentationTitle {
-    background: url(plugins/Morpheus/images/segment-users.png) no-repeat right 0;
-    text-transform: uppercase;
-    .font-default(10px, 12px);
-    position: relative;
-  }
   .dropdown-body {
     background:@theme-color-background-base;
-    padding:0 10px;
+    padding: 8px 19px 0;
     .border-radius(0px);
-    border: 1px solid @color-silver-l80;
     border-top-width: 0px;
   }
   &:hover .dropdown-body {
     background:@theme-color-background-base;
-    border-color: @color-silver-l80;
   }
   .segmentationContainer {
     > span > strong {
@@ -299,32 +185,37 @@ table.entityTable tr td a:hover {
 /* Iframed Embed dashboard style */
 #standalone {
 
-  #Dashboard:hover ul {
-    background: #f1f0eb;
-    border-color: #a9a399;
-  }
-
   #Dashboard {
-    ul {
+    position: relative;
 
-      background: @theme-color-background-base;
-      border: 1px solid @color-silver-l80;
-      padding: 8px 10px 8px 10px;
+    &:hover ul {
+      background-color: @theme-color-background-base;
+    }
+    ul {
+      padding: 0 19px;
       color: @theme-color-text-light;
-      height: 30px;
+      min-height: 33px;
       line-height:0.5em;
       .border-radius(0px);
+      border: 0;
+      background-color: @theme-color-background-base;
+    }
+    > ul > li {
+      white-space: nowrap;
+      margin-right: 0px;
+      a {
+        padding-left: 0;
+      }
+      &.active {
+        a {
+          color: @theme-color-menu-contrast-textActive;
+        }
+      }
     }
     > ul > li:hover,
-    > ul > li:hover a,
-    > ul > li.sfHover,
-    > ul > li.sfHover a {
+    > ul > li:hover a {
       color: @theme-color-brand;
     }
-    > ul > li.sfHover,
-    > ul > li.sfHover a {
-      font-weight: normal;
-    }
   }
 }
 
@@ -335,13 +226,17 @@ table.entityTable tr td a:hover {
     text-decoration: none;
     display: block;
     width: 100%;
+    margin-top: 14px;
+}
+
+.rss li:first-child .rss-title {
+  margin-top: 0;
 }
 
 .rss-date {
     display: block;
     color: @color-silver-l60;
-    .font-default(11px, 14px);
-    margin-top: 15px;
+    .font-default(11px, 26px);
 }
 
 .rss-description {
@@ -865,7 +760,7 @@ div.sparkline {
 
 #piwik-promo-share {
     border: 0px;
-    background: #f2f2f2;
+    background: @theme-color-background-tinyContrast;
     .font-default(10px, 16px);
 }
 
@@ -877,13 +772,13 @@ tr:hover #token_auth {
   background: #FFFFF7;
 }
 
-// previous style overrides
-#header_message a {
+#header_message .dropdown a,
+#header_message #updateCheckLinkContainer:hover {
     text-decoration: underline;
 }
 
-#header_message a:hover {
-    text-decoration: none;
+#header_message #updateCheckLinkContainer:hover {
+    cursor: pointer;
 }
 
 #multisites table.dataTable {
diff --git a/plugins/Morpheus/stylesheets/theme.less b/plugins/Morpheus/stylesheets/theme.less
index 371b50183078a9cbe3446acfdb93b45e95793b9e..97eb216d2fa05fcf3f37ea64854ff8237ed106bf 100644
--- a/plugins/Morpheus/stylesheets/theme.less
+++ b/plugins/Morpheus/stylesheets/theme.less
@@ -12,8 +12,8 @@
 @theme-color-link:                     @color-blue-piwik;
 @theme-color-base-series:              #ee3024;
 
-@theme-color-menu-contrast-text: @theme-color-text-lighter;
-@theme-color-menu-contrast-textActive: @theme-color-text;
+@theme-color-menu-contrast-text: @theme-color-text;
+@theme-color-menu-contrast-textActive: @theme-color-brand;
 @theme-color-menu-contrast-background: @theme-color-background-tinyContrast;
 
 @theme-color-widget-title-text: @theme-color-text;
diff --git a/plugins/Morpheus/stylesheets/ui/_components.less b/plugins/Morpheus/stylesheets/ui/_components.less
index e9e9b8bc46bb623c29d185b58236030c4f94908e..630fda6fa6ab0c81cec0b93d8a1ec3bc50bb33dd 100644
--- a/plugins/Morpheus/stylesheets/ui/_components.less
+++ b/plugins/Morpheus/stylesheets/ui/_components.less
@@ -45,20 +45,15 @@
 .segment-element {
     background: @color-white;
     border-color: @color-silver-l80;
+    line-height: 1.33;
 
     .segment-add-row {
         .border-radius(5px);
     }
 
-    .segment-nav {
-        h4.visits {
-            background: url('plugins/Morpheus/images/segment-users.png') no-repeat 3px 0px;
-        }
-    }
-
     .custom_select_search {
         input {
-            margin-top: -10px;
+            margin-top: 1px;
         }
     }
 
@@ -96,13 +91,13 @@
             li {
                 padding: 3px 0;
                 &:hover {
-                    background: #f2f2f2;
+                    background: @theme-color-background-tinyContrast;
                     border: 0;
                     padding: 4px 0 3px;
 
                     a {
                         border: 0;
-                        background-color: #f2f2f2;
+                        background-color: @theme-color-background-tinyContrast;
                         padding-right: 15px;
 
                     }
@@ -129,11 +124,13 @@
         }
 
         a.dropdown {
+            display: inline;
             color: @theme-color-text;
             background: url('plugins/Morpheus/images/sort_subtable_desc.png') 100% -2px no-repeat;
             &.ui-autocomplete-input {
                 background-position: 100% -2px;
             }
+            .font-default(10px, 12px);
         }
     }
     .segment-footer {
@@ -155,25 +152,12 @@
 }
 
 #periodString {
-    border: 1px solid @theme-color-background-lowContrast;
-    .border-radius(0px);
-    background: @theme-color-background-base;
-    &:hover {
-        background: @theme-color-background-base;
-        border-color: @color-silver-l80;
-    }
-
     select {
         min-height: 0;
         background-position: 140%;
         padding-left: 5px;
     }
 
-    .calendar-icon {
-        width: 17px;
-        height: 17px;
-    }
-
     label.selected-period-label {
         text-decoration: none !important;
     }
@@ -191,34 +175,17 @@
             }
         }
     }
-
-    #date {
-        .border-radius(0px);
-        padding: 8px 10px;
-        color: @theme-color-text-lighter;
-        text-transform: uppercase;
-        .font-default(10px, 12px);
-
-        strong {
-            color: @theme-color-text;
-
-        }
-    }
 }
 
 #header_message {
-    border: 1px solid @theme-color-background-lowContrast;
-    padding: 8px 10px 8px 10px;
     height: auto;
-    background: @theme-color-background-base;
     .border-radius(0px);
-    .header_short {
-        .font-default(10px, 12px);
-        text-transform: uppercase;
-    }
 
-    .header_full {
-        .font-default(12px, 18px);
+    &.isPiwikDemo {
+        text-align: right;
+        position: absolute;
+        right: 0;
+        top: 8px;
     }
 }
 
@@ -235,7 +202,7 @@
 
 .loadingPiwikBelow,
 .loadingPiwik {
-    .font-default(10px, 12px);
+    .font-default(13px, 13px);
     color: @color-silver-l60;
     font-weight: normal;
 }
@@ -256,7 +223,7 @@
     .border-radius(6px);
 
     h2 {
-        background: #f2f2f2;
+        background: @theme-color-background-tinyContrast;
         border-bottom: 1px solid @color-gray;
         padding: 11px 15px 10px;
     }
diff --git a/plugins/Morpheus/stylesheets/uibase/_header.less b/plugins/Morpheus/stylesheets/uibase/_header.less
index b96b1b467ab94bf2d6667389a39f28b41b0e6cb7..ff7fd45ff23dfbec5949380059b13aba0e0115f7 100644
--- a/plugins/Morpheus/stylesheets/uibase/_header.less
+++ b/plugins/Morpheus/stylesheets/uibase/_header.less
@@ -1,28 +1,18 @@
-#header {
-  min-height: 60px;
-}
-
-/* Clear fix */
-#header:after {
-  display: table;
-  clear: both;
-  content: "";
-}
 
 #root {
   #logo {
-    padding: 5px 0 0;
+    padding: 9px 0 0 4px;
     float: left;
   }
 
   #logo  {
     img.default-piwik-logo {
       width: 82px;
-      margin-top: 14px;
+      margin-top: 8px;
     }
 
     img {
-      max-height: 50px;
+      max-height: 30px;
     }
   }
 
@@ -53,23 +43,3 @@
   padding: 15px;
   clear: both;
 }
-
-#topBars {
-  right: 0px;
-  position: absolute;
-  padding-left: 110px;
-  color: #acacac;
-  margin: 4px 10px 8px;
-  font-size: 13px;
-  z-index: 140;
-}
-
-#topRightBar {
-  margin-bottom: 4px;
-  float: right;
-}
-
-.topBarElem {
-  padding: 0 5px;
-  display: inline-block;
-}
diff --git a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
index 41cdc726b99a93fecbec2dbabce44e3b342d058f..1922c721a8f81934879b9af060e22309416a64f7 100644
--- a/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
+++ b/plugins/Morpheus/stylesheets/uibase/_headerMessage.less
@@ -2,15 +2,21 @@
 #header_message {
   z-index: 0;
   cursor: default;
-  position: absolute;
-  right: 0px;
+  float: right;
   overflow: hidden;
   display: block;
   height: 20px;
-  line-height: 20px;
-  padding: 5px 8px 5px 38px;
   font-size: 14px;
   border-radius: 4px;
+
+  &.update_available .title {
+    color: #CA8100;
+    font-weight: bold;
+  }
+
+  .icon-warning {
+    padding-left: 2px;
+  }
 }
 
 #header_message:hover,
@@ -44,24 +50,6 @@
   line-height: 1.7em;
 }
 
-/* Orange alerts box */
-.header_alert {
-  background: #FFFDF7 url(plugins/Morpheus/images/ico_alert.png) no-repeat 7px 4px;
-  border: 1px solid #FF7F00;
-  font-weight: bold;
-}
-
-.header_alert,
-.header_alert  a {
-  color: #FF7F00;
-}
-
-/* Blue info box */
-.header_info {
-  background: #FAFAFA url(plugins/Morpheus/images/ico_info.png) no-repeat 7px 4px;
-  border: 1px solid #CBD9EB;
-}
-
 .header_info, .header_info  a {
   color: @theme-color-text-light;
 }
diff --git a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less
index 032516350e2d98a26cd3d148db132f7a2c95324c..6161506aa8656a0cf75eaf186adf831125a5d37e 100644
--- a/plugins/Morpheus/stylesheets/uibase/_languageSelect.less
+++ b/plugins/Morpheus/stylesheets/uibase/_languageSelect.less
@@ -4,4 +4,21 @@
   .items {
     margin-left: -50px;
   }
+
+  .borderedControl {
+    transition: box-shadow 0s !important;
+  }
+}
+
+#topRightBar .navbar-right .languageSelection {
+  // make padding of language selection clickable
+  margin: -14px -12px;
+
+  .title {
+    padding: 14px 12px;
+    &:after {
+      top: 19px;
+      right: -3px;
+    }
+  }
 }
\ No newline at end of file
diff --git a/plugins/Morpheus/stylesheets/uibase/_loading.less b/plugins/Morpheus/stylesheets/uibase/_loading.less
index e68d0f0a696b24b9a3249bf415f4e4566dde9466..e57e3d0a6d6c98e8b0059656ffba48fb9741c23d 100644
--- a/plugins/Morpheus/stylesheets/uibase/_loading.less
+++ b/plugins/Morpheus/stylesheets/uibase/_loading.less
@@ -9,17 +9,16 @@
 }
 
 .loadingSegment {
-  color: grey;
-  font-size: 10pt;
+  color: @color-silver-l60;
+  font-size: 13px;
   margin-left: 28px;
   display:none;
 }
 
 #loadingError {
-  font-weight: bold;
-  font-size: 1.1em;
-  color: #F88D22;
-  padding: 0.5em;
+  font-size: 15px;
+  padding: 8px 0;
   display: none;
-  padding-top: 40px;
+  color: @theme-color-brand;
+  font-weight: normal;
 }
\ No newline at end of file
diff --git a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less
index 767a2a70a1011e916ac9321880ed77e3de65a385..83c21f79993ea8ca2806e687fe3530cc07de1c2e 100644
--- a/plugins/Morpheus/stylesheets/uibase/_periodSelect.less
+++ b/plugins/Morpheus/stylesheets/uibase/_periodSelect.less
@@ -3,8 +3,6 @@
   color: @theme-color-text-light;
   font-size: 14px;
   border: 1px solid #e4e5e4;
-  padding: 5px 30px 6px 10px;
-  border-radius: 4px;
   float: left;
   margin-right: 10px;
   position: absolute;
@@ -22,23 +20,12 @@
   height: 15px;
   display:inline-block;
   position:absolute;
-  right:9px;
-  top:7px;
+  right: 19px;
+  top: 9px;
   background: url("plugins/Morpheus/images/icon-calendar.gif") no-repeat scroll;
   cursor:pointer;
 }
 
-#periodString #date{
-  cursor:pointer;
-  padding:5px 10px 6px 10px;
-  margin:-5px -10px -6px -10px;
-}
-
-#periodString #date img {
-  vertical-align: middle;
-  margin: 0 0 0 6px;
-}
-
 #periodString strong {
   color: #255792;
 }
@@ -49,8 +36,6 @@
 }
 
 #periodMore {
-  padding: 6px 0 0 0;
-  display: none;
   overflow: hidden;
 }
 
@@ -62,7 +47,7 @@
 
 #periodString .period-type {
   float: left;
-  padding: 0 20px 0 0;
+  padding: 0;
 }
 
 #periodString .period-type label {
diff --git a/plugins/Morpheus/templates/_jsGlobalVariables.twig b/plugins/Morpheus/templates/_jsGlobalVariables.twig
index 35643089eae36c081f7aab52be9d8a02ca3f284b..9acb9bebbb3c0bd100a5f43ab5691c0c5e0db0c4 100644
--- a/plugins/Morpheus/templates/_jsGlobalVariables.twig
+++ b/plugins/Morpheus/templates/_jsGlobalVariables.twig
@@ -3,6 +3,18 @@
     piwik.token_auth = "{{ token_auth }}";
     piwik.piwik_url = "{{ piwikUrl }}";
     piwik.cacheBuster = "{{ cacheBuster }}";
+
+    piwik.numbers = {
+        patternNumber: "{{ 'Intl_NumberFormatNumber'|translate }}",
+        patternPercent: "{{ 'Intl_NumberFormatPercent'|translate }}",
+        patternCurrency: "{{ 'Intl_NumberFormatCurrency'|translate }}",
+        symbolPlus: "{{ 'Intl_NumberSymbolPlus'|translate }}",
+        symbolMinus: "{{ 'Intl_NumberSymbolMinus'|translate }}",
+        symbolPercent: "{{ 'Intl_NumberSymbolPercent'|translate }}",
+        symbolGroup: "{{ 'Intl_NumberSymbolGroup'|translate }}",
+        symbolDecimal: "{{ 'Intl_NumberSymbolDecimal'|translate }}"
+    };
+
     {% if userLogin %}piwik.userLogin = "{{ userLogin|e('js')}}";{% endif %}
 
     {% if idSite is defined %}piwik.idSite = "{{ idSite }}";{% endif %}
diff --git a/plugins/Morpheus/templates/_piwikTag.twig b/plugins/Morpheus/templates/_piwikTag.twig
deleted file mode 100644
index 101cb5dca7d08fe42300998a880c705ac8f39d12..0000000000000000000000000000000000000000
--- a/plugins/Morpheus/templates/_piwikTag.twig
+++ /dev/null
@@ -1,30 +0,0 @@
-{# Disabled by default, tracks activity of this Piwik instance #}
-
-{% if (piwikUrl == 'http://demo.piwik.org/' or enableMeasurePiwikForSiteId) %}
-    <div class="clear"></div>
-    <!-- Piwik -->
-    <script type="text/javascript">
-    var _paq = _paq || [];
-    _paq.push(['setTrackerUrl', 'piwik.php']);
-    _paq.push(['setSiteId', {{ enableMeasurePiwikForSiteId }}]);
-    _paq.push(['setCookieDomain', '*.piwik.org']);
-    // set the domain the visitor landed on, in the Custom Variable
-    _paq.push([function () {
-    if (!this.getCustomVariable(1)) {
-        this.setCustomVariable(1, "Domain landed", document.domain);
-    }
-    }]);
-    // Set the selected Piwik language in a custom var
-    _paq.push(['setCustomVariable', 2, "Demo language", piwik.languageName]);
-    _paq.push(['setDocumentTitle', document.domain + "/" + document.title]);
-    _paq.push(['trackPageView']);
-    _paq.push(['enableLinkTracking', true]);
-    _paq.push(['enableJSErrorTracking']);
-
-    (function() {
-        var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
-        g.type='text/javascript'; g.async=true; g.defer=true; g.src='js/piwik.js'; s.parentNode.insertBefore(g,s);
-    })();
-    </script>
-    <!-- End Piwik Code -->
-{% endif %}
diff --git a/plugins/Morpheus/templates/admin.twig b/plugins/Morpheus/templates/admin.twig
index c51e3d378cdcb51c43e778b559625cbc891d8712..348cd71f72cb17d8fd52959a4e88e199ed3bd44d 100644
--- a/plugins/Morpheus/templates/admin.twig
+++ b/plugins/Morpheus/templates/admin.twig
@@ -22,27 +22,37 @@
     {{ ajax.requestErrorDiv(emailSuperUser|default('')) }}
     {{ postEvent("Template.beforeContent", "admin", currentModule) }}
 
-    <div id="container">
+    <div class="page">
 
         {% if showMenu is not defined or showMenu %}
-            {% include "@CoreAdminHome/_menu.twig" %}
+            {% import '@CoreHome/_menu.twig' as menu %}
+            {{ menu.menu(adminMenu, false, 'Menu--admin', currentModule, currentAction) }}
         {% endif %}
 
-        <div id="content" class="admin">
+        <div class="pageWrap">
 
-            {% include "@CoreHome/_headerMessage.twig" %}
-            {% include "@CoreHome/_notifications.twig" %}
+            <div class="top_controls">
+                {% block topcontrols %}
+                {% endblock %}
 
-            <div class="ui-confirm" id="alert">
-                <h2></h2>
-                <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/>
+                {% include "@CoreHome/_headerMessage.twig" %}
             </div>
 
-            {% include "@CoreHome/_warningInvalidHost.twig" %}
+            <div class="admin" id="content">
+                {% include "@CoreHome/_notifications.twig" %}
+                {% include "@CoreHome/_warningInvalidHost.twig" %}
 
-            {% block content %}
-            {% endblock %}
+                <div class="ui-confirm" id="alert">
+                    <h2></h2>
+                    <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/>
+                </div>
 
+                {% block content %}
+                {% endblock %}
+
+            </div>
         </div>
     </div>
+
+
 {% endblock %}
diff --git a/plugins/Morpheus/templates/dashboard.twig b/plugins/Morpheus/templates/dashboard.twig
index 08230e0e9be6e44709a09376983ef283f6722c6b..c9feafebe6ed708bd27d599ab7623a99becb9172 100644
--- a/plugins/Morpheus/templates/dashboard.twig
+++ b/plugins/Morpheus/templates/dashboard.twig
@@ -23,10 +23,6 @@
     {% include "@CoreHome/_warningInvalidHost.twig" %}
     {% include "@CoreHome/_topScreen.twig" %}
 
-    {% block notification %}
-        {% include "@CoreHome/_notifications.twig" %}
-    {% endblock %}
-
     <div class="ui-confirm" id="alert">
         <h2></h2>
         <input role="yes" type="button" value="{{ 'General_Ok'|translate }}"/>
@@ -34,6 +30,37 @@
 
     {{ postEvent("Template.beforeContent", "dashboard", currentModule) }}
 
-    {% block content %}
-    {% endblock %}
+    <div class="page">
+
+        {% if showMenu is defined and showMenu %}
+            <div id="secondNavBar" class="Menu--dashboard">
+                <div id="search">
+                    <div piwik-quick-access class="borderedControl"></div>
+                </div>
+                <div piwik-reporting-menu></div>
+            </div>
+        {% endif %}
+
+        <div class="pageWrap">
+
+            <a name="main"></a>
+
+            <div class="top_controls">
+                {% block topcontrols %}
+                {% endblock %}
+            </div>
+
+            {% block notification %}
+                {% include "@CoreHome/_notifications.twig" %}
+            {% endblock %}
+
+            <div piwik-popover></div>
+
+            {% block content %}
+            {% endblock %}
+
+            <div class="clear"></div>
+        </div>
+
+    </div>
 {% endblock %}
diff --git a/plugins/Morpheus/templates/demo.twig b/plugins/Morpheus/templates/demo.twig
index 0995add8c3d765db840333d9008e08c05958571c..51cdc9e86f09b099c70af1426ff066184b4d7c01 100644
--- a/plugins/Morpheus/templates/demo.twig
+++ b/plugins/Morpheus/templates/demo.twig
@@ -497,6 +497,9 @@
                         'show',
                         'hide',
                         'search',
+                        'menu-hamburger',
+                        'more-horiz',
+                        'more-verti'
                     ],
                     'Window-Widget': [
                         'minimise',
@@ -570,6 +573,8 @@
                         'server-alt',
                         'tag-cloud',
                         'play',
+                        'sign-in',
+                        'sign-out'
                     ],
                 };
 
diff --git a/plugins/Morpheus/templates/layout.twig b/plugins/Morpheus/templates/layout.twig
index ec57b81b6e5f3955f183a322ddceda5f2528807e..2229ba2ac74719283044c5a0d791bcf14fe7a4ae 100644
--- a/plugins/Morpheus/templates/layout.twig
+++ b/plugins/Morpheus/templates/layout.twig
@@ -22,7 +22,6 @@
 
             {% include "@CoreHome/_favicon.twig" %}
             {% include "_jsGlobalVariables.twig" %}
-            {% include "_piwikTag.twig" %}
             {% include "_jsCssIncludes.twig" %}
 
             <!--[if IE]>
@@ -48,5 +47,6 @@
 
     {% endblock %}
 
+        {% include "@CoreHome/_adblockDetect.twig" %}
     </body>
 </html>
diff --git a/plugins/Morpheus/templates/settingsMacros.twig b/plugins/Morpheus/templates/settingsMacros.twig
index cbb410f4a523bed4b774e0fab6fefda51da22165..19a88bfa28554f1d24122de4a899faf904e11255 100644
--- a/plugins/Morpheus/templates/settingsMacros.twig
+++ b/plugins/Morpheus/templates/settingsMacros.twig
@@ -5,7 +5,7 @@
     <div class="form-group">
 
         {% if setting.introduction %}
-            <p>{{ setting.introduction }}</p>
+            <p class="settingIntroduction">{{ setting.introduction }}</p>
         {% endif %}
 
         {{ _self.field(setting, index) }}
diff --git a/plugins/Morpheus/templates/user.twig b/plugins/Morpheus/templates/user.twig
index 416f12e11678d5b58dc4b7f3d3e830f3598c1921..39710e2bb2e769c4c158e30cb3c545c87c1c3e3f 100644
--- a/plugins/Morpheus/templates/user.twig
+++ b/plugins/Morpheus/templates/user.twig
@@ -6,7 +6,7 @@
 
 {% block body %}
     {% if userIsAnonymous %}
-        {% set topMenuModule = 'Feedback' %}
+        {% set topMenuModule = 'ScheduledReports' %}
         {% set topMenuAction = 'index' %}
     {% else %}
         {% if currentModule != 'Feedback' %}
@@ -24,24 +24,33 @@
     {{ ajax.requestErrorDiv(emailSuperUser|default('')) }}
     {{ postEvent("Template.beforeContent", "user", currentModule) }}
 
-    <div id="container">
+    <div class="page">
 
         {% if showMenu is not defined or showMenu %}
-            {% include "@CoreHome/_userMenu.twig" %}
+            {% import '@CoreHome/_menu.twig' as menu %}
+            {{ menu.menu(userMenu, false, 'Menu--admin', currentModule, currentAction) }}
         {% endif %}
 
-        <div id="content" class="admin user">
+        <div class="pageWrap">
 
-            {% include "@CoreHome/_notifications.twig" %}
-
-            <div class="ui-confirm" id="alert">
-                <h2></h2>
-                <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/>
+            <div class="top_controls">
+                {% block topcontrols %}
+                {% endblock %}
             </div>
 
-            {% block content %}
-            {% endblock %}
+            <div id="content" class="admin user">
+
+                {% include "@CoreHome/_notifications.twig" %}
+
+                <div class="ui-confirm" id="alert">
+                    <h2></h2>
+                    <input role="no" type="button" value="{{ 'General_Ok'|translate }}"/>
+                </div>
 
+                {% block content %}
+                {% endblock %}
+
+            </div>
         </div>
     </div>
 {% endblock %}
diff --git a/plugins/MultiSites/Dashboard.php b/plugins/MultiSites/Dashboard.php
index b364482d902d071040541f10868883a2cc24f62e..a9032b6fd31a0ea122fd90aea192b13d9ba5320c 100644
--- a/plugins/MultiSites/Dashboard.php
+++ b/plugins/MultiSites/Dashboard.php
@@ -12,6 +12,7 @@ use Piwik\API\DataTablePostProcessor;
 use Piwik\API\ResponseBuilder;
 use Piwik\Config;
 use Piwik\Metrics\Formatter;
+use Piwik\NumberFormatter;
 use Piwik\Period;
 use Piwik\DataTable;
 use Piwik\DataTable\Row;
@@ -35,6 +36,12 @@ class Dashboard
      */
     private $numSites = 0;
 
+    /**
+     * Array of metrics that will be displayed and will be number formatted
+     * @var array
+     */
+    private $displayedMetricColumns = array('nb_visits', 'nb_pageviews', 'nb_actions', 'revenue');
+
     /**
      * @param string $period
      * @param string $date
@@ -44,7 +51,7 @@ class Dashboard
     {
         $sites = API::getInstance()->getAll($period, $date, $segment, $_restrictSitesToLogin = false,
                                             $enhanced = true, $searchTerm = false,
-                                            $showColumns = array('nb_visits', 'nb_pageviews', 'nb_actions', 'revenue'));
+                                            $this->displayedMetricColumns);
         $sites->deleteRow(DataTable::ID_SUMMARY_ROW);
 
         /** @var DataTable $pastData */
@@ -98,15 +105,32 @@ class Dashboard
 
     public function getTotals()
     {
-        return array(
+        $totals = array(
             'nb_pageviews'       => $this->sitesByGroup->getMetadata('total_nb_pageviews'),
             'nb_visits'          => $this->sitesByGroup->getMetadata('total_nb_visits'),
             'nb_actions'         => $this->sitesByGroup->getMetadata('total_nb_actions'),
             'revenue'            => $this->sitesByGroup->getMetadata('total_revenue'),
             'nb_visits_lastdate' => $this->sitesByGroup->getMetadata('total_nb_visits_lastdate') ? : 0,
         );
+        $this->formatMetrics($totals);
+        return $totals;
+    }
+
+    private function formatMetrics(&$metrics)
+    {
+        $formatter = new NumberFormatter();
+        foreach($metrics as $metricName => &$value) {
+            if(in_array($metricName, $this->displayedMetricColumns)) {
+
+                if( strpos($metricName, 'revenue') !== false) {
+                    continue;
+                }
+                $value = $formatter->format($value);
+            }
+        }
     }
 
+
     public function getNumSites()
     {
         return $this->numSites;
@@ -312,6 +336,8 @@ class Dashboard
                 $site['revenue']  = $formatter->getPrettyMoney($site['revenue'], $site['idsite']);
             }
             $site['main_url'] = Site::getMainUrlFor($site['idsite']);
+
+            $this->formatMetrics($site);
         }
 
         return $sites;
diff --git a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less
index 99683c088f0f940cb753653e93151fc040f2e7ae..a200b3d626a9c28abf12d4d13ee6386c10dcb531 100644
--- a/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less
+++ b/plugins/MultiSites/angularjs/dashboard/dashboard.directive.less
@@ -3,6 +3,12 @@
   font-size: 15px;
 }
 
+.widget {
+  #multisites {
+    padding: 15px;
+  }
+}
+
 #multisites {
   border: 0;
   padding: 0 15px;
@@ -10,6 +16,7 @@
 
   h2 {
     border-bottom: 0px;
+    font-size: 24px;
   }
 
   .notification-error {
@@ -79,10 +86,6 @@
     }
   }
 
-  .top_controls {
-    height: 10px;
-  }
-
   th:first-child {
     text-align:left;
   }
diff --git a/plugins/MultiSites/templates/getSitesInfo.twig b/plugins/MultiSites/templates/getSitesInfo.twig
index d1bdb81df054e4ac8b433be40c7405d5c0a1c4fd..94d13ee702a84b40b3cb55ce8a84e740344b62f4 100644
--- a/plugins/MultiSites/templates/getSitesInfo.twig
+++ b/plugins/MultiSites/templates/getSitesInfo.twig
@@ -1,14 +1,15 @@
 {% extends isWidgetized ? 'empty.twig' : 'dashboard.twig' %}
 
-{% block content %}
-{% if not isWidgetized %}
-    <div class="top_controls">
+{% block topcontrols %}
+    {% if not isWidgetized %}
         {% include "@CoreHome/_periodSelect.twig" %}
         {% include "@CoreHome/_headerMessage.twig" %}
-    </div>
-{% endif %}
+    {% endif %}
+{% endblock %}
+
+{% block content %}
+<div class="container" id="multisites">
 
-<div class="pageWrap container" id="multisites">
     <div id="main">
         <div piwik-multisites-dashboard
              display-revenue-column="{% if displayRevenueColumn %}true{% else %}false{%endif%}"
diff --git a/plugins/MultiSites/tests/Integration/DashboardTest.php b/plugins/MultiSites/tests/Integration/DashboardTest.php
index ca59b119d59332abc21e820359d78d846ac1cb78..7c79ce93e98d4fee0ba033bbe68ec146328a62b4 100644
--- a/plugins/MultiSites/tests/Integration/DashboardTest.php
+++ b/plugins/MultiSites/tests/Integration/DashboardTest.php
@@ -13,6 +13,7 @@ use Piwik\Period;
 use Piwik\Plugins\MultiSites\Dashboard;
 use Piwik\Tests\Framework\Fixture;
 use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
+use Piwik\Translate;
 
 /**
  * @group MultiSites
@@ -37,6 +38,8 @@ class DashboardTest extends IntegrationTestCase
             Fixture::createWebsite('2012-12-12 00:00:00', $ecommerce = 0, 'Site ' . $i);
         }
 
+        Translate::loadAllTranslations();
+
         $this->dashboard = $this->getMockBuilder('Piwik\Plugins\MultiSites\Dashboard')
                                 ->setMethods(null)
                                 ->disableOriginalConstructor()
diff --git a/plugins/Overlay/stylesheets/overlay.css b/plugins/Overlay/stylesheets/overlay.css
index d3db1a5126361043561c009c030627f5a0f04acd..4e30660775036addd2274c0ebe53360a7eb96364 100644
--- a/plugins/Overlay/stylesheets/overlay.css
+++ b/plugins/Overlay/stylesheets/overlay.css
@@ -23,7 +23,7 @@ a#overlayTitle {
     font-size: 12px;
     text-decoration: none;
     color: #4d4d4d;
-    margin-left: 15px;
+    margin-left: 10px;
 }
 a#overlayTitle .icon-help {
     margin-left: 4px;
@@ -146,10 +146,16 @@ body .ui-tooltip.overlayTooltip {
     font-weight: bold;
 }
 
-#topBars {
+.navbar .navbar-right {
+    display: none;
+}
+
+.top_controls {
     display: none;
 }
 
 .overlay-sidebar-container {
     width: 220px;
+    margin-left: -16px;
+    margin-top: 10px;
 }
diff --git a/plugins/Referrers/Categories/ReferrersCategory.php b/plugins/Referrers/Categories/ReferrersCategory.php
index 34c8f053bacc61bbce1f07e72be36316e676e6e3..bde0c76699c383111a7ccb46be42e664db839914 100644
--- a/plugins/Referrers/Categories/ReferrersCategory.php
+++ b/plugins/Referrers/Categories/ReferrersCategory.php
@@ -14,4 +14,5 @@ class ReferrersCategory extends Category
 {
     protected $id = 'Referrers_Referrers';
     protected $order = 15;
+    protected $icon = 'icon-reporting-referer';
 }
diff --git a/plugins/Referrers/Controller.php b/plugins/Referrers/Controller.php
index 2e1deea6afab69130dba4f9cd5fab7397ee7e538..8c0320eb47c555fb9af74e64754afca3fd2cb904 100644
--- a/plugins/Referrers/Controller.php
+++ b/plugins/Referrers/Controller.php
@@ -13,6 +13,7 @@ use Piwik\Common;
 use Piwik\DataTable\Filter\CalculateEvolutionFilter;
 use Piwik\DataTable\Map;
 use Piwik\Metrics;
+use Piwik\NumberFormatter;
 use Piwik\Period\Range;
 use Piwik\Piwik;
 use Piwik\Plugins\CoreVisualizations\Visualizations\Sparklines;
@@ -499,13 +500,16 @@ function DisplayTopKeywords($url = "")
             $currentValue = $currentValues[$name];
             $evolutionName = $name . 'Evolution';
 
+            $currentValueFormatted = NumberFormatter::getInstance()->format($currentValue);
+            $pastValueFormatted    = NumberFormatter::getInstance()->format($pastValue);
+
             $currentValues[$evolutionName] = array(
                 'currentValue' => $currentValue,
                 'pastValue' => $pastValue,
                 'tooltip' => Piwik::translate('General_EvolutionSummaryGeneric', array(
-                    Piwik::translate('General_NVisits', $currentValue),
+                    Piwik::translate('General_NVisits', $currentValueFormatted),
                     $date,
-                    Piwik::translate('General_NVisits', $pastValue),
+                    Piwik::translate('General_NVisits', $pastValueFormatted),
                     $lastPeriodDate,
                     CalculateEvolutionFilter::calculate($currentValue, $pastValue, $precision = 1)
                 ))
diff --git a/plugins/Referrers/lang/bg.json b/plugins/Referrers/lang/bg.json
index 937703c8e324a9505b1073f05ee906bcf8887c4d..886aaa52a30a15d062a687a21027f59e3e617001 100644
--- a/plugins/Referrers/lang/bg.json
+++ b/plugins/Referrers/lang/bg.json
@@ -45,6 +45,6 @@
         "WidgetGetAll": "Всички препоръчители",
         "WidgetSocials": "Списък на социалните мрежи",
         "WidgetTopKeywordsForPages": "Най-използваните ключови думи",
-        "XPercentOfVisits": "%s%% от посещения"
+        "XPercentOfVisits": "%s от посещения"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/cs.json b/plugins/Referrers/lang/cs.json
index f9640a6869c382d634b6b888492fb9cb5386a7a5..740d25a38bcfa3ea547dd2978887ebb97421235e 100644
--- a/plugins/Referrers/lang/cs.json
+++ b/plugins/Referrers/lang/cs.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "VÅ¡echny referrery",
         "WidgetSocials": "Seznam sociálních sítí",
         "WidgetTopKeywordsForPages": "Nejčastější klíčová slova pro URL stránky",
-        "XPercentOfVisits": "%s%% návštěv"
+        "XPercentOfVisits": "%s návštěv"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/da.json b/plugins/Referrers/lang/da.json
index e48a828521c0324fe33708f3a1b1b9ba186e2308..3701ba19422d050005142298ee921f843922fee6 100644
--- a/plugins/Referrers/lang/da.json
+++ b/plugins/Referrers/lang/da.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alle henvisninger",
         "WidgetSocials": "Liste af sociale netværk",
         "WidgetTopKeywordsForPages": "Top søgeord til side URL",
-        "XPercentOfVisits": "%s%% af besøg"
+        "XPercentOfVisits": "%s af besøg"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/de.json b/plugins/Referrers/lang/de.json
index f1aebccedcbd4909f81a3934b5e295fa770839d5..ea22dcfc620920092b241ec7140cc627b509242c 100644
--- a/plugins/Referrers/lang/de.json
+++ b/plugins/Referrers/lang/de.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alle Verweise",
         "WidgetSocials": "Liste Sozialer Netzwerke",
         "WidgetTopKeywordsForPages": "Top-Suchbegriffe für Seiten-URL",
-        "XPercentOfVisits": "%s%% aller Besuche"
+        "XPercentOfVisits": "%s aller Besuche"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/el.json b/plugins/Referrers/lang/el.json
index d6533c4c68e6f8553bc5abeb205e2e1cb9ba338a..ec0a844319e8b91219f75904dc7163f72b02795d 100644
--- a/plugins/Referrers/lang/el.json
+++ b/plugins/Referrers/lang/el.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Όλες οι Παραπομπές",
         "WidgetSocials": "Λίστα κοινωνικών δικτύων",
         "WidgetTopKeywordsForPages": "Δημοφιλέστερες Λέξεις-Κλειδιά για τη Διεύθυνση URL της σελίδας",
-        "XPercentOfVisits": "%s%% των επισκέψεων"
+        "XPercentOfVisits": "%s των επισκέψεων"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/en.json b/plugins/Referrers/lang/en.json
index 1d3355299686a0e1e2e495854c4948df74e7cb28..14f106b9d0449145529bec1af8583663e437e152 100644
--- a/plugins/Referrers/lang/en.json
+++ b/plugins/Referrers/lang/en.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "All Referrers",
         "WidgetSocials": "List of social networks",
         "WidgetTopKeywordsForPages": "Top Keywords for Page URL",
-        "XPercentOfVisits": "%s%% of visits"
+        "XPercentOfVisits": "%s of visits"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/es.json b/plugins/Referrers/lang/es.json
index 32c8cb3a7bca73f066d78eb1ebdfd8add65d5bc2..9d38b45cc830a6c5cbd6f7f46b0db68f8fbadda0 100644
--- a/plugins/Referrers/lang/es.json
+++ b/plugins/Referrers/lang/es.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Todas las referencias",
         "WidgetSocials": "Lista de redes sociales",
         "WidgetTopKeywordsForPages": "Principales palabras clave para el URL de página",
-        "XPercentOfVisits": "%s%% de visitas"
+        "XPercentOfVisits": "%s de visitas"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/et.json b/plugins/Referrers/lang/et.json
index f2d0d0dc8a2232ac0cb972023d6c22eea81ba1a4..a91f3185bc1fa343b1c4625938934a6274c3b410 100644
--- a/plugins/Referrers/lang/et.json
+++ b/plugins/Referrers/lang/et.json
@@ -29,6 +29,6 @@
         "WidgetGetAll": "Kõik viitajad",
         "WidgetSocials": "Nimekiri sotsiaalvõrgustikest",
         "WidgetTopKeywordsForPages": "Lehe URL peamised võtmesõnad",
-        "XPercentOfVisits": "%s%% külastustest"
+        "XPercentOfVisits": "%s külastustest"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/fi.json b/plugins/Referrers/lang/fi.json
index 8131fe33a816b0f072b7a1e87f6cc7c9ceaf4156..7e2ac0ed16a96ea54bd400fd867960d03f8e0569 100644
--- a/plugins/Referrers/lang/fi.json
+++ b/plugins/Referrers/lang/fi.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Kaikki viittaukset",
         "WidgetSocials": "Sosiaalisten verkostojen lista",
         "WidgetTopKeywordsForPages": "Käytetyimmät avainsanat sivun URL:lle",
-        "XPercentOfVisits": "%s%% kävijöistä"
+        "XPercentOfVisits": "%s kävijöistä"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/fr.json b/plugins/Referrers/lang/fr.json
index ff7aa07f750a284cd23b8b5a238a4341111e965e..864f8b31a36b8709a09b3ea9bf71d977126e3d7f 100644
--- a/plugins/Referrers/lang/fr.json
+++ b/plugins/Referrers/lang/fr.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Tous les référents",
         "WidgetSocials": "Liste des réseaux sociaux",
         "WidgetTopKeywordsForPages": "Meilleurs mots-clés pour l'URL",
-        "XPercentOfVisits": "%s%% des visites"
+        "XPercentOfVisits": "%s des visites"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/it.json b/plugins/Referrers/lang/it.json
index 94396a0dcd91bd1a5b794be18fafbec99a5671a8..5343975d95ab959551011aede0667d5e617e14af 100644
--- a/plugins/Referrers/lang/it.json
+++ b/plugins/Referrers/lang/it.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Tutti i Referenti",
         "WidgetSocials": "Elenco di social network",
         "WidgetTopKeywordsForPages": "Top Keyword per URL Pagina",
-        "XPercentOfVisits": "%s%% di visite"
+        "XPercentOfVisits": "%s di visite"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ja.json b/plugins/Referrers/lang/ja.json
index db6978a8f1ac5b2065ef19c4531a37bd590e5dec..f5b1e178a432b7ae0e73b86397239a555db1ca51 100644
--- a/plugins/Referrers/lang/ja.json
+++ b/plugins/Referrers/lang/ja.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "全参照元",
         "WidgetSocials": "ソーシャルネットワークのリスト",
         "WidgetTopKeywordsForPages": "ページ URL のトップキーワード",
-        "XPercentOfVisits": "訪問の %s%%"
+        "XPercentOfVisits": "訪問の %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/nb.json b/plugins/Referrers/lang/nb.json
index ee64f7ba5ab6ba6c8ea18e6b77f946e6cfb10018..c521750718359dc7f1d1e0f9e40a5ce1bce8e328 100644
--- a/plugins/Referrers/lang/nb.json
+++ b/plugins/Referrers/lang/nb.json
@@ -32,6 +32,6 @@
         "WidgetExternalWebsites": "Liste over eksterne nettsteder",
         "WidgetGetAll": "Alle henvisere",
         "WidgetSocials": "Liste over sosiale nettverk",
-        "XPercentOfVisits": "%s%% av besøk"
+        "XPercentOfVisits": "%s av besøk"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/nl.json b/plugins/Referrers/lang/nl.json
index 90630685820d8ed5f5a1f6de650f6a2d1fd26f7a..648c1f51a13f433dadf8f9e7dc588e5f648d56a8 100644
--- a/plugins/Referrers/lang/nl.json
+++ b/plugins/Referrers/lang/nl.json
@@ -47,6 +47,6 @@
         "WidgetGetAll": "Alle Referers",
         "WidgetSocials": "Lijst van sociale netwerken",
         "WidgetTopKeywordsForPages": "Top sleutelwoorden voor pagina URL",
-        "XPercentOfVisits": "%s%% van de bezoeken"
+        "XPercentOfVisits": "%s van de bezoeken"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/pt-br.json b/plugins/Referrers/lang/pt-br.json
index 64174e7f01248ee4b6d09212d927639531baafca..7204ca60696bd9dfd4b2e42d0182f18fc33d4cf8 100644
--- a/plugins/Referrers/lang/pt-br.json
+++ b/plugins/Referrers/lang/pt-br.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Todos os Referenciadores",
         "WidgetSocials": "Lista de redes sociais",
         "WidgetTopKeywordsForPages": "Principais Palavras-chave para a URL da página",
-        "XPercentOfVisits": "%s%% de visitas"
+        "XPercentOfVisits": "%s de visitas"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ro.json b/plugins/Referrers/lang/ro.json
index bd6b9f538f46c4f39cf1a4279d08b003b13ce19b..ea2c7aec8260cd33a566e3bf70f3b88aa2fe3342 100644
--- a/plugins/Referrers/lang/ro.json
+++ b/plugins/Referrers/lang/ro.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Toti Referalii",
         "WidgetSocials": "Listă de reţele sociale",
         "WidgetTopKeywordsForPages": "Cuvinte cheie de top pentru URL-ul paginii",
-        "XPercentOfVisits": "%s%% de vizite"
+        "XPercentOfVisits": "%s de vizite"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/ru.json b/plugins/Referrers/lang/ru.json
index 50dd18267de0a6258aac8afa490ce9fe1538ffe4..1a93015fc251db68d8baf90dafcbf3c16c894399 100644
--- a/plugins/Referrers/lang/ru.json
+++ b/plugins/Referrers/lang/ru.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Все источники трафика",
         "WidgetSocials": "Список социальных сетей",
         "WidgetTopKeywordsForPages": "Топ ключевых слов для страницы URL",
-        "XPercentOfVisits": "%s%% посещений"
+        "XPercentOfVisits": "%s посещений"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/sr.json b/plugins/Referrers/lang/sr.json
index 20949babe97c2aa195c945c5220081e3c41ecdd0..1766549e627eef10928f65663b11177177ca8bee 100644
--- a/plugins/Referrers/lang/sr.json
+++ b/plugins/Referrers/lang/sr.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Sve reference",
         "WidgetSocials": "Spisak društvenih mreža",
         "WidgetTopKeywordsForPages": "Najbolje ključne reči za URL",
-        "XPercentOfVisits": "%s%% poseta"
+        "XPercentOfVisits": "%s poseta"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/sv.json b/plugins/Referrers/lang/sv.json
index 3deca310064be949ae67c21d7fa5645168410873..99319376dd613a56d7bf860412aff378e66b2534 100644
--- a/plugins/Referrers/lang/sv.json
+++ b/plugins/Referrers/lang/sv.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "Alla hänvisningar",
         "WidgetSocials": "Lista över sociala nätverk",
         "WidgetTopKeywordsForPages": "Toppnyckelord för sid-URL",
-        "XPercentOfVisits": "%s%% av besökare"
+        "XPercentOfVisits": "%s av besökare"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/tl.json b/plugins/Referrers/lang/tl.json
index bd973da30aed571c6ab50d3afe8a5bc6126cb58b..cd2b2f5adc009ec3e0d649fe4178d15cf31b219d 100644
--- a/plugins/Referrers/lang/tl.json
+++ b/plugins/Referrers/lang/tl.json
@@ -48,6 +48,6 @@
         "WidgetGetAll": "Lahat ng mga Referrer",
         "WidgetSocials": "Listahan ng mga social network",
         "WidgetTopKeywordsForPages": "Nangungunang mga keyword para sa URL ng Pahina",
-        "XPercentOfVisits": "%s%% ng mga pagbisita"
+        "XPercentOfVisits": "%s ng mga pagbisita"
     }
 }
\ No newline at end of file
diff --git a/plugins/Referrers/lang/zh-cn.json b/plugins/Referrers/lang/zh-cn.json
index 7fdef3a5f02784f40e92a7188efc1f9cd84d3d2a..983f89210b0c4381b3bd26d11dd23ddefac240ef 100644
--- a/plugins/Referrers/lang/zh-cn.json
+++ b/plugins/Referrers/lang/zh-cn.json
@@ -50,6 +50,6 @@
         "WidgetGetAll": "所有来源",
         "WidgetSocials": "社交网络",
         "WidgetTopKeywordsForPages": "主要关键词",
-        "XPercentOfVisits": "%s%% 个访问"
+        "XPercentOfVisits": "%s 个访问"
     }
 }
\ No newline at end of file
diff --git a/plugins/Resolution/Resolution.php b/plugins/Resolution/Resolution.php
index 5ab7692ccf6e1e54dad7d05b5bd7cdacd1079e0b..7bd8cc3be00b5233b3c5ee0c4ef1da304b506c55 100644
--- a/plugins/Resolution/Resolution.php
+++ b/plugins/Resolution/Resolution.php
@@ -23,6 +23,7 @@ class Resolution extends \Piwik\Plugin
     {
         return array(
             'Live.getAllVisitorDetails'            => 'extendVisitorDetails',
+            'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction',
         );
     }
 
@@ -32,4 +33,11 @@ class Resolution extends \Piwik\Plugin
 
         $visitor['resolution']               = $instance->getResolution();
     }
+
+    public function renameUserSettingsModuleAndAction(&$module, &$action)
+    {
+        if ($module == 'UserSettings' && ($action == 'getResolution' || $action == 'getConfiguration')) {
+            $module = 'Resolution';
+        }
+    }
 }
diff --git a/plugins/Resolution/tests/System/UserSettingsBCTest.php b/plugins/Resolution/tests/System/UserSettingsBCTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..beae888701e876c87dae8d8ce73a964b5ae24cb9
--- /dev/null
+++ b/plugins/Resolution/tests/System/UserSettingsBCTest.php
@@ -0,0 +1,79 @@
+<?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\Resolution\tests\System;
+
+use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group Resolution
+ * @group Resolution_System
+ */
+class UserSettingsBCTest extends SystemTestCase
+{
+    /**
+     * @var OneVisitorTwoVisits
+     */
+    public static $fixture;
+
+    /**
+     * @dataProvider getApiForTesting
+     */
+    public function test_Api($api, $params)
+    {
+        $this->runApiTests($api, $params);
+    }
+
+    public function getApiForTesting()
+    {
+        $idSite = self::$fixture->idSite;
+        $dateTime = self::$fixture->dateTime;
+
+        $api = array(
+            'UserSettings.getResolution',
+            'UserSettings.getConfiguration',
+        );
+
+        $result = array();
+
+
+        foreach ($api as $method) {
+            list($module, $action) = explode('.', $method);
+
+            // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing
+            // against Resolution & overwrite the module & action w/ otherRequestParameters)
+            $result[] = array('Resolution.getResolution', array('idSite' => $idSite,
+                'date' => $dateTime,
+                'periods' => array('day'),
+                'testSuffix' => $module . '_' . $method . '_',
+                'otherRequestParameters' => array(
+                    'method' => $method,
+                ),
+            ));
+
+            // api metadata tests
+            $result[] = array('API.getMetadata', array(
+                'idSite' => $idSite,
+                'date' => $dateTime,
+                'apiModule' => $module,
+                'apiAction' => $action,
+                'testSuffix' => $module . '_' . $method . '_',
+            ));
+        }
+
+        return $result;
+    }
+
+    public static function getPathToTestDirectory()
+    {
+        return dirname(__FILE__);
+    }
+}
+
+UserSettingsBCTest::$fixture = new OneVisitorTwoVisits();
\ No newline at end of file
diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..01fee599156f98159f2594eec541d8c5037b418b
--- /dev/null
+++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___API.getMetadata_day.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Settings</category>
+		<name>Visitor Configuration</name>
+		<module>Resolution</module>
+		<action>getConfiguration</action>
+		<dimension>Configuration</dimension>
+		<documentation>This report shows the most common overall configurations that your visitors had. A configuration is the combination of an operating system, a browser type and a screen resolution.</documentation>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Resolution&amp;apiAction=getConfiguration&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Resolution&amp;apiAction=getConfiguration&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>Resolution_getConfiguration</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a4804d3e5dc7b6e50bdb9f2bf97b69f410f9ae8e
--- /dev/null
+++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getConfiguration___Resolution.getResolution_day.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>Windows / Firefox / 1024x768</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b99815c5574ee9a9157e168b4dc15153deefb832
--- /dev/null
+++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Settings</category>
+		<name>Screen Resolution</name>
+		<module>Resolution</module>
+		<action>getResolution</action>
+		<dimension>Resolution</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Resolution&amp;apiAction=getResolution&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Resolution&amp;apiAction=getResolution&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>Resolution_getResolution</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2d976569580c5522bf1a049765be128e69cea26b
--- /dev/null
+++ b/plugins/Resolution/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getResolution___Resolution.getResolution_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>1024x768</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>resolution==1024x768</segment>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/SEO/Metric/Aggregator.php b/plugins/SEO/Metric/Aggregator.php
index bdaf430000e1009453a93f18e9c302afac093be7..ef3c93e6063a203a44faf1a5b7eafd542f803c3e 100644
--- a/plugins/SEO/Metric/Aggregator.php
+++ b/plugins/SEO/Metric/Aggregator.php
@@ -50,7 +50,6 @@ class Aggregator implements MetricsProvider
             $container->get('Piwik\Plugins\SEO\Metric\Bing'),
             $container->get('Piwik\Plugins\SEO\Metric\Alexa'),
             $container->get('Piwik\Plugins\SEO\Metric\DomainAge'),
-            $container->get('Piwik\Plugins\SEO\Metric\Majestic'),
             $container->get('Piwik\Plugins\SEO\Metric\Dmoz'),
         );
 
diff --git a/plugins/SEO/Metric/Alexa.php b/plugins/SEO/Metric/Alexa.php
index d9ec0209543f3e90d2220438caa97b156b05e934..87c5785d366f23111338a8ccacfc8a8bf97350c1 100644
--- a/plugins/SEO/Metric/Alexa.php
+++ b/plugins/SEO/Metric/Alexa.php
@@ -9,6 +9,7 @@
 namespace Piwik\Plugins\SEO\Metric;
 
 use Piwik\Http;
+use Piwik\NumberFormatter;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -35,7 +36,7 @@ class Alexa implements MetricsProvider
             $response = Http::sendHttpRequest(self::URL . urlencode($domain), $timeout = 10, @$_SERVER['HTTP_USER_AGENT']);
 
             $xml = @simplexml_load_string($response);
-            $value = $xml ? (string)$xml->SD->POPULARITY['TEXT'] : null;
+            $value = $xml ? NumberFormatter::getInstance()->formatNumber((int)$xml->SD->POPULARITY['TEXT']) : null;
         } catch (\Exception $e) {
             $this->logger->warning('Error while getting Alexa SEO stats: {message}', array('message' => $e->getMessage()));
             $value = null;
diff --git a/plugins/SEO/Metric/Bing.php b/plugins/SEO/Metric/Bing.php
index c01b23d57660e1f6c8705bc93596c0fad6ef0068..e85d585c132740d25193d20bdd64d91a590f37d8 100644
--- a/plugins/SEO/Metric/Bing.php
+++ b/plugins/SEO/Metric/Bing.php
@@ -9,6 +9,7 @@
 namespace Piwik\Plugins\SEO\Metric;
 
 use Piwik\Http;
+use Piwik\NumberFormatter;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -36,7 +37,7 @@ class Bing implements MetricsProvider
             $response = str_replace('&nbsp;', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']));
 
             if (preg_match('#([0-9\,]+) results#i', $response, $p)) {
-                $pageCount = (int)str_replace(',', '', $p[1]);
+                $pageCount = NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1]));
             } else {
                 $pageCount = 0;
             }
diff --git a/plugins/SEO/Metric/Dmoz.php b/plugins/SEO/Metric/Dmoz.php
index 82ffd248bab1ce6e23e6080209ce4627b19280a8..d21be1e5ca3cbade46c702e8bb288805e01bf8c0 100644
--- a/plugins/SEO/Metric/Dmoz.php
+++ b/plugins/SEO/Metric/Dmoz.php
@@ -9,6 +9,7 @@
 namespace Piwik\Plugins\SEO\Metric;
 
 use Piwik\Http;
+use Piwik\NumberFormatter;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -36,9 +37,9 @@ class Dmoz implements MetricsProvider
         try {
             $response = Http::sendHttpRequest(self::URL . urlencode($domain), $timeout = 10, @$_SERVER['HTTP_USER_AGENT']);
 
-            preg_match('#Open Directory Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $response, $p);
+            preg_match('#DMOZ Sites[^\(]+\([0-9]-[0-9]+ of ([0-9]+)\)#', $response, $p);
             if (!empty($p[1])) {
-                $value = (int)$p[1];
+                $value = NumberFormatter::getInstance()->formatNumber((int)$p[1]);
             } else {
                 $value = 0;
             }
diff --git a/plugins/SEO/Metric/Google.php b/plugins/SEO/Metric/Google.php
index 84e021c2ea5c4f1dee26101ce32c5f7a80919891..cec1d96af946d4ba6f1820865c552004450320c0 100644
--- a/plugins/SEO/Metric/Google.php
+++ b/plugins/SEO/Metric/Google.php
@@ -9,6 +9,7 @@
 namespace Piwik\Plugins\SEO\Metric;
 
 use Piwik\Http;
+use Piwik\NumberFormatter;
 use Psr\Log\LoggerInterface;
 
 /**
@@ -52,7 +53,7 @@ class Google implements MetricsProvider
             $response = str_replace('&nbsp;', ' ', Http::sendHttpRequest($url, $timeout = 10, @$_SERVER['HTTP_USER_AGENT']));
 
             if (preg_match('#([0-9\,]+) results#i', $response, $p)) {
-                return (int)str_replace(',', '', $p[1]);
+                return NumberFormatter::getInstance()->formatNumber((int)str_replace(',', '', $p[1]));
             } else {
                 return 0;
             }
diff --git a/plugins/SEO/Metric/Majestic.php b/plugins/SEO/Metric/Majestic.php
deleted file mode 100644
index f276232945d780478c1364d7e1741591b3fd86bb..0000000000000000000000000000000000000000
--- a/plugins/SEO/Metric/Majestic.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?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\SEO\Metric;
-
-use Piwik\Http;
-use Psr\Log\LoggerInterface;
-
-/**
- * Client for Majestic SEO's HTTP API.
- */
-class Majestic implements MetricsProvider
-{
-    const API_BASE = 'http://simpleapi.majesticseo.com/sapi/';
-    const API_KEY = 'ETHPYY'; // please only use this key within Piwik
-    const LOGO = 'plugins/SEO/images/majesticseo.png';
-
-    /**
-     * @var LoggerInterface
-     */
-    private $logger;
-
-    /**
-     * @param LoggerInterface $logger
-     */
-    public function __construct(LoggerInterface $logger)
-    {
-        $this->logger = $logger;
-    }
-
-    public function getMetrics($domain)
-    {
-        try {
-            $stats = $this->getBacklinkStats($domain);
-            $backlinks = $stats['backlink_count'];
-            $referrers = $stats['referrer_domains_count'];
-        } catch (\Exception $e) {
-            $this->logger->warning('Error while getting Majestic SEO stats: {message}', array('message' => $e->getMessage()));
-            $backlinks = null;
-            $referrers = null;
-        }
-
-        $link = $this->getLinkForUrl($domain);
-
-        return array(
-            new Metric('external-backlinks', 'SEO_ExternalBacklinks', $backlinks, self::LOGO, $link, 'SEO_ViewBacklinksOnMajesticSEO'),
-            new Metric('referrer-domains', 'SEO_ReferrerDomains', $referrers, self::LOGO, $link, 'SEO_ViewBacklinksOnMajesticSEO'),
-        );
-    }
-
-    /**
-     * Returns a URL that can be used to view all SEO data for a particular website.
-     *
-     * @param string $targetSiteUrl The URL of the website for whom SEO stats should be
-     *                              accessible for.
-     * @return string
-     */
-    private function getLinkForUrl($targetSiteUrl)
-    {
-        $domain = @parse_url($targetSiteUrl, PHP_URL_HOST);
-        return "http://www.majesticseo.com/reports/site-explorer/summary/$domain?IndexDataSource=F";
-    }
-
-    /**
-     * Returns backlink statistics including the count of backlinks and count of
-     * referrer domains (domains with backlinks).
-     *
-     * This method issues an HTTP request and waits for it to return.
-     *
-     * @param string $siteDomain The domain of the website to get stats for.
-     * @param int $timeout The number of seconds to wait before aborting
-     *                     the HTTP request.
-     * @return array An array containing the backlink count and referrer
-     *               domain count:
-     *               array(
-     *                   'backlink_count' => X,
-     *                   'referrer_domains_count' => Y
-     *               )
-     *               If either stat is false, either the API returned an
-     *               error, or the IP was blocked for this request.
-     */
-    private function getBacklinkStats($siteDomain, $timeout = 300)
-    {
-        $apiUrl = $this->getApiUrl($method = 'GetBacklinkStats', $args = array(
-            'items' => '1',
-            'item0' => $siteDomain
-        ));
-        $apiResponse = Http::sendHttpRequest($apiUrl, $timeout);
-
-        $result = array(
-            'backlink_count'         => false,
-            'referrer_domains_count' => false
-        );
-
-        $apiResponse = json_decode($apiResponse, $assoc = true);
-        if (!empty($apiResponse)
-            && !empty($apiResponse['Data'])
-        ) {
-            $siteSeoStats = reset($apiResponse['Data']);
-
-            if (isset($siteSeoStats['ExtBackLinks'])
-                && $siteSeoStats['ExtBackLinks'] !== -1
-            ) {
-                $result['backlink_count'] = $siteSeoStats['ExtBackLinks'];
-            }
-
-            if (isset($siteSeoStats['RefDomains'])
-                && $siteSeoStats['RefDomains'] !== -1
-            ) {
-                $result['referrer_domains_count'] = $siteSeoStats['RefDomains'];
-            }
-        }
-
-        return $result;
-    }
-
-    private function getApiUrl($method, $args = array())
-    {
-        $args['sak'] = self::API_KEY;
-
-        $queryString = http_build_query($args);
-        return self::API_BASE . $method . '?' . $queryString;
-    }
-}
diff --git a/plugins/SEO/lang/bg.json b/plugins/SEO/lang/bg.json
index 975eee439f0093bfeeb34bddf8ef045622da98bb..0f51ae5923b54abedaaf8f5cbce7e25b642100dd 100644
--- a/plugins/SEO/lang/bg.json
+++ b/plugins/SEO/lang/bg.json
@@ -5,11 +5,9 @@
         "Bing_IndexedPages": "Bing индексирани страници",
         "Dmoz": "DMOZ записи",
         "DomainAge": "Възраст на домейна",
-        "ExternalBacklinks": "Външни препратки (Majestic)",
         "Google_IndexedPages": "Google индексирани страници",
         "Rank": "Ранг",
         "SeoRankings": "SEO ранг",
-        "SEORankingsFor": "SEO ранг за %s",
-        "ViewBacklinksOnMajesticSEO": "Преглед на доклада за външните препратки в MajesticSEO.com"
+        "SEORankingsFor": "SEO ранг за %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/cs.json b/plugins/SEO/lang/cs.json
index 8e23d1e0549f96c34569c031c100b92004583750..643d16c5380293d4ae15471c279ed2ad46989025 100644
--- a/plugins/SEO/lang/cs.json
+++ b/plugins/SEO/lang/cs.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Stránek zaindexovaných Bingem",
         "Dmoz": "Záznamů v katalogu DMOZ",
         "DomainAge": "Staří domény",
-        "ExternalBacklinks": "Externí zpětné odkazy (Majestic)",
         "Google_IndexedPages": "Stránek zaindexovaných Googlem",
         "Rank": "Hodnocení",
-        "ReferrerDomains": "Odkazující domény (Majestic)",
         "SeoRankings": "Hodnocení SEO",
-        "SEORankingsFor": "SEO hodnocení pro %s",
-        "ViewBacklinksOnMajesticSEO": "Zobrazit externí zpětné odkazy na MajesticSEO.com"
+        "SEORankingsFor": "SEO hodnocení pro %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/da.json b/plugins/SEO/lang/da.json
index 75612e37b560aceb685eb619f697cfb8a3129653..63b4473075aa9ce942fe3a0aa6155a9655c9c64e 100644
--- a/plugins/SEO/lang/da.json
+++ b/plugins/SEO/lang/da.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Bing indekserede sider",
         "Dmoz": "DMOZ angivelser",
         "DomainAge": "Domæne alder",
-        "ExternalBacklinks": "Eksterne backlinks (Majestic)",
         "Google_IndexedPages": "Google indekserede sider",
         "Rank": "Rang",
-        "ReferrerDomains": "Henvisende domæner (Majestic)",
         "SeoRankings": "SEO - søgemaskineoptimering",
-        "SEORankingsFor": "SEO for %s",
-        "ViewBacklinksOnMajesticSEO": "Se rapport om eksterne backlinks på MajesticSEO.com"
+        "SEORankingsFor": "SEO for %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/de.json b/plugins/SEO/lang/de.json
index 471aecda0d992d260654b9f713f6fd2c3840091b..eea5590325ea71fd8f09926af691dd16db9da69e 100644
--- a/plugins/SEO/lang/de.json
+++ b/plugins/SEO/lang/de.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Bing indizierte Seiten",
         "Dmoz": "DMOZ Einträge",
         "DomainAge": "Alter der Domain",
-        "ExternalBacklinks": "Externe Backlinks (Majestic)",
         "Google_IndexedPages": "Google indizierte Seiten",
         "Rank": "Rang",
-        "ReferrerDomains": "Referrer-Domains (Majestic)",
         "SeoRankings": "SEO-Bewertungen",
-        "SEORankingsFor": "SEO-Bewertungen für %s",
-        "ViewBacklinksOnMajesticSEO": "Externen Backlink-Bericht auf MajesticSEO.com ansehen"
+        "SEORankingsFor": "SEO-Bewertungen für %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/el.json b/plugins/SEO/lang/el.json
index d8f03e9df5f992d4094b16dc666b3c11e24b9257..909aca8aa1cb042458d575157710b1836cd1371f 100644
--- a/plugins/SEO/lang/el.json
+++ b/plugins/SEO/lang/el.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Σελίδες σε ευρετήριο Bing",
         "Dmoz": "Εισαγωγές DMOZ",
         "DomainAge": "Ηλικία Domain",
-        "ExternalBacklinks": "Εξωτερικοί Σύνδεσμοι για πίσω (Majestic)",
         "Google_IndexedPages": "Σελίδες σε ευρετήριο Google",
         "Rank": "Βαθμολόγηση",
-        "ReferrerDomains": "Αναφέροντα ονόματα χώρου (Majestic)",
         "SeoRankings": "Βαθμολόγηση BMA",
-        "SEORankingsFor": "Βαθμολόγηση BMA για %s",
-        "ViewBacklinksOnMajesticSEO": "Εμφάνιση της αναφοράς των εξωτερικών κατευθυνόμενων συνδέσμων στο MajesticSEO.com"
+        "SEORankingsFor": "Βαθμολόγηση BMA για %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/en.json b/plugins/SEO/lang/en.json
index 5052c37441a1492b803298160aa5a342bb1c052c..7007ad48f250601c626fc6f44cbe94305fa0965b 100644
--- a/plugins/SEO/lang/en.json
+++ b/plugins/SEO/lang/en.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Bing indexed pages",
         "Dmoz": "DMOZ entries",
         "DomainAge": "Domain Age",
-        "ExternalBacklinks": "External Backlinks (Majestic)",
         "Google_IndexedPages": "Google indexed pages",
         "Rank": "Rank",
-        "ReferrerDomains": "Referrer Domains (Majestic)",
         "SeoRankings": "SEO Rankings",
-        "SEORankingsFor": "SEO Rankings for %s",
-        "ViewBacklinksOnMajesticSEO": "View External Backlinks report on MajesticSEO.com"
+        "SEORankingsFor": "SEO Rankings for %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/es.json b/plugins/SEO/lang/es.json
index 4d1c0b484abfd3c6fd25b916b7ae75a1cf26cac0..ea767d4aa7962d787db7e3ea304895ae3f6758be 100644
--- a/plugins/SEO/lang/es.json
+++ b/plugins/SEO/lang/es.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "páginas indexadas por Bing",
         "Dmoz": "Entradas DMOZ",
         "DomainAge": "Edad del dominio",
-        "ExternalBacklinks": "Enlaces entrantes externos (Majestic)",
         "Google_IndexedPages": "Páginas indexadas por Google",
         "Rank": "Rango",
-        "ReferrerDomains": "Dominios referidos (Majestic)",
         "SeoRankings": "Rankings SEO",
-        "SEORankingsFor": "Rankings SEO de %s",
-        "ViewBacklinksOnMajesticSEO": "Ver informe de enlaces entrantes externos en MajesticSEO.com"
+        "SEORankingsFor": "Rankings SEO de %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/fa.json b/plugins/SEO/lang/fa.json
index c7184d2bc60af16b81f3733681298a326385f7c5..43d9a5706f8b1474283680e991cd60df3785bb89 100644
--- a/plugins/SEO/lang/fa.json
+++ b/plugins/SEO/lang/fa.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "صفحه های نمایه (ایندکس) شده در بینگ",
         "Dmoz": "ورودی های DMOZ",
         "DomainAge": "سن دامنه",
-        "ExternalBacklinks": "لینک دهنده خارجی (Majestic)",
         "Google_IndexedPages": "صفحه های نمایه (ایندکس) شده در گوگل",
         "Rank": "رنک",
-        "ReferrerDomains": "ارجاع دامنه (Majestic)",
         "SeoRankings": "رتبه سئو",
-        "SEORankingsFor": "رتبه سئو برای %s",
-        "ViewBacklinksOnMajesticSEO": "مشاهده گزارش لینک دهنده خارجی در MajesticSEO.com"
+        "SEORankingsFor": "رتبه سئو برای %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/fi.json b/plugins/SEO/lang/fi.json
index b3436a49cd81170da4c192b87446cc3257be8e06..354270e2d38a4046a5f63a8e00fc43c94720d1e9 100644
--- a/plugins/SEO/lang/fi.json
+++ b/plugins/SEO/lang/fi.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Bingin indeksoidut sivut",
         "Dmoz": "DMOZ tulossivut",
         "DomainAge": "Sivun ikä",
-        "ExternalBacklinks": "Ulkoiset paluulinkit (Majestic)",
         "Google_IndexedPages": "Googlen indeksoimat sivut",
         "Rank": "Sijoitus",
-        "ReferrerDomains": "Viittaavat domainit (Majestic)",
         "SeoRankings": "SEO-tulos",
-        "SEORankingsFor": "SEO-sijoitus %s:lle",
-        "ViewBacklinksOnMajesticSEO": "Näe ulkoiset paluulinkit raportissa MajesticSEO.com"
+        "SEORankingsFor": "SEO-sijoitus %s:lle"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/fr.json b/plugins/SEO/lang/fr.json
index 39590d1f05d4b4b1379bc50fe1e003b6717d2cf4..1c0e31279e5deccacc3e7884708ca0d2b8dec82e 100644
--- a/plugins/SEO/lang/fr.json
+++ b/plugins/SEO/lang/fr.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Pages indexées sur Bing",
         "Dmoz": "Entrées DMOZ",
         "DomainAge": "Âge du domaine",
-        "ExternalBacklinks": "Liens de retours externes (Majestic)",
         "Google_IndexedPages": "Page indexées sur Google",
         "Rank": "Notation",
-        "ReferrerDomains": "Domaines référents (Majestic)",
         "SeoRankings": "Notations des SEO",
-        "SEORankingsFor": "Notations SEO pour %s",
-        "ViewBacklinksOnMajesticSEO": "Visualiser les rapports de liens de retour externes sur MajesticSEO.com"
+        "SEORankingsFor": "Notations SEO pour %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/hi.json b/plugins/SEO/lang/hi.json
index 14992335346f619079e136d343ee055223a60242..87fabc60f55d7c7d55b27e691852d77eaac72a0b 100644
--- a/plugins/SEO/lang/hi.json
+++ b/plugins/SEO/lang/hi.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "बिंग अनुक्रमित पृष्ठों",
         "Dmoz": "डीमॉज़ प्रविष्टियां",
         "DomainAge": "डोमेन आयु",
-        "ExternalBacklinks": "बाह्य बैकलिंक (राजसी)",
         "Google_IndexedPages": "गूगल पृष्ठों से अनुक्रमित",
         "Rank": "श्रेणी",
-        "ReferrerDomains": "संदर्भ डोमेन (राजसी)",
         "SeoRankings": "एसईओ रैंकिंग",
-        "SEORankingsFor": "%s के लिए एसईओ रैंकिंग",
-        "ViewBacklinksOnMajesticSEO": "MajesticSEO.com पर बाह्य बैकलिंक रिपोर्ट देखें"
+        "SEORankingsFor": "%s के लिए एसईओ रैंकिंग"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/id.json b/plugins/SEO/lang/id.json
index b9f9ed7bce85b4ea9970f2b16310f03390a8b25d..761690c352fdb97088bc6b9acf408b2844a55869 100644
--- a/plugins/SEO/lang/id.json
+++ b/plugins/SEO/lang/id.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Halaman terindeks Bing",
         "Dmoz": "Msukan DMOZ",
         "DomainAge": "Umut Ranah",
-        "ExternalBacklinks": "Tautal Kembali Luar (Majestic)",
         "Google_IndexedPages": "Halaman terindeks Google",
         "Rank": "Peringkat",
-        "ReferrerDomains": "Ranah Pengarah (Majestic)",
         "SeoRankings": "Peringkat SEO",
-        "SEORankingsFor": "Peringkat SEO untuk %s",
-        "ViewBacklinksOnMajesticSEO": "Lihat Tautan Kembali Luar dalam MajesticSEO.com"
+        "SEORankingsFor": "Peringkat SEO untuk %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/it.json b/plugins/SEO/lang/it.json
index 55b1b044e534dcc3bd6a7f2de940473089abdcd7..f3ef8e5e8974d1b45bc99546bf69e0c5c2a60e67 100644
--- a/plugins/SEO/lang/it.json
+++ b/plugins/SEO/lang/it.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Pagine indicizzate da Bing",
         "Dmoz": "Voci DMOZ",
         "DomainAge": "Età del dominio",
-        "ExternalBacklinks": "Backlinks Esterni (Majestic)",
         "Google_IndexedPages": "Pagine indicizzate da Google",
         "Rank": "Rank",
-        "ReferrerDomains": "Domini Referenti (Majestic)",
         "SeoRankings": "Ranking SEO",
-        "SEORankingsFor": "SEO Ranking per %s",
-        "ViewBacklinksOnMajesticSEO": "Guarda il report sui Backlink Esterni su MajesticSEO.com"
+        "SEORankingsFor": "SEO Ranking per %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/ja.json b/plugins/SEO/lang/ja.json
index 5763a533bc2b878e49e25e356333750110dcefa3..e0496470df8404d5c9d300bfab86c840198b95a4 100644
--- a/plugins/SEO/lang/ja.json
+++ b/plugins/SEO/lang/ja.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Bing インデックスページ",
         "Dmoz": "DMOZ エントリー",
         "DomainAge": "ドメインエイジ",
-        "ExternalBacklinks": "外部バックリンク (Majestic)",
         "Google_IndexedPages": "Google インデックスページ",
         "Rank": "ランク",
-        "ReferrerDomains": "参照元ドメイン (Majestic)",
         "SeoRankings": "SEO ランキング",
-        "SEORankingsFor": "%s の SEO ランキング",
-        "ViewBacklinksOnMajesticSEO": "MajesticSEO.com の外部バックリンクレポートを表示"
+        "SEORankingsFor": "%s の SEO ランキング"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/nl.json b/plugins/SEO/lang/nl.json
index 4b7bd6ac6b5ae20f45b328a61785433f5483d4c0..ef999bc4d7c052cb338ce681890247703539ea1a 100644
--- a/plugins/SEO/lang/nl.json
+++ b/plugins/SEO/lang/nl.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Bing geindexeerde pagina's",
         "Dmoz": "DMOZ items",
         "DomainAge": "Domein leeftijd",
-        "ExternalBacklinks": "Externe terugkoppelingen (Majestic)",
         "Google_IndexedPages": "Google geindexeerde pagina's",
         "Rank": "Ranking",
-        "ReferrerDomains": "Verwijzende domeinen (Majestic)",
         "SeoRankings": "SEO rankings",
-        "SEORankingsFor": "SEO rankings voor %s",
-        "ViewBacklinksOnMajesticSEO": "Bekijk de Externe Backlinks rapportage op MajesticSEO.com"
+        "SEORankingsFor": "SEO rankings voor %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/pt-br.json b/plugins/SEO/lang/pt-br.json
index 2d84aaf68cc7526ef75314e0928ef11dfd103701..08ea01fd07494feacdc770fdb98aee555ef3830b 100644
--- a/plugins/SEO/lang/pt-br.json
+++ b/plugins/SEO/lang/pt-br.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Páginas indexadas no Bing",
         "Dmoz": "Entradas DMOZ",
         "DomainAge": "Idade de Domínio",
-        "ExternalBacklinks": "Backlinks externos (Majestic)",
         "Google_IndexedPages": "Páginas indexadas pelo Google",
         "Rank": "Classificação",
-        "ReferrerDomains": "Domínios Referenciadores (Majestic)",
         "SeoRankings": "Ranking SEO",
-        "SEORankingsFor": "Ranking SEO para %s",
-        "ViewBacklinksOnMajesticSEO": "Ver relatório de Backlinks Externos em MajesticSEO.com"
+        "SEORankingsFor": "Ranking SEO para %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/ro.json b/plugins/SEO/lang/ro.json
index 114fb09e454a82b978af9f05329b69257e37f10c..b120d09e522e2ee3c041d08084c38f40b3033e2b 100644
--- a/plugins/SEO/lang/ro.json
+++ b/plugins/SEO/lang/ro.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Pagini indexate de Bing",
         "Dmoz": "DMOZ intrari",
         "DomainAge": "Vechime domeniu",
-        "ExternalBacklinks": "Backlink-uri externe (Majestic)",
         "Google_IndexedPages": "Pagini indexate de Google",
         "Rank": "Poziţie",
-        "ReferrerDomains": "Referrer Domenii (Majestic)",
         "SeoRankings": "Poziţionări SEO",
-        "SEORankingsFor": "Poziţionări SEO pentru %s",
-        "ViewBacklinksOnMajesticSEO": "Vezi backlink externe cu raport pe MajesticSEO.com"
+        "SEORankingsFor": "Poziţionări SEO pentru %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/ru.json b/plugins/SEO/lang/ru.json
index 62e25a0e9007a523c727f025339694ed61465b8b..5d2ed02d0249b6a1c1991807c6c7dacee0dfdd82 100644
--- a/plugins/SEO/lang/ru.json
+++ b/plugins/SEO/lang/ru.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Страниц в индексе Bing",
         "Dmoz": "Записей в каталоге DMOZ",
         "DomainAge": "Возраст домена",
-        "ExternalBacklinks": "Внешние обратные ссылки (Majestic)",
         "Google_IndexedPages": "Страниц в индексе Google",
         "Rank": "Рейтинг",
-        "ReferrerDomains": "Ссылающиеся домены (Majestic)",
         "SeoRankings": "SEO-Рейтинги",
-        "SEORankingsFor": "SEO Рейтинги для %s",
-        "ViewBacklinksOnMajesticSEO": "Посмотреть Внешние обратные ссылки на сайте MajesticSEO.com"
+        "SEORankingsFor": "SEO Рейтинги для %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/sr.json b/plugins/SEO/lang/sr.json
index eff63967c012233269b5148ae3ddcc853949de4f..25ea4c2abd65e47e5d3b82dfc64329d9aff31f23 100644
--- a/plugins/SEO/lang/sr.json
+++ b/plugins/SEO/lang/sr.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Stranice koje je indeksirao Bing",
         "Dmoz": "DMOZ stavke",
         "DomainAge": "Starost domena",
-        "ExternalBacklinks": "Eksterni povratni linkovi (Majestic)",
         "Google_IndexedPages": "Stranice koje je indeksirao Google",
         "Rank": "Rang",
-        "ReferrerDomains": "Domeni sa referencama (Majestic)",
         "SeoRankings": "SEO rangiranje",
-        "SEORankingsFor": "SEO rangiranje za %s",
-        "ViewBacklinksOnMajesticSEO": "Prikaži izveštaj o spoljnim povratnim linkovima sa MajesticSEO.com"
+        "SEORankingsFor": "SEO rangiranje za %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/sv.json b/plugins/SEO/lang/sv.json
index f170280b4ce63d1b999b77dce803ff8c87f31e63..15184f8251dbbcb0f8d94a3b0d46ec8d4f517119 100644
--- a/plugins/SEO/lang/sv.json
+++ b/plugins/SEO/lang/sv.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Bing indexerade sidor",
         "Dmoz": "DMOZ poster",
         "DomainAge": "Domänålder",
-        "ExternalBacklinks": "Externa tillbakalänkar (Majestic)",
         "Google_IndexedPages": "Google indexerade sidor",
         "Rank": "Rank",
-        "ReferrerDomains": "Refererande Domäner (Majestic)",
         "SeoRankings": "SEO Ranking",
-        "SEORankingsFor": "SEO Ranking för %s",
-        "ViewBacklinksOnMajesticSEO": "Se externa länkrapporter på den här sidan: MajesticSEO.com"
+        "SEORankingsFor": "SEO Ranking för %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/tl.json b/plugins/SEO/lang/tl.json
index 7e743740889f27ee3f1e3e4f2cdbe4bda87ce1f7..197d2d1f61ed33a4101d6691a254348dfee9235b 100644
--- a/plugins/SEO/lang/tl.json
+++ b/plugins/SEO/lang/tl.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Mga na index na pahina ng bing",
         "Dmoz": "DMOZ entries",
         "DomainAge": "Edad ng Domain",
-        "ExternalBacklinks": "Panlabas na Backlink (Majestic)",
         "Google_IndexedPages": "Na index ng Google ang mga pahina",
         "Rank": "Ranggo",
-        "ReferrerDomains": "Referrer Domain (Majestic)",
         "SeoRankings": "Ranggo sa SEO",
-        "SEORankingsFor": "Ranggo ng SEO para sa %s",
-        "ViewBacklinksOnMajesticSEO": "Tingnan ang mga ulat sa External Backlinks sa MajesticSEO.com"
+        "SEORankingsFor": "Ranggo ng SEO para sa %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/vi.json b/plugins/SEO/lang/vi.json
index 2a063b7ba74867807178228f8d075124811dfbfd..56b8072a16e7fc838fe50cc820a344a68bdf2548 100644
--- a/plugins/SEO/lang/vi.json
+++ b/plugins/SEO/lang/vi.json
@@ -4,12 +4,9 @@
         "Bing_IndexedPages": "Các trang được lập chỉ mục Bing",
         "Dmoz": "Các mục DMOZ",
         "DomainAge": "Tuổi tên miền",
-        "ExternalBacklinks": "Các backlink ngoài (Majestic)",
         "Google_IndexedPages": "Các trang được lập chỉ mục Google",
         "Rank": "Xếp hạng",
-        "ReferrerDomains": "Các tên miền giới thiệu (Majestic)",
         "SeoRankings": "Xếp hạng SEO",
-        "SEORankingsFor": "Xếp hạng SEO cho %s",
-        "ViewBacklinksOnMajesticSEO": "Xem các báo cáo Backlink ngoài trên MajesticSEO.com"
+        "SEORankingsFor": "Xếp hạng SEO cho %s"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/lang/zh-cn.json b/plugins/SEO/lang/zh-cn.json
index 77a35b915d7d7f7b565a1076b523f6d46b122a1e..62ee5e081599ed1c00ad89bf5bff5c176e4165e7 100644
--- a/plugins/SEO/lang/zh-cn.json
+++ b/plugins/SEO/lang/zh-cn.json
@@ -5,12 +5,9 @@
         "Bing_IndexedPages": "Bing 索引页面",
         "Dmoz": "DMOZ 条目",
         "DomainAge": "域名年限",
-        "ExternalBacklinks": "外部反向链接 (Majestic)",
         "Google_IndexedPages": "Google 索引页面",
         "Rank": "排名",
-        "ReferrerDomains": "来源域名 (Majestic)",
         "SeoRankings": "SEO排名",
-        "SEORankingsFor": "%s 的SEO排名",
-        "ViewBacklinksOnMajesticSEO": "查看 MajesticSEO.com 上的外部反向链接报表"
+        "SEORankingsFor": "%s 的SEO排名"
     }
 }
\ No newline at end of file
diff --git a/plugins/SEO/templates/getRank.twig b/plugins/SEO/templates/getRank.twig
index 80bf40ef7ba29e9ea2369595cc54955e4a7b79e1..6eb025d7e433d370f81325111fe521fc7d157e8e 100644
--- a/plugins/SEO/templates/getRank.twig
+++ b/plugins/SEO/templates/getRank.twig
@@ -28,11 +28,9 @@
 {% set seoLink %}{% if rank.logo_link is not empty %}<a class="linkContent" href="?module=Proxy&action=redirect&url={{ rank.logo_link|url_encode }}"
                                                     target="_blank"
                          {% if rank.logo_tooltip is not empty %}title="{{ rank.logo_tooltip }}"{% endif %}>{% endif %}{% endset %}
-                            {% set majesticLink %}{{ seoLink }}Majestic</a>{% endset %}
                             <td>{% if rank.logo_link is not empty %}{{ seoLink|raw }}{% endif %}<img
                                             style='vertical-align:middle;margin-right:6px;' src='{{ rank.logo }}' border='0'
-                                            alt="{{ rank.label }}">{% if rank.logo_link is not empty %}</a>{% endif %} {{ rank.label|replace({"Majestic":
-                                majesticLink})|raw }}
+                                            alt="{{ rank.label }}">{% if rank.logo_link is not empty %}</a>{% endif %} {{ rank.label|raw }}
                             </td>
                             <td>
                                 <div style="margin-left:15px;">
diff --git a/plugins/ScheduledReports/ScheduledReports.php b/plugins/ScheduledReports/ScheduledReports.php
index c66a6ad0d68ea8f3c210370d0ea2c20f3155c18d..f306dd8d0515c7625b718ec8e76d4cb6694014d1 100644
--- a/plugins/ScheduledReports/ScheduledReports.php
+++ b/plugins/ScheduledReports/ScheduledReports.php
@@ -191,6 +191,9 @@ class ScheduledReports extends \Piwik\Plugin
         $filteredReportMetadata = array();
         foreach ($availableReportMetadata as $reportMetadata) {
             // removing reports from the API category and MultiSites.getOne
+            if (empty($reportMetadata['category'])) {
+                var_dump($reportMetadata);exit;
+            }
             if (
                 $reportMetadata['category'] == 'API' ||
                 $reportMetadata['category'] == Piwik::translate('General_MultiSitesSummary') && $reportMetadata['name'] == Piwik::translate('General_SingleWebsitesDashboard')
diff --git a/plugins/ScheduledReports/templates/index.twig b/plugins/ScheduledReports/templates/index.twig
index 65ba2ba53aca73f26526562acf2968c78f79297a..542fab8e70b06072d30dc4bfaf04bf7089617cc3 100644
--- a/plugins/ScheduledReports/templates/index.twig
+++ b/plugins/ScheduledReports/templates/index.twig
@@ -1,19 +1,17 @@
 {% extends 'user.twig' %}
 
-
 {% set title %}{{ 'ScheduledReports_PersonalEmailReports'|translate }}{% endset %}
 
+{% block topcontrols %}
+    {% include "@CoreHome/_siteSelectHeader.twig" %}
+    {% include "@CoreHome/_periodSelect.twig" %}
+{% endblock %}
+
 {% block content %}
 
 <div class="emailReports">
     <h2 piwik-enriched-headline help-url="http://piwik.org/docs/email-reports/">{{ title }}</h2>
 
-    {% include "@CoreHome/_siteSelectHeader.twig" %}
-
-    <div class="top_controls">
-        {% include "@CoreHome/_periodSelect.twig" %}
-    </div>
-
     <span id="reportSentSuccess"></span>
     <span id="reportUpdatedSuccess"></span>
 
diff --git a/plugins/SegmentEditor/SegmentSelectorControl.php b/plugins/SegmentEditor/SegmentSelectorControl.php
index 4e88d2191f12803d74d538374c1e1fd84a88473b..e37354e1cd8a0ac81f82d9012c98cc91357ebaa7 100644
--- a/plugins/SegmentEditor/SegmentSelectorControl.php
+++ b/plugins/SegmentEditor/SegmentSelectorControl.php
@@ -31,7 +31,7 @@ class SegmentSelectorControl extends UIControl
 
         $this->jsClass = "SegmentSelectorControl";
         $this->cssIdentifier = "segmentEditorPanel";
-        $this->cssClass = "piwikTopControl";
+        $this->cssClass = "piwikTopControl borderedControl piwikSelector";
 
         $this->idSite = $idSite ?: Common::getRequestVar('idSite', false, 'int');
 
diff --git a/plugins/SegmentEditor/javascripts/Segmentation.js b/plugins/SegmentEditor/javascripts/Segmentation.js
index f8def3655c5d1009a6e30c2a15d2679e4bd1e874..0e47bd7d195f1e8e58fd0928a8dce8ed9fc2b4ad 100644
--- a/plugins/SegmentEditor/javascripts/Segmentation.js
+++ b/plugins/SegmentEditor/javascripts/Segmentation.js
@@ -210,7 +210,7 @@ Segmentation = (function($) {
                     if(!$.browser.mozilla) {
                         checkSelected = encodeURIComponent(checkSelected);
                     }
-                    
+
                     if( checkSelected == self.currentSegmentStr){
                         injClass = 'class="segmentSelected"';
                     }
@@ -258,7 +258,7 @@ Segmentation = (function($) {
 
         var closeAllOpenLists = function() {
             $(".segmentationContainer", self.target).each(function() {
-                if($(this).closest('.segmentEditorPanel').hasClass("visible"))
+                if($(this).closest('.segmentEditorPanel').hasClass("expanded"))
                     $(this).trigger("click");
             });
         };
@@ -370,20 +370,22 @@ Segmentation = (function($) {
         var bindEvents = function () {
             self.target.on('click', '.segmentationContainer', function (e) {
                 // hide all other modals connected with this widget
-                if (self.content.closest('.segmentEditorPanel').hasClass("visible")) {
+                if (self.content.closest('.segmentEditorPanel').hasClass("expanded")) {
                     if ($(e.target).hasClass("jspDrag") === true
                         || $(e.target).hasClass("segmentFilterContainer") === true
                         || $(e.target).parents().hasClass("segmentFilterContainer") === true
                         || $(e.target).hasClass("filterNoResults")) {
                         e.stopPropagation();
                     } else {
-                        self.jscroll.destroy();
-                        self.target.closest('.segmentEditorPanel').removeClass('visible');
+                        if (self.jscroll) {
+                            self.jscroll.destroy();
+                        }
+                        self.target.closest('.segmentEditorPanel').removeClass('expanded');
                     }
                 } else {
                     // for each visible segmentationContainer -> trigger click event to close and kill scrollpane - very important !
                     closeAllOpenLists();
-                    self.target.closest('.segmentEditorPanel').addClass('visible');
+                    self.target.closest('.segmentEditorPanel').addClass('expanded');
                     self.target.find('.segmentFilter').val(self.translations['General_Search']).trigger('keyup');
                     self.jscroll = self.target.find(".segmentList").jScrollPane({
                         autoReinitialise: true,
@@ -1250,7 +1252,7 @@ $(document).ready(function() {
             }
 
             if ($(e.target).closest('.segmentListContainer').length === 0
-                && self.$element.hasClass("visible")
+                && self.$element.hasClass("expanded")
             ) {
                 $(".segmentationContainer", self.$element).trigger("click");
             }
@@ -1258,8 +1260,6 @@ $(document).ready(function() {
 
         $('body').on('mouseup', this.onMouseUp);
 
-        // re-initialize top controls since the size of the control is not the same after it's
-        // initialized.
         initTopControls();
     };
 
diff --git a/plugins/SegmentEditor/stylesheets/segmentation.less b/plugins/SegmentEditor/stylesheets/segmentation.less
index 0109d1183670fc7ceb69ba01d741b4fc42cf03cc..125a0c9f5639a22819afcd412ddd28de719adf2f 100644
--- a/plugins/SegmentEditor/stylesheets/segmentation.less
+++ b/plugins/SegmentEditor/stylesheets/segmentation.less
@@ -131,11 +131,6 @@ div.scrollable {
     padding: 0 0 8px 0;
 }
 
-.segment-element .segment-nav h4.visits {
-    padding-left: 28px;
-    background: url(plugins/SegmentEditor/images/icon-users.png) 0 0 no-repeat;
-}
-
 .segment-element .segment-nav h4 a {
     color: #255792;
     text-decoration: none;
@@ -403,7 +398,7 @@ div.scrollable {
 
 .segment-element .segment-footer {
     background: #eae8e3;
-    border-top: 1px solid #a9a399;
+    border-top: 1px solid @theme-color-background-tinyContrast;
     text-align: right;
     padding: 7px 10px;
     margin: 0 -4px -6px -4px;
@@ -430,11 +425,14 @@ div.scrollable {
     z-index: 121; /* Should be bigger than 'Dashboard widget selector' (z-index: 120) */
     background: #f7f7f7;
     border: 1px solid #e4e5e4;
-    padding: 5px 10px 6px 10px;
     margin-right: 10px;
     border-radius: 4px;
     color: @theme-color-text-light;
     font-size: 14px;
+
+    .segmentListContainer {
+        line-height: 14px;
+    }
 }
 
 .top_controls .segmentEditorPanel {
@@ -486,7 +484,6 @@ div.scrollable {
 .segmentationContainer ul.submenu {
     padding-top: 5px;
     display: none;
-    float: left;
     margin-bottom: 5px;
 }
 
@@ -501,54 +498,53 @@ div.scrollable {
     height: 16px;
 }
 
-.segmentEditorPanel.visible .segmentationContainer {
-    width: 200px;
+.segmentEditorPanel.expanded .segmentationContainer {
+    width: 240px;
     border-bottom-left-radius: 0;
     border-bottom-right-radius: 0;
 }
 
-.segmentEditorPanel.visible ul.submenu {
-    display: block;
+.segmentEditorPanel.expanded ul.submenu {
+    display: inline-block;
     list-style: none;
 }
 
 .segmentFilterContainer {
-    margin-left: -10px;
-    margin-right: -10px;
     margin-bottom: 10px;
+    display: inline-block;
 }
 
-.segmentEditorPanel.visible .segmentFilterContainer > input[type="text"] {
-    font-size: 13px;
-    width: 100%;
+.segmentEditorPanel.expanded .segmentFilterContainer > input[type="text"] {
+    font-size: 11px;
+    width: 200px;
     padding: 0;
-    border: 1px solid #ccc;
-    border-width: 1px 0;
+    border: 1px solid #d0d0d0;
+    border-width: 1px;
     color: #999;
-    padding: 11px 32px 11px 12px;
+    padding: 7px 10px 7px 10px;
 }
 
-.segmentEditorPanel.visible .segmentFilterContainer > span {
+.segmentEditorPanel.expanded .segmentFilterContainer > span {
     position: absolute;
     width: 13px;
     height: 13px;
-    right: 12px;
-    top: 16px;
+    right: 23px;
+    top: 48px;
     cursor: pointer;
 }
 
-.segmentEditorPanel.visible .segmentFilterContainer:hover > span {
+.segmentEditorPanel.expanded .segmentFilterContainer:hover > span {
     background: url(plugins/SegmentEditor/images/reset_search.png);
 }
 
-.segmentEditorPanel.visible .filterNoResults {
+.segmentEditorPanel.expanded .filterNoResults {
     font-style: italic;
 }
 
-.segmentEditorPanel.visible .add_new_segment {
+.segmentEditorPanel.expanded .add_new_segment {
     clear: both;
     float: right;
-    margin: 12px 0 10px;
+    margin: 12px 9px 10px 0;
 }
 
 .segmentationContainer > ul.submenu > li {
@@ -557,14 +553,6 @@ div.scrollable {
     cursor: pointer;
 }
 
-span.segmentationTitle {
-    background: url(plugins/Morpheus/images/sort_subtable_desc.png) no-repeat right 0;
-    padding-right: 20px;
-    min-width: 180px;
-    display: block;
-    cursor: pointer;
-}
-
 .segmentList {
     max-height: 300px;
     margin-top: 5px;
@@ -668,28 +656,26 @@ a.metric_category {
     z-index: 1000 !important;
 }
 
+.ui-autocomplete.ui-menu.ui-widget {
+    box-shadow: 0 1px 2px 0 rgba(0,0,0,0.14), 0 3px 1px -2px rgba(0,0,0,0.2), 0 1px 5px 0 rgba(0,0,0,0.12);
+}
+
 @media all and (max-width: 749px) {
     span.segmentationTitle,
-    .segmentEditorPanel.visible .segmentationContainer {
+    .segmentEditorPanel.expanded .segmentationContainer {
         width: auto;
     }
 }
 
 .dropdown-body {
-    position: absolute;
-    top: 100%;
-    left: -1px;
     background-color: #f7f7f7;
-    padding: 0px 10px;
-    border: 1px solid #e4e5e4;
     border-top-width: 0px;
     display: none;
     border-bottom-left-radius: 4px;
     border-bottom-right-radius: 4px;
 }
 
-.segmentEditorPanel.visible .dropdown-body {
-    display: block;
+.segmentEditorPanel.expanded .dropdown-body {
     border-top-left-radius: 0;
     border-top-right-radius: 0;
 }
@@ -699,7 +685,7 @@ a.metric_category {
     background: #f1f0eb
 }
 
-.segmentEditorPanel.visible {
+.segmentEditorPanel.expanded {
     border-bottom-left-radius: 0;
     border-bottom-right-radius: 0;
 }
@@ -711,7 +697,8 @@ a.metric_category {
 
 .available_segments {
     display: inline-block;
-    width: 160px;
+    width: 150px;
+    padding-left: 5px;
 }
 
 .segmentationTitle,
@@ -722,7 +709,6 @@ a.metric_category {
     white-space: nowrap;
 }
 
-.segmentationTitle,
 .segment-element .segment-nav a.dropdown {
     max-width: 180px;
 }
@@ -731,8 +717,18 @@ a.metric_category {
     max-width: 145px;
 }
 
-.segmentEditorPanel.visible .segmentationTitle {
-    max-width: 200px;
+.segmentEditorPanel .segmentationTitle {
+    text-overflow: ellipsis;
+    display: inline-block;
+    max-width: 170px;
+}
+
+.segmentEditorPanel a.title {
+    padding-bottom: 8px;
+}
+
+.segmentEditorPanel.expanded .segmentationTitle {
+    max-width: 180px;
     overflow: visible; /* restore default */
     white-space: normal; /* restore default */
 }
diff --git a/plugins/SegmentEditor/templates/_segmentSelector.twig b/plugins/SegmentEditor/templates/_segmentSelector.twig
index d9d9f3fb9d8bb73126b46fae1836f9dbd5db6ddf..7a8019d37e8bf8d978ec949c978057cec5642517 100644
--- a/plugins/SegmentEditor/templates/_segmentSelector.twig
+++ b/plugins/SegmentEditor/templates/_segmentSelector.twig
@@ -1,7 +1,7 @@
 <div class="SegmentEditor" style="display:none;">
-    <div class="segmentationContainer listHtml">
-        <span class="segmentationTitle"></span>
-        <div class="dropdown-body">
+    <div class="segmentationContainer listHtml" title="{{ 'SegmentEditor_ChooseASegment'|translate|e('html_attr') }}">
+        <a class="title"><span class="icon icon-segment"></span><span class="segmentationTitle"></span></a>
+        <div class="dropdown dropdown-body">
             <div class="segmentFilterContainer">
                 <input class="segmentFilter" type="text" value="{{ 'General_Search'|translate }}"/>
                 <span/>
@@ -86,9 +86,10 @@
             <a href="#">+ {{ 'SegmentEditor_AddANDorORCondition'|translate(andCondition)|raw }}</a>
         </div>
     </div>
-    <div class="segment-element">
+    <div class="segment-element borderedControl expanded">
         <div class="segment-nav">
-            <h4 class="visits"><span class="available_segments"><strong>
+            <h4 class="visits">
+                <span class="icon-segment"></span><span class="available_segments"><strong>
                 <select class="available_segments_select"></select>
             </strong></span></h4>
             <div class="scrollable">
diff --git a/plugins/SitesManager/SitesManager.php b/plugins/SitesManager/SitesManager.php
index 200f268a8aa659f626f8d2f6b4c27e60dc0135db..4b686e2bdefbacce85fa5f0e1df51a4e6b8cae89 100644
--- a/plugins/SitesManager/SitesManager.php
+++ b/plugins/SitesManager/SitesManager.php
@@ -10,6 +10,7 @@ namespace Piwik\Plugins\SitesManager;
 
 use Piwik\Common;
 use Piwik\Archive\ArchiveInvalidator;
+use Piwik\Container\StaticContainer;
 use Piwik\Db;
 use Piwik\Plugins\PrivacyManager\PrivacyManager;
 use Piwik\Measurable\Settings\Storage;
@@ -69,7 +70,7 @@ class SitesManager extends \Piwik\Plugin
         // we do not delete logs here on purpose (you can run these queries on the log_ tables to delete all data)
         Cache::deleteCacheWebsiteAttributes($idSite);
 
-        $archiveInvalidator = new ArchiveInvalidator();
+        $archiveInvalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
         $archiveInvalidator->forgetRememberedArchivedReportsToInvalidateForSite($idSite);
 
         $measurableStorage = new Storage(Db::get(), $idSite);
diff --git a/plugins/SitesManager/lang/ko.json b/plugins/SitesManager/lang/ko.json
index 33d1d5ab76899e1b0b0934a5923f6bf0d9ead211..dc44ef9dfbd77c69005c45ec352c7e068ae6ef13 100644
--- a/plugins/SitesManager/lang/ko.json
+++ b/plugins/SitesManager/lang/ko.json
@@ -1,6 +1,7 @@
 {
     "SitesManager": {
         "AddSite": "새 사이트 추가",
+        "AddMeasurable": "새로운 측정할 것 추가",
         "AdvancedTimezoneSupportNotFound": "이 서버의 PHP에서는 확장 시간대가 지원되지 않습니다 (PHP> = 5.2에서 지원). 직접 UTC 오프셋을 지정합니다.",
         "AliasUrlHelp": "이것은 권장되지만 필수는 아닙니다. 사용자가이 웹사이트의 접근에 사용하는 다양한 URL을 지정하려면 한 줄에 하나의 URL을 입력합니다. 웹사이트의 URL 별칭은 '소스'> 웹 사이트의 보고서에 표시되지 않습니다. URL의 'www'의 유무는 Piwik가 자동으로 판단합니다.",
         "ChangingYourTimezoneWillOnlyAffectDataForward": "시간대 변경은 향후의 데이터에만 적용되고 이전 데이터에는 적용되지 않습니다.",
@@ -47,8 +48,9 @@
         "NotFound": "웹사이트를 찾을 수 없습니다:",
         "NoWebsites": "관리할 웹사이트를 가지고 있지 않습니다.",
         "OnlyOneSiteAtTime": "일단 웹사이트는 하나만 편집할 수 있습니다. 웹사이트 %s의 변경 사항을 저장하거나 취소하세요.",
-        "PiwikOffersEcommerceAnalytics": "Piwik은 고급 전자상거래 분석 및 추적 그리고 리포팅할 수 있습니다. %s전자상 상거래 분석%s에 대하여 더 알아보세요.",
+        "PiwikOffersEcommerceAnalytics": "Piwik은 고급 전자상거래 분석 및 추적 그리고 리포팅할 수 있습니다. %s전자상거래 분석%s에 대하여 더 알아보세요.",
         "PiwikWillAutomaticallyExcludeCommonSessionParameters": "일반적인 세션 매개 변수 (%s)는 Piwik가 자동으로 제외합니다.",
+        "PluginDescription": "웹사이트 관리에서 새로운 웹사이트를 추가하고 기존의 웹사이트를 수정할 수 있습니다.",
         "SearchCategoryDesc": "Piwik는 내부 사이트 검색어에 대한 검색 카테고리를 추적할 수 있습니다.",
         "SearchCategoryLabel": "카테고리 매개변수",
         "SearchCategoryParametersDesc": "사이트 검색 카테고리를 지정하는 모든 쿼리 매개변수 이름를 쉼표로 구분하여 모두 입력합니다.",
@@ -63,12 +65,20 @@
         "ShowTrackingTag": "트래킹 태그 보기",
         "Sites": "웹사이트",
         "SiteSearchUse": "당신은 Piwik를 사용하여 웹사이트의 내부검색 엔진에서 방문자가 어떤 검색을 했는지 추적하고 보고받을 수 있습니다.",
+        "SiteWithoutDataTitle": "아직 아무런 데이터가 기록되지 않았습니다.",
+        "SiteWithoutDataDescription": "아직 해당 사이트를 추적하여 분석한 데이터가 없습니다.",
+        "SiteWithoutDataSetupTracking": "%1$s자바스크립트 트래킹 코드%2$s를 당신의 웹사이트에 추가하시고, 페이지를 새로고침해 주세요.",
+        "SuperUserAccessCan": "슈퍼 유저는 새로운 사이트에 대해서 %s일반 웹사이트 설정%s을 통해 관리할 수 있습니다.",
         "Timezone": "시간대",
         "TrackingSiteSearch": "사이트 내부 검색 추적",
         "TrackingTags": "%s의 추적 코드",
         "Urls": "URL",
         "UTCTimeIs": "UTC 시간은 %s입니다.",
+        "OnlyMatchedUrlsAllowed": "위에 적혀진 URL들 중 하나에서 시작될 경우에만 방문자를 추적합니다.",
+        "OnlyMatchedUrlsAllowedHelp": "이것이 활성화 될 경우, Piwik는 페이지 URL이 당신 웹사이트의 알려진 URL일 경우에만 내부 추적만을 수행한다. 이를 통해, 사람들이 분석 결과를 통해 다른 사이트에 스팸을 보내는 것을 방지할 수 있다.",
         "WebsitesManagement": "웹사이트 관리",
+        "XManagement": "%s 관리",
+        "ChooseMeasurableTypeHeadline": "무엇을 측정하고 싶으십니까?",
         "YouCurrentlyHaveAccessToNWebsites": "현재 %s개의 웹사이트가 연결되어 있습니다.",
         "YourCurrentIpAddressIs": "당신의 현재 IP 주소는 %s입니다."
     }
diff --git a/plugins/SitesManager/stylesheets/SitesManager.less b/plugins/SitesManager/stylesheets/SitesManager.less
index 41d1035bb1147906e3604f255950b2ee2850620c..cd3a43f7c818d766fc599ea7d97dd7672829eeeb 100644
--- a/plugins/SitesManager/stylesheets/SitesManager.less
+++ b/plugins/SitesManager/stylesheets/SitesManager.less
@@ -104,9 +104,8 @@ td.editable-site-field:hover {
 }
 
 .site-without-data {
-    padding: 15px;
     h2 {
-        border-bottom: 1px solid #ccc;
+        border-bottom: 1px solid @theme-color-background-tinyContrast;
         margin: 25px 0;
         padding: 0 0 5px 0;
         font-size: 24px;
diff --git a/plugins/SitesManager/templates/siteWithoutData.twig b/plugins/SitesManager/templates/siteWithoutData.twig
index 20b63266449075d844749b398e5e5c3db1066d5c..eafb7a287f2bf345bc5b74b22ad1b809396976f4 100644
--- a/plugins/SitesManager/templates/siteWithoutData.twig
+++ b/plugins/SitesManager/templates/siteWithoutData.twig
@@ -2,9 +2,11 @@
 
 {% block notification %}{% endblock %}
 
-{% block content %}
-
+{% block topcontrols %}
     {% include "@CoreHome/_siteSelectHeader.twig" %}
+{% endblock %}
+
+{% block content %}
 
     <div class="site-without-data">
 
diff --git a/plugins/SitesManager/tests/Integration/SitesManagerTest.php b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
index b71695ae5bce125a89d800225f8d3f5940841127..15345fc231969994e220df6bb0d531b40f343090 100644
--- a/plugins/SitesManager/tests/Integration/SitesManagerTest.php
+++ b/plugins/SitesManager/tests/Integration/SitesManagerTest.php
@@ -11,6 +11,7 @@ namespace Piwik\Plugins\SitesManager\tests\Integration;
 use Piwik\Access;
 use Piwik\Cache;
 use Piwik\Archive\ArchiveInvalidator;
+use Piwik\Container\StaticContainer;
 use Piwik\Date;
 use Piwik\Plugins\SitesManager\SitesManager;
 use Piwik\Tests\Framework\Fixture;
@@ -54,7 +55,7 @@ class SitesManagerTest extends IntegrationTestCase
 
     public function test_onSiteDeleted_shouldRemoveRememberedArchiveReports()
     {
-        $archive = new ArchiveInvalidator();
+        $archive = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
         $archive->rememberToInvalidateArchivedReportsLater($this->siteId, Date::factory('2014-04-05'));
         $archive->rememberToInvalidateArchivedReportsLater($this->siteId, Date::factory('2014-04-06'));
         $archive->rememberToInvalidateArchivedReportsLater(4949, Date::factory('2014-04-05'));
diff --git a/plugins/Transitions/javascripts/transitions.js b/plugins/Transitions/javascripts/transitions.js
index 52e20800f688ad39fc4d5728f0e26d052cc9b8e3..cb98e3d045fe276ae994c3cf3dedda09eaf8fe1f 100644
--- a/plugins/Transitions/javascripts/transitions.js
+++ b/plugins/Transitions/javascripts/transitions.js
@@ -231,10 +231,10 @@ Piwik_Transitions.prototype.preparePopover = function () {
             var totalNbPageviews = self.model.getTotalNbPageviews();
             if (totalNbPageviews > 0) {
 
-                var share = Math.round(self.model.pageviews / totalNbPageviews * 1000) / 10;
+                var share = NumberFormatter.formatPercent(Math.round(self.model.pageviews / totalNbPageviews * 1000) / 10);
 
                 var text = Piwik_Transitions_Translations.ShareOfAllPageviews;
-                text = text.replace(/%s/, self.model.pageviews).replace(/%s/, share + '%');
+                text = text.replace(/%s/, NumberFormatter.formatNumber(self.model.pageviews)).replace(/%s/, share);
                 text += '<br /><em>' + Piwik_Transitions_Translations.DateRange + ' ' + self.model.date + '</em>';
 
                 var title = '<h3>' + piwikHelper.addBreakpointsToUrl(self.actionName) + '</h3>';
@@ -341,12 +341,12 @@ Piwik_Transitions.prototype.renderCenterBox = function () {
     var box = this.centerBox;
 
     Piwik_Transitions_Util.replacePlaceholderInHtml(
-        box.find('.Transitions_Pageviews'), this.model.pageviews);
+        box.find('.Transitions_Pageviews'), NumberFormatter.formatNumber(this.model.pageviews));
 
     var self = this;
     var showMetric = function (cssClass, modelProperty, highlightCurveOnSide, groupCanBeExpanded) {
         var el = box.find('.Transitions_' + cssClass);
-        Piwik_Transitions_Util.replacePlaceholderInHtml(el, self.model[modelProperty]);
+        Piwik_Transitions_Util.replacePlaceholderInHtml(el, NumberFormatter.formatNumber(self.model[modelProperty]));
 
         if (self.model[modelProperty] == 0) {
             el.addClass('Transitions_Value0');
@@ -404,7 +404,7 @@ Piwik_Transitions.prototype.renderLoops = function () {
     }
 
     var loops = this.popover.find('#Transitions_Loops').show();
-    Piwik_Transitions_Util.replacePlaceholderInHtml(loops, this.model.loops);
+    Piwik_Transitions_Util.replacePlaceholderInHtml(loops, NumberFormatter.formatNumber(this.model.loops));
 
     this.addTooltipShowingPercentageOfAllPageviews(loops, 'loops');
 
@@ -562,7 +562,7 @@ Piwik_Transitions.prototype.renderOpenGroup = function (groupName, side, onlyBg)
             boxText: label,
             boxTextTooltip: isOthers || !shortened ? false : fullLabel,
             boxTextNumLines: 3,
-            curveText: data.percentage + '%',
+            curveText: NumberFormatter.formatPercent(data.percentage),
             curveTextTooltip: tooltip,
             onClick: onClick
         });
@@ -1375,8 +1375,9 @@ Piwik_Transitions_Model.prototype.getPercentage = function (metric, formatted) {
     var percentage = (this.pageviews == 0 ? 0 : this[metric] / this.pageviews);
 
     if (formatted) {
+
         percentage = this.roundPercentage(percentage);
-        percentage += '%';
+        return NumberFormatter.formatPercent(percentage);
     }
 
     return percentage;
diff --git a/plugins/UserCountryMap/javascripts/realtime-map.js b/plugins/UserCountryMap/javascripts/realtime-map.js
index 6096ce3786ddb13b1b3a556092dfeba3208ae820..f73259c5e7623323e8a66a9293472e05461451e5 100644
--- a/plugins/UserCountryMap/javascripts/realtime-map.js
+++ b/plugins/UserCountryMap/javascripts/realtime-map.js
@@ -57,11 +57,14 @@
         },
 
         _initStandaloneMap: function () {
-            $('.top_controls').hide();
-            $('.Menu--dashboard').on('piwikSwitchPage', function (event, item) {
-                var clickedMenuIsNotMap = ($(item).attr('href').indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1);
+            $('#periodString').hide();
+            initTopControls();
+            $('#secondNavBar').on('piwikSwitchPage', function (event, item) {
+                var href = $(item).attr('href');
+                var clickedMenuIsNotMap = (href.indexOf('module=UserCountryMap&action=realtimeWorldMap') == -1);
                 if (clickedMenuIsNotMap) {
-                    $('.top_controls').show();
+                    $('#periodString').show();
+                    initTopControls();
                 }
             });
             $('.realTimeMap_overlay').css('top', '0px');
diff --git a/plugins/UserCountryMap/javascripts/visitor-map.js b/plugins/UserCountryMap/javascripts/visitor-map.js
index fb4d5ad25976b41896d9caab7557cc60dac979c5..b3b6d747a1f976a4cde64dca02b1d1ef9f78fee3 100644
--- a/plugins/UserCountryMap/javascripts/visitor-map.js
+++ b/plugins/UserCountryMap/javascripts/visitor-map.js
@@ -156,11 +156,13 @@
 
                 var val = data[metric] % 1 === 0 || Number(data[metric]) != data[metric] ? data[metric] : data[metric].toFixed(1);
                 if (metric == 'bounce_rate') {
-                    val += '%';
+                    val = NumberFormatter.formatPercent(val);
                 } else if (metric == 'avg_time_on_site') {
                     val = new Date(0, 0, 0, val / 3600, val % 3600 / 60, val % 60)
                         .toTimeString()
                         .replace(/.*(\d{2}:\d{2}:\d{2}).*/, "$1");
+                } else {
+                    val = NumberFormatter.formatNumber(val);
                 }
 
                 var v = _[metric].replace('%s', '<strong>' + val + '</strong>');
@@ -266,8 +268,10 @@
             }
 
             function formatPercentage(val) {
-                if (val < 0.001) return '< 0.1%';
-                return Math.round(1000 * val) / 10 + '%';
+                if (val < 0.001) {
+                    return '< ' + NumberFormatter.formatPercent(0.1);
+                }
+                return NumberFormatter.formatPercent(Math.round(1000 * val) / 10);
             }
 
             /*
diff --git a/plugins/UserCountryMap/stylesheets/realtime-map.less b/plugins/UserCountryMap/stylesheets/realtime-map.less
index c6c98ffda5bcf22a2b5027c870367de92e3ce148..b6dbd8a65bf0333b150a3bbb3ff55366c0cf8b9b 100644
--- a/plugins/UserCountryMap/stylesheets/realtime-map.less
+++ b/plugins/UserCountryMap/stylesheets/realtime-map.less
@@ -13,6 +13,10 @@
     filter: alpha(opacity=3);
 }
 
+.RealTimeMap:focus {
+    outline: none;
+}
+
 .RealTimeMap-black {
     position: absolute;
     right: 0;
diff --git a/plugins/UserLanguage/UserLanguage.php b/plugins/UserLanguage/UserLanguage.php
index be892d419659e15164c58633cab9440f12e3910f..7bb409a5e32b5736692eddf5963243d117b070b6 100644
--- a/plugins/UserLanguage/UserLanguage.php
+++ b/plugins/UserLanguage/UserLanguage.php
@@ -22,7 +22,8 @@ class UserLanguage extends \Piwik\Plugin
     public function registerEvents()
     {
         return array(
-            'Live.getAllVisitorDetails'              => 'extendVisitorDetails'
+            'Live.getAllVisitorDetails'              => 'extendVisitorDetails',
+            'Request.getRenamedModuleAndAction' => 'renameUserSettingsModuleAndAction',
         );
     }
 
@@ -44,4 +45,11 @@ class UserLanguage extends \Piwik\Plugin
         $out .= '<h2 piwik-enriched-headline>' . Piwik::translate('UserLanguage_BrowserLanguage') . '</h2>';
         $out .= FrontController::getInstance()->fetchDispatch('UserLanguage', 'getLanguage');
     }
-}
\ No newline at end of file
+
+    public function renameUserSettingsModuleAndAction(&$module, &$action)
+    {
+        if ($module == 'UserSettings' && ($action == 'getLanguage' || $action == 'getLanguageCode')) {
+            $module = 'UserLanguage';
+        }
+    }
+}
diff --git a/plugins/UserLanguage/tests/System/UserSettingsBCTest.php b/plugins/UserLanguage/tests/System/UserSettingsBCTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..208048b8ccf79814a65444d7c04243b4dcca3c73
--- /dev/null
+++ b/plugins/UserLanguage/tests/System/UserSettingsBCTest.php
@@ -0,0 +1,78 @@
+<?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\UserLanguage\tests\System;
+
+use Piwik\Tests\Fixtures\OneVisitorTwoVisits;
+use Piwik\Tests\Framework\TestCase\SystemTestCase;
+
+/**
+ * @group UserLanguage
+ * @group UserLanguage_System
+ */
+class UserSettingsBCTest extends SystemTestCase
+{
+    /**
+     * @var OneVisitorTwoVisits
+     */
+    public static $fixture;
+
+    /**
+     * @dataProvider getApiForTesting
+     */
+    public function test_Api($api, $params)
+    {
+        $this->runApiTests($api, $params);
+    }
+
+    public function getApiForTesting()
+    {
+        $idSite = self::$fixture->idSite;
+        $dateTime = self::$fixture->dateTime;
+
+        $api = array(
+            'UserSettings.getLanguage',
+            'UserSettings.getLanguageCode',
+        );
+
+        $result = array();
+
+        foreach ($api as $method) {
+            list($module, $action) = explode('.', $method);
+
+            // api test (uses hack to test UserSettings which doesn't exist anymore. we say we're testing
+            // against UserLanguage & overwrite the module & action w/ otherRequestParameters)
+            $result[] = array('UserLanguage.getLanguage', array('idSite' => $idSite,
+                'date' => $dateTime,
+                'periods' => array('day'),
+                'testSuffix' => $module . '_' . $method . '_',
+                'otherRequestParameters' => array(
+                    'method' => $method,
+                ),
+            ));
+
+            // api metadata tests
+            $result[] = array('API.getMetadata', array(
+                'idSite' => $idSite,
+                'date' => $dateTime,
+                'apiModule' => $module,
+                'apiAction' => $action,
+                'testSuffix' => $module . '_' . $method . '_',
+            ));
+        }
+
+        return $result;
+    }
+
+    public static function getPathToTestDirectory()
+    {
+        return dirname(__FILE__);
+    }
+}
+
+UserSettingsBCTest::$fixture = new OneVisitorTwoVisits();
\ No newline at end of file
diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9bf598e68fbfd50ff25d5931816a79c10bbf4fa0
--- /dev/null
+++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Settings</category>
+		<name>Language code</name>
+		<module>UserLanguage</module>
+		<action>getLanguageCode</action>
+		<dimension>Language</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserLanguage&amp;apiAction=getLanguageCode&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserLanguage&amp;apiAction=getLanguageCode&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>UserLanguage_getLanguageCode</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de31fc9d359ef1474002fc6334ea4f81862898f6
--- /dev/null
+++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguageCode___UserLanguage.getLanguage_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>French (fr)</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>languageCode==fr</segment>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9e886e4c3fab5943bcb9c7d6a6563aa1457d3691
--- /dev/null
+++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___API.getMetadata_day.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<category>Visitor Settings</category>
+		<name>Browser language</name>
+		<module>UserLanguage</module>
+		<action>getLanguage</action>
+		<dimension>Language</dimension>
+		<metrics>
+			<nb_visits>Visits</nb_visits>
+			<nb_uniq_visitors>Unique visitors</nb_uniq_visitors>
+			<nb_actions>Actions</nb_actions>
+			<nb_users>Users</nb_users>
+		</metrics>
+		<metricsDocumentation>
+			<nb_visits>If a visitor comes to your website for the first time or if he visits a page more than 30 minutes after his last page view, this will be recorded as a new visit.</nb_visits>
+			<nb_uniq_visitors>The number of unduplicated visitors coming to your website. Every user is only counted once, even if he visits the website multiple times a day.</nb_uniq_visitors>
+			<nb_actions>The number of actions performed by your visitors. Actions can be page views, internal site searches, downloads or outlinks.</nb_actions>
+			<nb_users>The number of users logged in your website. It is the number of unique active users that have a User ID set (via the Tracking code function 'setUserId').</nb_users>
+			<nb_actions_per_visit>The average number of actions (page views, site searches, downloads or outlinks) that were performed during the visits.</nb_actions_per_visit>
+			<avg_time_on_site>The average duration of a visit.</avg_time_on_site>
+			<bounce_rate>The percentage of visits that only had a single pageview. This means, that the visitor left the website directly from the entrance page.</bounce_rate>
+			<conversion_rate>The percentage of visits that triggered a goal conversion.</conversion_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<nb_actions_per_visit>Actions per Visit</nb_actions_per_visit>
+			<avg_time_on_site>Avg. Time on Website</avg_time_on_site>
+			<bounce_rate>Bounce Rate</bounce_rate>
+			<conversion_rate>Conversion Rate</conversion_rate>
+		</processedMetrics>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserLanguage&amp;apiAction=getLanguage&amp;period=day&amp;date=2010-03-06</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=UserLanguage&amp;apiAction=getLanguage&amp;period=day&amp;date=2010-02-05,2010-03-06</imageGraphEvolutionUrl>
+		<uniqueId>UserLanguage_getLanguage</uniqueId>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2e95d73c83758e43789f5032db344f0b2cc2d4f6
--- /dev/null
+++ b/plugins/UserLanguage/tests/System/expected/test_UserSettingsBCTestUserSettings_UserSettings.getLanguage___UserLanguage.getLanguage_day.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<result>
+	<row>
+		<label>French</label>
+		<nb_uniq_visitors>1</nb_uniq_visitors>
+		<nb_visits>2</nb_visits>
+		<nb_actions>8</nb_actions>
+		<nb_users>0</nb_users>
+		<max_actions>7</max_actions>
+		<sum_visit_length>1621</sum_visit_length>
+		<bounce_count>1</bounce_count>
+		<nb_visits_converted>2</nb_visits_converted>
+		<segment>languageCode==fr,languageCode=@fr-</segment>
+	</row>
+</result>
\ No newline at end of file
diff --git a/plugins/UsersManager/templates/index.twig b/plugins/UsersManager/templates/index.twig
index 8c48ad2f33f8ae14555cfa0bd10fac8efb48b4ee..e2fb24dc9aca5c9f2cee433cce2ace6bb2f24ca2 100644
--- a/plugins/UsersManager/templates/index.twig
+++ b/plugins/UsersManager/templates/index.twig
@@ -10,8 +10,6 @@
     <section class="sites_selector_container">
         <p>{{ 'UsersManager_MainDescription'|translate }}</p>
 
-        <div class="sites_selector_title">{{ 'SitesManager_Sites'|translate }}:</div>
-
         {% set applyAllSitesText %}
             <strong>{{ 'UsersManager_ApplyToAllWebsites'|translate }}</strong>
         {% endset %}
diff --git a/plugins/UsersManager/templates/userSettings.twig b/plugins/UsersManager/templates/userSettings.twig
index b202407a07358e4241d6c6c525d411f99c56acce..57e04dff8593326a71724dca908fe18247eea570 100644
--- a/plugins/UsersManager/templates/userSettings.twig
+++ b/plugins/UsersManager/templates/userSettings.twig
@@ -64,7 +64,7 @@
              show-all-sites-item="false"
              showselectedsite="true"
              id="defaultReportSiteSelector"
-             style="position: relative"></div>
+             ></div>
     </div>
 
     <div class="form-group">
diff --git a/plugins/VisitsSummary/templates/_sparklines.twig b/plugins/VisitsSummary/templates/_sparklines.twig
index 94682a928c3e1f2a6caa20b91fff42a09d2d711a..b00ba537a1a1199c57bdca299a3b57e3e166b3fc 100644
--- a/plugins/VisitsSummary/templates/_sparklines.twig
+++ b/plugins/VisitsSummary/templates/_sparklines.twig
@@ -5,14 +5,14 @@
 
         <div class="sparkline">
             {{ sparkline(urlSparklineNbVisits)|raw }}
-            {{ 'General_NVisits'|translate("<strong>"~nbVisits~"</strong>")|raw }}{% if displayUniqueVisitors %},
-                {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors~"</strong>")|raw }}{% endif %}
+            {{ 'General_NVisits'|translate("<strong>"~nbVisits|number~"</strong>")|raw }}{% if displayUniqueVisitors %},
+                {{ 'VisitsSummary_NbUniqueVisitors'|translate("<strong>"~nbUniqVisitors|number~"</strong>")|raw }}{% endif %}
         </div>
         {% if nbUsers > 0 %}
             {# Most of users will not have used `setUserId` so this would be confusingly zero #}
             <div class="sparkline">
                 {{ sparkline(urlSparklineNbUsers)|raw }}
-                {{ 'General_NUsers'|translate("<strong>"~nbUsers~"</strong>")|raw }}
+                {{ 'General_NUsers'|translate("<strong>"~nbUsers|number~"</strong>")|raw }}
             </div>
         {% endif %}
         <div class="sparkline">
@@ -22,11 +22,11 @@
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineBounceRate)|raw }}
-            {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate~"</strong>")|raw }}
+            {{ 'VisitsSummary_NbVisitsBounced'|translate("<strong>"~bounceRate|percent~"</strong>")|raw }}
         </div>
         <div class="sparkline">
             {{ sparkline(urlSparklineActionsPerVisit)|raw }}
-            {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit~"</strong>")|raw }}
+            {{ 'VisitsSummary_NbActionsPerVisit'|translate("<strong>"~nbActionsPerVisit|number(1)~"</strong>")|raw }}
         </div>
         {% if showActionsPluginReports|default(false) %}
         <div class="sparkline">
@@ -45,36 +45,36 @@
             {% if showOnlyActions %}
                 <div class="sparkline">
                     {{ sparkline(urlSparklineNbActions)|raw }}
-                    {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions~"</strong>")|raw }}
+                    {{ 'VisitsSummary_NbActionsDescription'|translate("<strong>"~nbActions|number~"</strong>")|raw }}
                 </div>
             {% else %}
                 <div class="sparkline">
                     {{ sparkline(urlSparklineNbPageviews)|raw }}
-                    {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews~"</strong>")|trim|raw }},
-                    {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews~"</strong>")|raw }}
+                    {{ 'VisitsSummary_NbPageviewsDescription'|translate("<strong>"~nbPageviews|number~"</strong>")|trim|raw }},
+                    {{ 'VisitsSummary_NbUniquePageviewsDescription'|translate("<strong>"~nbUniquePageviews|number~"</strong>")|raw }}
                 </div>
                 {% if displaySiteSearch %}
                     <div class="sparkline">
                         {{ sparkline(urlSparklineNbSearches)|raw }}
-                        {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbSearchesDescription'|translate("<strong>"~nbSearches|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbKeywordsDescription'|translate("<strong>"~nbKeywords|number~"</strong>")|raw }}
                     </div>
                 {% endif %}
                 <div class="sparkline">
                         {{ sparkline(urlSparklineNbDownloads)|raw }}
-                        {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbDownloadsDescription'|translate("<strong>"~nbDownloads|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbUniqueDownloadsDescription'|translate("<strong>"~nbUniqueDownloads|number~"</strong>")|raw }}
                 </div>
                 <div class="sparkline">
                         {{ sparkline(urlSparklineNbOutlinks)|raw }}
-                        {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks~"</strong>")|trim|raw }},
-                        {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks~"</strong>")|raw }}
+                        {{ 'VisitsSummary_NbOutlinksDescription'|translate("<strong>"~nbOutlinks|number~"</strong>")|trim|raw }},
+                        {{ 'VisitsSummary_NbUniqueOutlinksDescription'|translate("<strong>"~nbUniqueOutlinks|number~"</strong>")|raw }}
                 </div>
                 {% endif %}
         {% endif %}
         <div class="sparkline">
                 {{ sparkline(urlSparklineMaxActions)|raw }}
-                {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions~"</strong>")|raw }}
+                {{ 'VisitsSummary_MaxNbActions'|translate("<strong>"~maxActions|number~"</strong>")|raw }}
         </div>
 
         {{ postEvent('Template.VisitsSummaryOverviewSparklines') }}
diff --git a/plugins/Widgetize/Menu.php b/plugins/Widgetize/Menu.php
index f796faf57e1bc1b8d264b573849b64b346ef2225..850df3e2daca63e4778fd1b277501269a7a6df13 100644
--- a/plugins/Widgetize/Menu.php
+++ b/plugins/Widgetize/Menu.php
@@ -18,7 +18,6 @@ class Menu extends \Piwik\Plugin\Menu
         $tooltip   = Piwik::translate('Widgetize_TopLinkTooltip');
         $urlParams = $this->urlForAction('index', array('segment' => false));
 
-        $menu->addPlatformItem(null, $urlParams, 50, $tooltip);
         $menu->addPlatformItem('General_Widgets', $urlParams, 5, $tooltip);
     }
 
diff --git a/plugins/Widgetize/templates/index.twig b/plugins/Widgetize/templates/index.twig
index a7987239286fcb8288bd51be8b610f1c11f026b6..8ada9906cf2f2f31fa9f554ad93e6a77176db09e 100644
--- a/plugins/Widgetize/templates/index.twig
+++ b/plugins/Widgetize/templates/index.twig
@@ -2,6 +2,11 @@
 
 {% set title %}{{ 'General_Widgets'|translate }}{% endset %}
 
+{% block topcontrols %}
+    {% include "@CoreHome/_siteSelectHeader.twig" %}
+    {% include "@CoreHome/_periodSelect.twig" %}
+{% endblock %}
+
 {% block content %}
 
 <div>
@@ -29,8 +34,6 @@
 
 <h2 piwik-enriched-headline>{{ title }}</h2>
 
-{% include "@CoreHome/_siteSelectHeader.twig" %}
-
 <div class="widgetize">
     <p>With Piwik, you can export your Web Analytics reports on your blog, website, or intranet dashboard... in one click.
 
@@ -58,10 +61,6 @@
     <h2>Widgetize reports</h2>
     <p>Select a report, and copy paste in your page the embed code below the widget:
 
-    <div class="top_controls">
-        {% include "@CoreHome/_periodSelect.twig" %}
-    </div>
-
     <div id="widgetPreview"></div>
 
     <div id='iframeDivToExport' style='display:none;'></div>
diff --git a/plugins/ZenMode/ZenMode.php b/plugins/ZenMode/ZenMode.php
deleted file mode 100644
index eee60c46032c1bf69cb4384e42616c39a7753792..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/ZenMode.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?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\ZenMode;
-
-/**
- */
-class ZenMode extends \Piwik\Plugin
-{
-    /**
-     * @see Piwik\Plugin::registerEvents
-     */
-    public function registerEvents()
-    {
-        return array(
-            'AssetManager.getJavaScriptFiles' => 'getJsFiles',
-            'AssetManager.getStylesheetFiles' => 'getStylesheetFiles',
-            'Translate.getClientSideTranslationKeys' => 'getClientSideTranslationKeys'
-        );
-    }
-
-    public function getClientSideTranslationKeys(&$translations)
-    {
-        $translations[] = 'SitesManager_Sites';
-        $translations[] = 'General_Reports';
-        $translations[] = 'MultiSites_LoadingWebsites';
-        $translations[] = 'ZenMode_SearchForAnything';
-        $translations[] = 'ZenMode_QuickAccessTitle';
-        $translations[] = 'ZenMode_HowToSearch';
-        $translations[] = 'ZenMode_HowToToggleZenMode';
-        $translations[] = 'ZenMode_Activated';
-    }
-
-    public function getJsFiles(&$jsFiles)
-    {
-        $jsFiles[] = "plugins/ZenMode/javascripts/zen-mode.js";
-        $jsFiles[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.js";
-        $jsFiles[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js";
-        $jsFiles[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js";
-    }
-
-    public function getStylesheetFiles(&$stylesheets)
-    {
-        $stylesheets[] = "plugins/ZenMode/angularjs/quick-access/quick-access.directive.less";
-        $stylesheets[] = "plugins/ZenMode/angularjs/zen-mode/zen-mode.less";
-    }
-}
diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html
deleted file mode 100644
index efc284d9dac4b369fa5fc2336251a0897cd21d89..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<div class="quick-access" title="{{ 'ZenMode_QuickAccessTitle' | translate }}">
-    <input ng-keydown="onKeypress($event)"
-           ng-change="search(search.term)"
-           ng-model="search.term"
-           type="text"
-           placeholder="{{ 'ZenMode_SearchForAnything' | translate }}"/>
-    <ul ng-show="search.term">
-        <li class="quick-access-category"
-            ng-click="search('menuCategory')">Menu</li>
-        <li class="no-result"
-            ng-hide="menuItems | length">---</li>
-        <li class="result"
-            ng-class="{selected: $index == search.index}"
-            ng-click="selectMenuItem(entry.index)"
-            ng-mouseenter="search.index=$index"
-            ng-repeat="entry in menuItems"><a>{{ entry.name | trim }}</a></li>
-
-        <li class="quick-access-category"
-            ng-click="search('reportCategory')">{{ 'General_Reports' | translate }}</li>
-        <li class="no-result"
-            ng-hide="reportEntries | length">---</li>
-        <li class="result"
-            ng-class="{selected: ((menuItems | length) + $index) == search.index}"
-            ng-mouseenter="search.index=((menuItems | length) + $index)"
-            ng-click="selectMenuItem(report.index)"
-            ng-repeat="report in reportEntries"><a>{{ report.name | trim }}</a></li>
-
-        <li class="quick-access-category"
-            ng-click="search('%')">{{ 'SitesManager_Sites' | translate }}</li>
-        <li class="no-result"
-            ng-hide="(sitesModel.sites | length) || sitesModel.isLoading">---</li>
-        <li class="no-result"
-            ng-show="sitesModel.isLoading">{{ 'MultiSites_LoadingWebsites' | translate }}</li>
-        <li class="result"
-            ng-show="!sitesModel.isLoading"
-            ng-mouseenter="search.index=((menuItems | length) + $index + (reportEntries | length))"
-            ng-class="{selected: ((menuItems | length) + $index + (reportEntries | length)) == search.index}"
-            ng-click="selectSite(site.idsite)"
-            ng-repeat="site in sitesModel.sites"><a>{{ site.name | trim }}</a></li>
-    </ul>
-</div>
\ No newline at end of file
diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js
deleted file mode 100644
index c05fb5fbbce5448b770941037d83c225a50a54f6..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.js
+++ /dev/null
@@ -1,140 +0,0 @@
-/*!
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Usage:
- * <div piwik-dialog="showDialog">...</div>
- * Will show dialog once showDialog evaluates to true.
- *
- * Will execute the "executeMyFunction" function in the current scope once the yes button is pressed.
- */
-(function () {
-    angular.module('piwikApp').directive('piwikQuickAccess', QuickAccessDirective);
-
-    QuickAccessDirective.$inject = ['$rootElement', '$timeout', '$filter', 'siteSelectorModel', 'piwik'];
-
-    function QuickAccessDirective ($rootElement, $timeout, $filter, siteSelectorModel, piwik) {
-
-        return {
-            restrict: 'A',
-            replace: true,
-            scope: {},
-            templateUrl: 'plugins/ZenMode/angularjs/quick-access/quick-access.directive.html?cb=' + piwik.cacheBuster,
-            link: function (scope, element, attrs) {
-
-                var menuIndex = -1;
-                var menuItems = [];
-                var reportEntries = [];
-
-                scope.reportEntries = [];
-                scope.menuItems  = [];
-                scope.sitesModel = siteSelectorModel;
-
-                function getMenuItems()
-                {
-                    if (menuItems && menuItems.length) {
-                        return menuItems;
-                    }
-
-                    $rootElement.find('#topRightBar .topBarElem a').each(function (index, element) {
-                        menuItems.push({name: $(element).text(), index: ++menuIndex, category: 'menuCategory'});
-                        $(element).attr('quick_access', menuIndex);
-                    });
-
-                    return menuItems;
-                }
-
-                function getReportEntries()
-                {
-                    if (reportEntries && reportEntries.length) {
-                        return reportEntries;
-                    }
-
-                    $rootElement.find('.Menu-tabList a').each(function (index, element) {
-                        reportEntries.push({name: $(element).text(), category: 'reportCategory', index: ++menuIndex});
-                        $(element).attr('quick_access', menuIndex);
-                    });
-
-                    return reportEntries;
-                }
-
-                function highlightPreviousItem()
-                {
-                    if (0 >= (scope.search.index - 1)) {
-                        scope.search.index = 0;
-                    } else {
-                        scope.search.index--;
-                    }
-                }
-
-                function highlightNextItem()
-                {
-                    var numTotal = element.find('li.result').length;
-
-                    if (numTotal <= (scope.search.index + 1)) {
-                        scope.search.index = numTotal - 1;
-                    } else {
-                        scope.search.index++;
-                    }
-                }
-
-                function executeMenuItem()
-                {
-                    var results = element.find('li.result');
-                    if (results && results.length && results[scope.search.index]) {
-                        var selectedMenuElement = $(results[scope.search.index]);
-                        $timeout(function () {
-                            selectedMenuElement.click();
-                        }, 20);
-                    }
-                }
-
-                scope.onKeypress = function (event) {
-
-                    if (38 == event.which) {
-                        highlightPreviousItem();
-                        event.preventDefault();
-                    } else if (40 == event.which) {
-                        highlightNextItem();
-                        event.preventDefault();
-                    } else if (13 == event.which) {
-                        executeMenuItem();
-                    }
-                };
-
-                scope.search = function (searchTerm) {
-                    this.search.index  = 0;
-
-                    this.menuItems     = $filter('filter')(getMenuItems(), searchTerm);
-                    this.reportEntries = $filter('filter')(getReportEntries(), searchTerm);
-                    this.sitesModel.searchSite(searchTerm);
-                };
-
-                scope.selectSite = function (idsite) {
-                    this.sitesModel.loadSite(idsite);
-                };
-
-                scope.selectMenuItem = function (index) {
-                    var target = $rootElement.find('[quick_access=' + index + ']');
-
-                    if (target && target.length && target[0]) {
-                        var actualTarget = target[0];
-
-                        var href = $(actualTarget).attr('href');
-
-                        if (href && href.length > 10) {
-                            actualTarget.click();
-                        } else {
-                            $(actualTarget).click();
-                        }
-                    }
-                };
-
-            }
-        };
-    }
-})();
\ No newline at end of file
diff --git a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less b/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less
deleted file mode 100644
index 52d29dafa99ca1f31610e2a52f09583da296ba94..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/quick-access/quick-access.directive.less
+++ /dev/null
@@ -1,20 +0,0 @@
-.quick-access {
-  .selected {
-    background-color: #f2f2f2 !important;
-  }
-  .quick-access-category {
-    text-align: left !important;
-    font-size: 14px;
-    padding: 5px;
-    cursor: pointer;
-  }
-  .result {
-    cursor: pointer;
-  }
-  .quick-access-category:hover {
-    background: none !important;
-  }
-  .no-result {
-    padding-left: 27px;
-  }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js b/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js
deleted file mode 100644
index 420020b75fd631f5a7da9c423c1919f99ae564a4..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/zen-mode/zen-mode-disabler.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*!
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Usage:
- * <div piwik-zen-mode-switcher>...</div>
- * Will toggle the zen mode on click on this element.
- */
-(function () {
-    angular.module('piwikApp').directive('piwikReportingMenu', piwikZenModeSwitcher);
-
-    piwikZenModeSwitcher.$inject = ['$rootElement', '$filter'];
-
-    function piwikZenModeSwitcher($rootElement, $filter) {
-
-        return {
-            restrict: 'A',
-            compile: function (element, attrs) {
-
-                element.find('.Menu--dashboard').prepend(
-                    '<span piwik-zen-mode-switcher class="deactivateZenMode">'
-                    + '<img src="plugins/CoreHome/images/navigation_collapse.png" >'
-                    + '</span>');
-
-                return function () {
-                };
-            }
-        };
-
-    }
-})();
\ No newline at end of file
diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js b/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js
deleted file mode 100644
index 36ac43a39a596df73366e6082377bd28d3a7e5e8..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/zen-mode/zen-mode-switcher.directive.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/*!
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-/**
- * Usage:
- * <div piwik-zen-mode-switcher>...</div>
- * Will toggle the zen mode on click on this element.
- */
-(function () {
-    angular.module('piwikApp').directive('piwikZenModeSwitcher', piwikZenModeSwitcher);
-
-    piwikZenModeSwitcher.$inject = ['$rootElement', '$filter'];
-
-    function piwikZenModeSwitcher($rootElement, $filter) {
-
-        function showZenModeIsActivatedNotification() {
-            var howToSearch = $filter('translate')('ZenMode_HowToSearch');
-            var howToToggle = $filter('translate')('ZenMode_HowToToggleZenMode');
-            var activated   = $filter('translate')('ZenMode_Activated');
-
-            var message = '<ul><li>' + howToSearch + '</li><li>' + howToToggle + '</li></ul>';
-
-            var UI = require('piwik/UI');
-            var notification = new UI.Notification();
-            notification.show(message, {
-                title: activated,
-                context: 'info',
-                id: 'ZenMode_EnabledInfo'
-            });
-        }
-
-        return {
-            restrict: 'A',
-            compile: function (element, attrs) {
-
-                element.on('click', function() {
-                    $rootElement.trigger('zen-mode-toggle', {});
-
-                    if ($rootElement.hasClass('zenMode')) {
-                        showZenModeIsActivatedNotification();
-                    }
-                });
-
-                return function () {
-                };
-            }
-        };
-
-    }
-})();
\ No newline at end of file
diff --git a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less b/plugins/ZenMode/angularjs/zen-mode/zen-mode.less
deleted file mode 100644
index d637f202418ba8cffa60bd0d61633edc256ba3f1..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/angularjs/zen-mode/zen-mode.less
+++ /dev/null
@@ -1,93 +0,0 @@
-.deactivateZenMode {
-  float:right;
-  margin-right: 13px;
-  margin-top: 4px;
-  display: none;
-  img {
-    width: 16px;
-    height: 16px;
-  }
-}
-
-.activateZenMode {
-  img {
-    margin-top: -3px;
-    margin-bottom: -3px;
-    width: 16px;
-    height: 16px;
-  }
-}
-
-.Menu--dashboard #Searchmenu {
-  display: none;
-}
-
-.zenMode {
-
-  #header {
-    display: none;
-  }
-
-  .Menu--dashboard {
-    border-bottom: 1px solid @theme-color-background-lowContrast !important;
-
-    #Searchmenu {
-      display: block;
-    }
-  }
-
-  .quick-access {
-    display: inline-block;
-    color: #999;
-    padding: 8px 20px 7px 20px;
-    input {
-      border:0px;
-      border-bottom: 1px solid #CCC;
-      font-size: 11px !important;
-    }
-  }
-
-  .deactivateZenMode {
-    display: block;
-  }
-
-  .activateZenMode {
-    display: none;
-  }
-
-  .nav_sep {
-    display: none;
-  }
-
-  /* MENU LEVEL2 HOVER */
-  .Menu--dashboard > .Menu-tabList > li li {
-    float: none;
-    text-align: left;
-  }
-
-  .Menu--dashboard > .Menu-tabList > li li:hover {
-    background-color: #f2f2f2;
-  }
-
-  .Menu--dashboard > .Menu-tabList > li ul {
-    display: none;
-  }
-
-  .Menu--dashboard > .Menu-tabList > li.sfHover ul,
-  .Menu--dashboard > .Menu-tabList > li:hover ul {
-    display: none;
-    z-index: 150;
-    background-color: @theme-color-background-base;
-    width: auto;
-    border: 1px solid #D9D9D9;
-    padding-top: 0px;
-    border-top: 4px solid #D3291F;
-  }
-
-  #root .sites_selector_in_dashboard {
-    margin-top:0px;
-    margin-right: 0px;
-    display: none;
-  }
-
-}
diff --git a/plugins/ZenMode/javascripts/zen-mode.js b/plugins/ZenMode/javascripts/zen-mode.js
deleted file mode 100644
index e4e163db8b9953391e38349ea61597112993665b..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/javascripts/zen-mode.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/*!
- * Piwik - free/libre analytics platform
- *
- * @link http://piwik.org
- * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
- */
-
-$(document).ready(function () {
-
-    if (!isDashboard()) {
-        return;
-    }
-
-    var addedElement = $('#topRightBar').append(
-          ' | <span class="topBarElem activateZenMode" piwik-zen-mode-switcher>'
-        + '<img src="plugins/CoreHome/images/navigation_expand.png">'
-        + ' </span>'
-    );
-
-    piwikHelper.compileAngularComponents(addedElement);
-
-    angular.element(document).injector().invoke(handleZenMode);
-
-    function handleZenMode ($rootElement, $cookies) {
-
-        var zenMode = !!parseInt($cookies.zenMode, 10);
-
-        $rootElement.on('zen-mode-toggle', toggleZenMode);
-
-        function toggleZenMode()
-        {
-            zenMode = !zenMode;
-
-            updateZenMode();
-        }
-
-        function updateZenMode()
-        {
-            $cookies.zenMode = zenMode ? '1' : '0';
-
-            if (zenMode) {
-                $rootElement.addClass('zenMode');
-                initMenu();
-            } else {
-                $rootElement.removeClass('zenMode');
-                uninitMenu();
-            }
-
-            resetSubmenu();
-        }
-
-        if (zenMode) {
-            updateZenMode();
-        }
-
-        Mousetrap.bind('alt+z', function() {
-            toggleZenMode();
-        });
-
-        Mousetrap.bind('alt+f', function(event) {
-            if (event.preventDefault) {
-                event.preventDefault();
-            } else {
-                event.returnValue = false; // IE
-            }
-
-            $('.quick-access input').focus();
-        });
-    }
-
-    function isDashboard()
-    {
-        return !!$('[piwik-reporting-menu]').length;
-    }
-
-    function initMenu () {
-        var menuNode = $('.Menu--dashboard');
-        menuNode.on('piwikSwitchPage', resetSubmenu);
-        menuNode.on('mouseenter', 'li:has(ul)', overMainLI);
-        menuNode.on('mouseleave', 'li:has(ul)', outMainLI);
-
-        $('#Searchmenu').on('keydown focus', '.quick-access input', showQuickAccessMenu);
-        $('#Searchmenu').on('blur', '.quick-access input', hideQuickAccessMenu);
-    }
-
-    function uninitMenu () {
-        var menuNode = $('.Menu--dashboard');
-        menuNode.off('piwikSwitchPage', resetSubmenu);
-        menuNode.off('mouseenter', 'li:has(ul)', overMainLI);
-        menuNode.off('mouseleave', 'li:has(ul)', outMainLI);
-
-        $('#Searchmenu').off('keydown focus', '.quick-access input', showQuickAccessMenu);
-        $('#Searchmenu').off('blur', '.quick-access input', hideQuickAccessMenu);
-    }
-
-    function overMainLI () {
-        var $this    = $(this);
-        var position = $this.position();
-        var width    = $this.width();
-        var height   = $this.height();
-
-        $this.find('ul').css({
-            left: position.left + 'px',
-            display: 'block',
-            minWidth: width + 'px',
-            position: 'absolute',
-            top: (position.top + height) + 'px',
-            maxHeight: 'none'
-        });
-    }
-
-    function outMainLI () {
-        $(this).find('ul').css({left: '', display: '', minWidth: '', position: '', top: '', maxHeight: ''});
-    }
-
-    function resetSubmenu()
-    {
-        $('.Menu--dashboard').find('li:has(ul)').mouseleave();
-    }
-
-    function showQuickAccessMenu() {
-        resetSubmenu();
-        $('#Searchmenu').mouseenter();
-    }
-
-    function hideQuickAccessMenu() {
-        $('#Searchmenu').mouseleave();
-    }
-});
-
diff --git a/plugins/ZenMode/lang/cs.json b/plugins/ZenMode/lang/cs.json
deleted file mode 100644
index 9ff86d36151f9a5b2edb42294c3e668baf38f0c8..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/cs.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Nebuďte rušeni. Zen režim věci zjednoduší. Je dostupný přes ikonu v pravém horním rohu obrazovky.",
-        "SearchForAnything": "Hledat cokoliv",
-        "QuickAccessTitle": "Hledat hlášení, webové stránky nebo položky menu",
-        "HowToSearch": "Pokud chcete najít hlášení nebo položky menu, použijte vyhledávací pole v pravé horní části, nebo stiskněte 'alt+f'.",
-        "HowToToggleZenMode": "Pokud chcete přepnout zen režim, použijte šipku v pravé horní oblasti, nebo stiskněte 'alt+z'.",
-        "Activated": "Zen režim aktivován"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/da.json b/plugins/ZenMode/lang/da.json
deleted file mode 100644
index 8275461eaf0e73e22e111d363929fedc383fe961..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/da.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Søg efter alt",
-        "QuickAccessTitle": "Søg efter menupunkter, rapporter og hjemmesider",
-        "HowToSearch": "For at søge efter menupunkter, rapporter eller hjemmesider bruge søgefeltet øverst til højre, eller tryk på 'alt+f'.",
-        "HowToToggleZenMode": "Forlad eller kom i Zen-tilstand ved at klikke på pilen øverst til højre, eller tryk på 'alt+z'.",
-        "Activated": "Zen-tilstand aktiveret"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/de.json b/plugins/ZenMode/lang/de.json
deleted file mode 100644
index 24ffa53ade495303b38e090680c14aa5f233f0d2..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/de.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Bleiben Sie \"Zen\" mit Piwik. Der \"Zen-Modus\" hält die Dinge einfach. Er ist verfügbar über das Icon am rechten, oberen Ende des Bildschirms.",
-        "SearchForAnything": "Nach etwas suchen",
-        "QuickAccessTitle": "Nach Menüeinträgen, Berichten oder Websites suchen",
-        "HowToSearch": "Um nach Menüeinträgen, Berichten oder Websites zu suchen, das Suchfeld oben benutzen oder Alt+f drücken.",
-        "HowToToggleZenMode": "Auf den oberen rechten Pfeil klicken um den Zen Modus zu verlassen oder Alt+t drücken.",
-        "Activated": "Zen Modus aktiviert"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/el.json b/plugins/ZenMode/lang/el.json
deleted file mode 100644
index 5a29f9805a33e6958a0195632bcc7b2f5f8ca6d4..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/el.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Μείνετε στο Zen με το Piwik. Η κατάσταση Zen τηρεί τα πράματα σε απλή κατάσταση. Είναι διαθέσιμη ως εικονίδιο πάνω δεξιά στην οθόνη.",
-        "SearchForAnything": "Αναζήτηση για όλα",
-        "QuickAccessTitle": "Αναζήτηση για καταχωρήσεις μενού, αναφορές και ιστοτόπους",
-        "HowToSearch": "Για να αναζητήσετε σε καταχωρήσεις μενού, αναφορές ή ιστοτόπους χρησιμοποιείστε το πλαίσιο αναζήτηση πάνω δεξιά ή πατήστε 'Alt+F'.",
-        "HowToToggleZenMode": "Για να βγείτε ή μεταβείτε σε κατάσταση Zen, πατήστε στο βέλος πάνω δεξιά ή πατήστε 'Alt+Z'.",
-        "Activated": "Η κατάσταση Zen ενεργοποιήθηκε"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/en.json b/plugins/ZenMode/lang/en.json
deleted file mode 100755
index 4a3aa78ee8a5960d40660dcd2d9529f18bd2e5af..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/en.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Stay Zen with Piwik. Zen mode keeps things simple. It is available via the icon in the top right of the screen.",
-        "SearchForAnything": "Search for anything",
-        "QuickAccessTitle": "Search for menu entries, reports and websites",
-        "HowToSearch": "To search for menu items, reports or websites use the search box on the top right or press 'alt+f'.",
-        "HowToToggleZenMode": "To leave or enter the zen mode click the arrow on the top right or press 'alt+z'.",
-        "Activated": "Zen mode activated"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/es.json b/plugins/ZenMode/lang/es.json
deleted file mode 100644
index 27fcf38a62a1408e8ac639a54c90b095e1ff5821..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/es.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Permanecer Zen con Piwik. El modo Zen mantiene las cosas simples. Está disponible vía el icono en el extremo superior derecho de la pantalla.",
-        "SearchForAnything": "Buscar lo que quiera",
-        "QuickAccessTitle": "Buscar entradas de menú, reportes y sitios de internet",
-        "HowToSearch": "Para buscar entradas de menú, reportes o sitios de internet utilice la caja de búsqueda en la parte superior derecha o presione 'alt+f'.",
-        "HowToToggleZenMode": "Para salir o ingresar al modo Zen haga clic en la flecha en la parte superior derecha o presione 'alt+z'.",
-        "Activated": "Modo Zen activado"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/fa.json b/plugins/ZenMode/lang/fa.json
deleted file mode 100644
index d221d07b5604ea6eaa497e8a89d18d176b423296..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/fa.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "جستجوی همه"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/fr.json b/plugins/ZenMode/lang/fr.json
deleted file mode 100644
index bd8c99350c8508ce60e4817042d33c9034d10ace..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/fr.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Restez zen avec Piwik. Le mode zen conserve les choses simples. Il est disponible via l'icône en haut à droite de l'écran.",
-        "SearchForAnything": "Rechercher tout",
-        "QuickAccessTitle": "Rechercher des éléments du menu, rapports et sites web",
-        "HowToSearch": "Pour rechercher des éléments du menu, rapports ou sites web utilisez la barre de recherche en haut à droite ou pressez 'alt+f'.",
-        "HowToToggleZenMode": "Pour quitter ou entrer en mode zen cliquez sur la flèche dans le coin supérieur droit ou pressez 'alt+z'.",
-        "Activated": "Mode zen activé"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/hi.json b/plugins/ZenMode/lang/hi.json
deleted file mode 100644
index 44ac4ac168fc8a20b151d8d162941efb0610b4cc..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/hi.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Piwik साथ जेन रहें। ज़ेन मोड सरल बातें करती रहती है। यह स्क्रीन के ऊपर सही में आइकन के माध्यम से उपलब्ध है।",
-        "SearchForAnything": "कुछ के लिए खोज",
-        "QuickAccessTitle": "मेनू प्रविष्टियों, रिपोर्टों और वेबसाइटों के लिए खोज",
-        "Activated": "ज़ेन मोड सक्रिय"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/it.json b/plugins/ZenMode/lang/it.json
deleted file mode 100644
index cb5bcb529565f0ae269c83577fde2beb344254b5..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/it.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Sii Zen con Piwik. La modalità Zen rende le cose facili. È disponibile tramite l'icona che si trova nell'angolo in alto a destra dello schermo.",
-        "SearchForAnything": "Cerca tutto",
-        "QuickAccessTitle": "Ricerca elementi di menù, report e siti web",
-        "HowToSearch": "Per ricercare elementi di menù, report o siti web utilizza la casella di ricerca in alto a destra o premi 'alt+f'.",
-        "HowToToggleZenMode": "Per lasciare la modalità Zen o entrarvi, clicca sulla freccia in alto a destra o premi 'alt+z'.",
-        "Activated": "Modalità Zen attivata"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/ja.json b/plugins/ZenMode/lang/ja.json
deleted file mode 100644
index 3bc49cdb1e19a3fd3e14848b0ea9483e4504ce3e..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/ja.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "なんでも検索",
-        "QuickAccessTitle": "メニューエントリー、レポート、ウェブサイトを検索",
-        "HowToSearch": "メニュー項目やレポート、ウェブサイトをお探しの場合、右上の検索ボックスをご利用になるか、キーボードの 'alt+f' を押してください。",
-        "HowToToggleZenMode": "禅モードを切り替えるには、右上の矢印をクリックするか、キーボードの 'alt+z' を押してください。",
-        "Activated": "禅モードを有効化"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/nb.json b/plugins/ZenMode/lang/nb.json
deleted file mode 100644
index 0b5c865c5ebd0376f5124156bc61a82dc5b1a338..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/nb.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Søk etter noe",
-        "Activated": "Zen-modus aktivert"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/nl.json b/plugins/ZenMode/lang/nl.json
deleted file mode 100644
index 930411c0edd3eb90feb151c67fd61d25427f27d9..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/nl.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Blijf zen met Piwik. Zen mode houdt de dingen eenvoudig. Het is beschikbaar via het icoon in de rechterbovenhoek van het scherm.",
-        "SearchForAnything": "Zoeken op alles",
-        "QuickAccessTitle": "Zoeken op menu-items, rapporten en websites",
-        "HowToSearch": "Om te zoeken op menu-items, rapporten of websites gebruik het zoekvak rechtsboven of druk op 'alt+f'.",
-        "HowToToggleZenMode": "Om de zen-modus te betreden of verlaten klik op pijl rechtsboven of druk 'alt+z'.",
-        "Activated": "Zen-modus geactiveerd"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/pl.json b/plugins/ZenMode/lang/pl.json
deleted file mode 100644
index d638e2b0046f77fecd3ee2e49aeece2c027fce2c..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/pl.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Szukaj czegokolwiek",
-        "QuickAccessTitle": "Szukaj wpisów w menu, raportów i stron.",
-        "HowToToggleZenMode": "Aby wyjść albo wejść do trybu Zen należy kliknąć strzałkę w górnym prawym rogu albo wcisnąć 'alt+z'.",
-        "Activated": "Tryb Zen został aktywowany"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/pt-br.json b/plugins/ZenMode/lang/pt-br.json
deleted file mode 100644
index 640da2c93bfca8d77ed736eb450f6fbcbc938b97..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/pt-br.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Fique Zen com Piwik. O modo Zen mantém as coisas simples. Está disponível através do ícone no canto superior direito da tela.",
-        "SearchForAnything": "Buscar por qualquer coisa",
-        "QuickAccessTitle": "Pesquisar por entradas do menu, relatórios e websites",
-        "HowToSearch": "Para procurar itens do menu, relatórios ou sites utilize a caixa de pesquisa no canto superior direito ou pressione 'alt+f'.",
-        "HowToToggleZenMode": "Para sair ou entrar no modo zen clique na seta no canto superior direito ou pressione 'alt+z'.",
-        "Activated": "Modo Zen ativado"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/ro.json b/plugins/ZenMode/lang/ro.json
deleted file mode 100644
index 495fd70b9e7f85a629626c248cefcd87972d3fe0..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/ro.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Caută orice",
-        "QuickAccessTitle": "Caută elemente de meniu, rapoarte şi site-uri",
-        "HowToSearch": "Pentru a căuta elemente de meniu, rapoarte sau site-uri, foloseşte cutia de căutare din dreapta sus sau apasă 'alt+f'.",
-        "HowToToggleZenMode": "Pentru a intra sau a părăsi modul zen, dă click pe săgeata din dreapta sus sau apasă 'alt+z'.",
-        "Activated": "Modul Zen a fost activat"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/ru.json b/plugins/ZenMode/lang/ru.json
deleted file mode 100644
index 68799e808ccdd3d234e9240eca3e255f95923b5d..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/ru.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Поиск везде",
-        "QuickAccessTitle": "Поиск по пунктам меню, отчетам и сайтам",
-        "HowToSearch": "Для поиска элементов меню, отчетов и веб-сайтов используйте окно поиска в правом верхнем углу или нажмите \"alt+f\"",
-        "HowToToggleZenMode": "Чтобы выйти или войти в Дзен режим нажмите на стрелку в правом верхнем углу или нажмите \"alt+z\".",
-        "Activated": "Активирован Дзен режим"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/sr.json b/plugins/ZenMode/lang/sr.json
deleted file mode 100644
index 4f73c1cf1ab9fd730b5701cf718290414216c566..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/sr.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-    "ZenMode": {
-        "PluginDescription": "Budite u Zenu sa Pivikom. Zen mod čini stvari jednostavnim. Možete ga omogućiti preko sličice u gornjem desnom uglu ekrana.",
-        "SearchForAnything": "Pretraži sve",
-        "QuickAccessTitle": "Pretraživanje stavki menija, izveštaja i sajtova",
-        "HowToSearch": "Ukoliko želite da pretražujete stavke menija, izveštaje ili sajtove, upotrebite polje za pretraživanje u gornjem desnom uglu ili pritisnite Alt + f.",
-        "HowToToggleZenMode": "Ukoliko želite da napustite ili ponovo aktivirate zen mod, kliknite na strelicu u gornjem desnom uglu ili pritisnite Alt + z.",
-        "Activated": "Zen mod aktiviran"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/sv.json b/plugins/ZenMode/lang/sv.json
deleted file mode 100644
index d42ff6428e8d5f67117248ff8d2ada808eb169e9..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/sv.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Sök efter vad som helst",
-        "QuickAccessTitle": "Sök efter meny-poster, rapporter och webbplatser",
-        "HowToSearch": "För att söka efter meny-poster, rapporter eller webbplatser - använd sökfältet uppe till höger eller tryck 'alt+f'.",
-        "HowToToggleZenMode": "För att gå i\/ur zen mode, klicka på pilen uppe till höger eller tryck 'alt+z'.",
-        "Activated": "Zen mode aktiverat"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/ta.json b/plugins/ZenMode/lang/ta.json
deleted file mode 100644
index c9c6a76d75ae885b23e61d4b3909751400ae1393..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/ta.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "எதைபற்றியும் தேடு",
-        "Activated": "ஜென் நிலை செயற்பாட்டில் உள்ளது"
-    }
-}
\ No newline at end of file
diff --git a/plugins/ZenMode/lang/tl.json b/plugins/ZenMode/lang/tl.json
deleted file mode 100644
index 7f738608d18851765db0cc8c755715912ace91c4..0000000000000000000000000000000000000000
--- a/plugins/ZenMode/lang/tl.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-    "ZenMode": {
-        "SearchForAnything": "Paghahanap sa kahit ano",
-        "QuickAccessTitle": "Maghanap ng mga entry ng menu mga ulat at mga website.",
-        "HowToSearch": "Para maghanap ng items sa menu ulat o websites gamitin ang search box sa kanang tuktok o pindutin ang 'alt+f'.",
-        "HowToToggleZenMode": "Upang umalis o ipasok ang Zen mode i-click ang arrow sa kanang tuktok o pindutin ang 'alt + z'.",
-        "Activated": "Ang Zen mode ay na activate"
-    }
-}
\ No newline at end of file
diff --git a/tests/PHPUnit/Fixtures/UITestFixture.php b/tests/PHPUnit/Fixtures/UITestFixture.php
index 34c63a22e97003371ed91e31322b386a229708a0..93ae92a6dd39e6af2e5b0f284a82c4e6b36013c1 100644
--- a/tests/PHPUnit/Fixtures/UITestFixture.php
+++ b/tests/PHPUnit/Fixtures/UITestFixture.php
@@ -23,6 +23,7 @@ use Piwik\Plugins\UserCountry\LocationProvider;
 use Piwik\Plugins\UsersManager\API as UsersManagerAPI;
 use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
 use Piwik\Tests\Framework\Fixture;
+use Piwik\Plugins\VisitsSummary\API as VisitsSummaryAPI;
 
 /**
  * Fixture for UI tests.
@@ -65,6 +66,9 @@ class UITestFixture extends SqlDump
         // create non super user
         UsersManagerAPI::getInstance()->addUser('oliverqueen', 'smartypants', 'oli@queenindustries.com');
         UsersManagerAPI::getInstance()->setUserAccess('oliverqueen', 'view', array(1));
+
+        // launch archiving so UI test requests don't launch it
+        VisitsSummaryAPI::getInstance()->get('all', 'year', '2012-08-09');
     }
 
     public function performSetUp($setupEnvironmentOnly = false)
diff --git a/tests/PHPUnit/Integration/CronArchiveTest.php b/tests/PHPUnit/Integration/CronArchiveTest.php
index f0e4b7c19c55a7278d966bebe275e193d9f1d438..c64f0c3e625d270c144300dfaa808ec10c41a903 100644
--- a/tests/PHPUnit/Integration/CronArchiveTest.php
+++ b/tests/PHPUnit/Integration/CronArchiveTest.php
@@ -10,6 +10,7 @@ namespace Piwik\Tests\Integration;
 
 use Piwik\Archiver\Request;
 use Piwik\CliMulti;
+use Piwik\Container\StaticContainer;
 use Piwik\CronArchive;
 use Piwik\Archive\ArchiveInvalidator;
 use Piwik\Date;
@@ -31,7 +32,7 @@ class CronArchiveTest extends IntegrationTestCase
         Fixture::createWebsite('2014-12-12 00:01:02');
         Fixture::createWebsite('2014-12-12 00:01:02');
 
-        $ar = new ArchiveInvalidator();
+        $ar = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
         $ar->rememberToInvalidateArchivedReportsLater(1, Date::factory('2014-04-05'));
         $ar->rememberToInvalidateArchivedReportsLater(2, Date::factory('2014-04-05'));
         $ar->rememberToInvalidateArchivedReportsLater(2, Date::factory('2014-04-06'));
diff --git a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
index 6c1ff8cd8839da35b3e8d1974fd842adb9c6da1c..7501a34715cd84276bbb2023d6d5919173905e96 100644
--- a/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
+++ b/tests/PHPUnit/Integration/DataAccess/ArchiveInvalidatorTest.php
@@ -8,10 +8,20 @@
 
 namespace Piwik\Tests\Integration\DataAccess;
 
+use Piwik\ArchiveProcessor\Rules;
+use Piwik\CronArchive\SitesToReprocessDistributedList;
+use Piwik\DataAccess\ArchiveTableCreator;
+use Piwik\DataAccess\ArchiveWriter;
+use Piwik\DataAccess\Model;
 use Piwik\Date;
+use Piwik\Db;
 use Piwik\Option;
+use Piwik\Piwik;
+use Piwik\Plugins\CoreAdminHome\Tasks\ArchivesToPurgeDistributedList;
+use Piwik\Plugins\PrivacyManager\PrivacyManager;
 use Piwik\Tests\Framework\TestCase\IntegrationTestCase;
 use Piwik\Archive\ArchiveInvalidator;
+use Piwik\Segment;
 
 /**
  * @group Archiver
@@ -20,16 +30,38 @@ use Piwik\Archive\ArchiveInvalidator;
  */
 class ArchiveInvalidatorTest extends IntegrationTestCase
 {
+    const TEST_SEGMENT_1 = 'browserCode==FF';
+    const TEST_SEGMENT_2 = 'countryCode==uk';
+
     /**
      * @var ArchiveInvalidator
      */
     private $invalidator;
 
+    /**
+     * @var Segment
+     */
+    private static $segment1;
+
+    /**
+     * @var Segment
+     */
+    private static $segment2;
+
+    public static function setUpBeforeClass()
+    {
+        parent::setUpBeforeClass();
+
+        // these are static because it takes a long time to create new Segment instances (for some reason)
+        self::$segment1 = new Segment(self::TEST_SEGMENT_1, array());
+        self::$segment2 = new Segment(self::TEST_SEGMENT_2, array());
+    }
+
     public function setUp()
     {
         parent::setUp();
 
-        $this->invalidator = new ArchiveInvalidator();
+        $this->invalidator = new ArchiveInvalidator(new Model());
     }
 
     public function test_rememberToInvalidateArchivedReportsLater_shouldCreateAnEntryInCaseThereIsNoneYet()
@@ -141,7 +173,7 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
             Date::factory('2010-10-10'),
         );
 
-        $this->invalidator->markArchivesAsInvalidated($idSites, $dates, false);
+        $this->invalidator->markArchivesAsInvalidated($idSites, $dates, 'week');
         $reports = $this->invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
 
         $expected = array(
@@ -183,4 +215,452 @@ class ArchiveInvalidatorTest extends IntegrationTestCase
         $this->rememberReport(7, '2014-05-08');
         $this->rememberReport(7, '2014-04-08');
     }
+
+    public function test_markArchivesAsInvalidated_DoesNotInvalidateDatesBeforePurgeThreshold()
+    {
+        PrivacyManager::savePurgeDataSettings(array(
+            'delete_logs_enable' => 1,
+            'delete_logs_older_than' => 180,
+        ));
+
+        $dateBeforeThreshold = Date::factory('today')->subDay(190);
+        $thresholdDate = Date::factory('today')->subDay(180);
+        $dateAfterThreshold = Date::factory('today')->subDay(170);
+
+        // can't test more than day since today will change, causing the test to fail w/ other periods randomly
+        $this->insertArchiveRow(1, $dateBeforeThreshold, 'day');
+        $this->insertArchiveRow(1, $dateAfterThreshold, 'day');
+
+        /** @var ArchiveInvalidator $archiveInvalidator */
+        $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator');
+        $result = $archiveInvalidator->markArchivesAsInvalidated(array(1), array($dateBeforeThreshold, $dateAfterThreshold), 'day');
+
+        $this->assertEquals($thresholdDate->toString(), $result->minimumDateWithLogs);
+
+        $expectedProcessedDates = array($dateAfterThreshold->toString());
+        $this->assertEquals($expectedProcessedDates, $result->processedDates);
+
+        $expectedWarningDates = array($dateBeforeThreshold->toString());
+        $this->assertEquals($expectedWarningDates, $result->warningDates);
+
+        $invalidatedArchives = $this->getInvalidatedIdArchives();
+
+        $countInvalidatedArchives = 0;
+        foreach ($invalidatedArchives as $idarchives) {
+            $countInvalidatedArchives += count($idarchives);
+        }
+
+        $this->assertEquals(1, $countInvalidatedArchives);
+    }
+
+    public function test_markArchivesAsInvalidated_CorrectlyModifiesDistributedLists()
+    {
+        /** @var ArchiveInvalidator $archiveInvalidator */
+        $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator');
+
+        $idSites = array(1, 3, 5);
+        $dates = array(
+            Date::factory('2014-12-31'),
+            Date::factory('2015-01-01'),
+            Date::factory('2015-01-10'),
+        );
+        $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, 'day');
+
+        $idSites = array(1, 3, 5);
+        $dates = array(
+            Date::factory('2014-12-21'),
+            Date::factory('2015-01-01'),
+            Date::factory('2015-03-08'),
+        );
+        $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, 'week');
+
+        $expectedSitesToProcessListContents = array(1, 3, 5);
+        $this->assertEquals($expectedSitesToProcessListContents, $this->getSitesToReprocessListContents());
+
+        $expectedArchivesToPurgeListContents = array('2014_12', '2014_01', '2015_01', '2015_03');
+        $this->assertEquals($expectedArchivesToPurgeListContents, $this->getArchivesToPurgeListContents());
+    }
+
+    /**
+     * @dataProvider getTestDataForMarkArchivesAsInvalidated
+     */
+    public function test_markArchivesAsInvalidated_MarksCorrectArchivesAsInvalidated($idSites, $dates, $period, $segment, $cascadeDown,
+                                                                                     $expectedIdArchives)
+    {
+        $dates = array_map(array('Piwik\Date', 'factory'), $dates);
+
+        $this->insertArchiveRowsForTest();
+
+        if (!empty($segment)) {
+            $segment = new Segment($segment, $idSites);
+        }
+
+        /** @var ArchiveInvalidator $archiveInvalidator */
+        $archiveInvalidator = self::$fixture->piwikEnvironment->getContainer()->get('Piwik\Archive\ArchiveInvalidator');
+        $result = $archiveInvalidator->markArchivesAsInvalidated($idSites, $dates, $period, $segment, $cascadeDown);
+
+        $this->assertEquals($dates, $result->processedDates);
+
+        $idArchives = $this->getInvalidatedArchives();
+        $this->assertEquals($expectedIdArchives, $idArchives);
+    }
+
+    public function getTestDataForMarkArchivesAsInvalidated()
+    {
+        return array(
+            // day period, multiple sites, multiple dates across tables, cascade = true
+            array(
+                array(1, 2),
+                array('2015-01-01', '2015-02-05', '2015-04-30'),
+                'day',
+                null,
+                true,
+                array(
+                    '2014_01' => array(),
+                    '2015_03' => array(),
+                    '2015_04' => array(
+                        '1.2015-04-30.2015-04-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '2.2015-04-30.2015-04-30.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-04-27.2015-05-03.2.done',
+                        '2.2015-04-27.2015-05-03.2.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-04-01.2015-04-30.3.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '2.2015-04-01.2015-04-30.3.done5447835b0a861475918e79e932abdfd8',
+                    ),
+                    '2014_12' => array(),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '2.2015-01-01.2015-01-01.1.done.VisitsSummary',
+                        '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                        '2.2015-01-01.2015-01-31.3.done.VisitsSummary',
+                        '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8',
+                        '2.2015-01-01.2015-12-31.4.done',
+                        '1.2015-01-01.2015-01-10.5.done.VisitsSummary',
+                    ),
+                    '2015_02' => array(
+                        '1.2015-02-05.2015-02-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '2.2015-02-05.2015-02-05.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-02-02.2015-02-08.2.done',
+                        '2.2015-02-02.2015-02-08.2.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-02-01.2015-02-28.3.done.VisitsSummary',
+                        '2.2015-02-01.2015-02-28.3.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                    ),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // month period, one site, one date, cascade = false
+            array(
+                array(1),
+                array('2015-01-01'),
+                'month',
+                null,
+                false,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8',
+                    ),
+                    '2015_02' => array(),
+                    '2015_03' => array(),
+                    '2015_04' => array(),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // month period, one site, one date, cascade = true
+            array(
+                array(1),
+                array('2015-01-15'),
+                'month',
+                null,
+                true,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(
+                        '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341',
+
+                        // doesn't need to be invalidated since the month won't use the week above, but very difficult
+                        // to keep it valid, while keeping invalidation logic simple.
+                        '1.2014-12-01.2014-12-31.3.done5447835b0a861475918e79e932abdfd8',
+                    ),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-02.2015-01-02.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-03.2015-01-03.1.done.VisitsSummary',
+                        '1.2015-01-04.2015-01-04.1.done',
+                        '1.2015-01-05.2015-01-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-06.2015-01-06.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-07.2015-01-07.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-08.2015-01-08.1.done.VisitsSummary',
+                        '1.2015-01-09.2015-01-09.1.done',
+                        '1.2015-01-10.2015-01-10.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-11.2015-01-11.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-12.2015-01-12.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-13.2015-01-13.1.done.VisitsSummary',
+                        '1.2015-01-14.2015-01-14.1.done',
+                        '1.2015-01-15.2015-01-15.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-16.2015-01-16.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-17.2015-01-17.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-18.2015-01-18.1.done.VisitsSummary',
+                        '1.2015-01-19.2015-01-19.1.done',
+                        '1.2015-01-20.2015-01-20.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-21.2015-01-21.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-22.2015-01-22.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-23.2015-01-23.1.done.VisitsSummary',
+                        '1.2015-01-24.2015-01-24.1.done',
+                        '1.2015-01-25.2015-01-25.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-27.2015-01-27.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-28.2015-01-28.1.done.VisitsSummary',
+                        '1.2015-01-29.2015-01-29.1.done',
+                        '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-05.2015-01-11.2.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-12.2015-01-18.2.done.VisitsSummary',
+                        '1.2015-01-19.2015-01-25.2.done',
+                        '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-01.2015-01-10.5.done.VisitsSummary',
+                    ),
+                    '2015_02' => array(),
+                    '2015_03' => array(),
+                    '2015_04' => array(),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // week period, one site, multiple dates w/ redundant dates & periods, cascade = true
+            array(
+                array(1),
+                array('2015-01-02', '2015-01-03', '2015-01-31'),
+                'week',
+                null,
+                true,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(
+                        '1.2014-12-29.2014-12-29.1.done',
+                        '1.2014-12-30.2014-12-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2014-12-31.2014-12-31.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2014-12-01.2014-12-31.3.done5447835b0a861475918e79e932abdfd8',
+                        '1.2014-12-05.2015-01-01.5.done.VisitsSummary',
+                    ),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-02.2015-01-02.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-03.2015-01-03.1.done.VisitsSummary',
+                        '1.2015-01-04.2015-01-04.1.done',
+                        '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-27.2015-01-27.1.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-28.2015-01-28.1.done.VisitsSummary',
+                        '1.2015-01-29.2015-01-29.1.done',
+                        '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-01-01.2015-01-10.5.done.VisitsSummary',
+                    ),
+                    '2015_02' => array(
+                        '1.2015-02-01.2015-02-01.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-02-01.2015-02-28.3.done.VisitsSummary',
+                    ),
+                    '2015_03' => array(),
+                    '2015_04' => array(),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // range period, one site, cascade = true
+            array(
+                array(1),
+                array('2015-01-02', '2015-03-05'),
+                'range',
+                null,
+                true,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-10.5.done.VisitsSummary',
+                    ),
+                    '2015_02' => array(),
+                    '2015_03' => array(
+                        '1.2015-03-04.2015-03-05.5.done.VisitsSummary',
+                        '1.2015-03-05.2015-03-10.5.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                    ),
+                    '2015_04' => array(),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // week period, one site, cascade = true, segment
+            array(
+                array(1),
+                array('2015-01-05'),
+                'month',
+                self::TEST_SEGMENT_1,
+                true,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(
+                        '1.2014-12-29.2015-01-04.2.done3736b708e4d20cfc10610e816a1b2341',
+                    ),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-01-01.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-05.2015-01-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-06.2015-01-06.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-10.2015-01-10.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-11.2015-01-11.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-15.2015-01-15.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-16.2015-01-16.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-20.2015-01-20.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-21.2015-01-21.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-25.2015-01-25.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-26.2015-01-26.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-30.2015-01-30.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-31.2015-01-31.1.done3736b708e4d20cfc10610e816a1b2341',
+                        '1.2015-01-26.2015-02-01.2.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-01-01.2015-01-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                    ),
+                    '2015_02' => array(),
+                    '2015_03' => array(),
+                    '2015_04' => array(),
+                    '2015_05' => array(),
+                    '2015_06' => array(),
+                ),
+            ),
+
+            // removing all periods
+            array(
+                array(1),
+                array('2015-05-05'),
+                '',
+                null,
+                false,
+                array(
+                    '2014_01' => array(),
+                    '2014_12' => array(),
+                    '2015_01' => array(
+                        '1.2015-01-01.2015-12-31.4.done5447835b0a861475918e79e932abdfd8',
+                    ),
+                    '2015_02' => array(),
+                    '2015_03' => array(),
+                    '2015_04' => array(),
+                    '2015_05' => array(
+                        '1.2015-05-05.2015-05-05.1.done3736b708e4d20cfc10610e816a1b2341.UserCountry',
+                        '1.2015-05-04.2015-05-10.2.done5447835b0a861475918e79e932abdfd8',
+                        '1.2015-05-01.2015-05-31.3.done3736b708e4d20cfc10610e816a1b2341',
+                    ),
+                    '2015_06' => array(),
+                ),
+            ),
+        );
+    }
+
+    private function getInvalidatedIdArchives()
+    {
+        $result = array();
+        foreach (ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE) as $table) {
+            $date = ArchiveTableCreator::getDateFromTableName($table);
+
+            $idArchives = Db::fetchAll("SELECT idarchive FROM $table WHERE name LIKE 'done%' AND value = ?", array(ArchiveWriter::DONE_INVALIDATED));
+            $idArchives = array_map('reset', $idArchives);
+
+            $result[$date] = $idArchives;
+        }
+        return $result;
+    }
+
+    private function getInvalidatedArchives()
+    {
+        $result = array();
+        foreach (ArchiveTableCreator::getTablesArchivesInstalled(ArchiveTableCreator::NUMERIC_TABLE) as $table) {
+            $date = ArchiveTableCreator::getDateFromTableName($table);
+
+            $sql = "SELECT CONCAT(idsite, '.', date1, '.', date2, '.', period, '.', name) FROM $table WHERE name LIKE 'done%' AND value = ?";
+
+            $archiveSpecs = Db::fetchAll($sql, array(ArchiveWriter::DONE_INVALIDATED));
+            $archiveSpecs = array_map('reset', $archiveSpecs);
+
+            $result[$date] = $archiveSpecs;
+        }
+        return $result;
+    }
+
+    private function insertArchiveRowsForTest()
+    {
+        $periods = array('day', 'week', 'month', 'year');
+        $sites = array(1,2,3);
+
+        $startDate = Date::factory('2014-12-01');
+        $endDate = Date::factory('2015-05-31');
+
+        foreach ($periods as $periodLabel) {
+            $nextEndDate = $endDate->addPeriod(1, $periodLabel);
+            for ($date = $startDate; $date->isEarlier($nextEndDate); $date = $date->addPeriod(1, $periodLabel)) {
+                foreach ($sites as $idSite) {
+                    $this->insertArchiveRow($idSite, $date->toString(), $periodLabel);
+                }
+            }
+        }
+
+        $rangePeriods = array('2015-03-04,2015-03-05', '2014-12-05,2015-01-01', '2015-03-05,2015-03-10', '2015-01-01,2015-01-10');
+        foreach ($rangePeriods as $dateRange) {
+            $this->insertArchiveRow($idSite = 1, $dateRange, 'range');
+        }
+    }
+
+    private function insertArchiveRow($idSite, $date, $periodLabel)
+    {
+        $periodObject = \Piwik\Period\Factory::build($periodLabel, $date);
+        $dateStart = $periodObject->getDateStart();
+        $dateEnd = $periodObject->getDateEnd();
+
+        $table = ArchiveTableCreator::getNumericTable($dateStart);
+
+        $idArchive = (int) Db::fetchOne("SELECT MAX(idarchive) FROM $table WHERE name LIKE 'done%'");
+        $idArchive = $idArchive + 1;
+
+        $periodId = Piwik::$idPeriods[$periodLabel];
+
+        $doneFlag = 'done';
+        if ($idArchive % 5 == 1) {
+            $doneFlag = Rules::getDoneFlagArchiveContainsAllPlugins(self::$segment1);
+        } else if ($idArchive % 5 == 2) {
+            $doneFlag .= '.VisitsSummary';
+        } else if ($idArchive % 5 == 3) {
+            $doneFlag = Rules::getDoneFlagArchiveContainsOnePlugin(self::$segment1, 'UserCountry');
+        } else if ($idArchive % 5 == 4) {
+            $doneFlag = Rules::getDoneFlagArchiveContainsAllPlugins(self::$segment2);
+        }
+
+        $sql = "INSERT INTO $table (idarchive, name, idsite, date1, date2, period, ts_archived)
+                     VALUES ($idArchive, 'nb_visits', $idSite, '$dateStart', '$dateEnd', $periodId, NOW()),
+                            ($idArchive, '$doneFlag', $idSite, '$dateStart', '$dateEnd', $periodId, NOW())";
+        Db::query($sql);
+    }
+
+    private function getSitesToReprocessListContents()
+    {
+        $list = new SitesToReprocessDistributedList();
+        $values = $list->getAll();
+        return array_values($values);
+    }
+
+    private function getArchivesToPurgeListContents()
+    {
+        $list = new ArchivesToPurgeDistributedList();
+        $values = $list->getAll();
+        return array_values($values);
+    }
 }
diff --git a/tests/PHPUnit/Integration/DbTest.php b/tests/PHPUnit/Integration/DbTest.php
index 486028fc21783feeeb80837f63b743433d127122..c21a2770618cd3e52dd03615542a9418dc279395 100644
--- a/tests/PHPUnit/Integration/DbTest.php
+++ b/tests/PHPUnit/Integration/DbTest.php
@@ -52,7 +52,7 @@ class DbTest extends IntegrationTestCase
         $this->assertInstanceOf($expectedClass, $db);
         $result = $db->fetchOne('SELECT @@SESSION.sql_mode');
 
-        $expected = 'NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';
+        $expected = 'NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';
         $this->assertSame($expected, $result);
     }
 
diff --git a/tests/PHPUnit/Integration/NumberFormatterTest.php b/tests/PHPUnit/Integration/NumberFormatterTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..981b289f2b29495dfc9ca54a1c8db586f3333f08
--- /dev/null
+++ b/tests/PHPUnit/Integration/NumberFormatterTest.php
@@ -0,0 +1,123 @@
+<?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\Tests\Integration;
+
+use Piwik\Container\StaticContainer;
+use Piwik\NumberFormatter;
+use Piwik\Translate;
+
+/**
+ * @group Core
+ * @group NumberFormatter
+ */
+class NumberFormatterTest extends \PHPUnit_Framework_TestCase
+{
+    public function setUp()
+    {
+        Translate::loadAllTranslations();
+    }
+
+    public function tearDown()
+    {
+        StaticContainer::get('Piwik\NumberFormatter')->unsetInstance();
+        Translate::reset();
+    }
+
+    /**
+     * @dataProvider getNumberFormattingTestData
+     */
+    public function testNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected)
+    {
+        StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language);
+        $formatter = NumberFormatter::getInstance();
+        $this->assertEquals($expected, $formatter->formatNumber($value, $maximumFractionDigits, $minimumFractionDigits));
+    }
+
+    public function getNumberFormattingTestData()
+    {
+        return array(
+            // english formats
+            array('en', 5, 0, 0, '5'),
+            array('en', -5, 0, 3, '-5'),
+            array('en', 5.299, 0, 0, '5'),
+            array('en', 5.299, 3, 0, '5.299'),
+            array('en', -50, 3, 3, '-50.000'),
+            array('en', 5000, 0, 0, '5,000'),
+            array('en', 5000000, 0, 0, '5,000,000'),
+            array('en', -5000000, 0, 0, '-5,000,000'),
+
+            // foreign languages
+            array('ar', 51239.56, 3, 0, '51Ù¬239Ù«56'),
+            array('be', 51239.56, 3, 0, '51 239,56'),
+            array('de', 51239.56, 3, 0, '51.239,56'),
+            array('bn', 152551239.56, 3, 0, '15,25,51,239.56'),
+            array('hi', 152551239.56, 0, 0, '15,25,51,240'),
+            array('lt', -152551239.56, 0, 0, '−152 551 240'),
+        );
+    }
+
+    /**
+     * @dataProvider getPercentNumberFormattingTestData
+     */
+    public function testPercentNumberFormatting($language, $value, $maximumFractionDigits, $minimumFractionDigits, $expected)
+    {
+        StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language);
+        $formatter = NumberFormatter::getInstance();
+        $this->assertEquals($expected, $formatter->formatPercent($value, $maximumFractionDigits, $minimumFractionDigits));
+    }
+
+    public function getPercentNumberFormattingTestData()
+    {
+        return array(
+            // english formats
+            array('en', 5, 0, 0, '5%'),
+            array('en', -5, 0, 3, '-5%'),
+            array('en', 5.299, 0, 0, '5%'),
+            array('en', 5.299, 3, 0, '5.299%'),
+            array('en', -50, 3, 3, '-50%'),
+            array('en', 5000, 0, 0, '5,000%'),
+            array('en', +5000, 0, 0, '5,000%'),
+            array('en', 5000000, 0, 0, '5,000,000%'),
+            array('en', -5000000, 0, 0, '-5,000,000%'),
+
+            // foreign languages
+            array('ar', 51239.56, 3, 0, '51Ù¬239Ù«56Ùª'),
+            array('be', 51239.56, 3, 0, '51 239,56 %'),
+            array('de', 51239.56, 3, 0, '51.239,56 %'),
+            array('bn', 152551239.56, 3, 0, '15,25,51,239.56%'),
+            array('hi', 152551239.56, 0, 0, '15,25,51,240%'),
+            array('lt', -152551239.56, 0, 0, '−152 551 240 %'),
+        );
+    }
+
+    /**
+     * @dataProvider getPercentNumberEvolutionFormattingTestData
+     */
+    public function testPercentEvolutionNumberFormatting($language, $value, $expected)
+    {
+        StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage($language);
+        $formatter = NumberFormatter::getInstance();
+        $this->assertEquals($expected, $formatter->formatPercentEvolution($value));
+    }
+
+    public function getPercentNumberEvolutionFormattingTestData()
+    {
+        return array(
+            // english formats
+            array('en', 5, '+5%'),
+            array('en', -5, '-5%'),
+            array('en', 5.299, '+5%'),
+            array('en', -50, '-50%'),
+            array('en', 5000, '+5,000%'),
+            array('en', +5000, '+5,000%'),
+            array('en', 5000000, '+5,000,000%'),
+            array('en', -5000000, '-5,000,000%'),
+        );
+    }
+}
diff --git a/tests/PHPUnit/Integration/SegmentTest.php b/tests/PHPUnit/Integration/SegmentTest.php
index 3c4bec7802dbd4fba629b994384bc50c04775792..9179c6d61a9b1e2770b4700283e5b1af8e498e94 100644
--- a/tests/PHPUnit/Integration/SegmentTest.php
+++ b/tests/PHPUnit/Integration/SegmentTest.php
@@ -12,6 +12,7 @@ use Exception;
 use Piwik\Cache;
 use Piwik\Common;
 use Piwik\Config;
+use Piwik\Container\StaticContainer;
 use Piwik\Db;
 use Piwik\Segment;
 use Piwik\Tests\Framework\Mock\FakeAccess;
@@ -25,6 +26,8 @@ use Piwik\Tracker\TableLogAction;
  */
 class SegmentTest extends IntegrationTestCase
 {
+    public $tableLogActionCacheHits = 0;
+
     public function setUp()
     {
         parent::setUp();
@@ -33,13 +36,6 @@ class SegmentTest extends IntegrationTestCase
         FakeAccess::$superUser = true;
     }
 
-    public function tearDown()
-    {
-        parent::tearDown();
-
-        TableLogAction\Cache::$hits = 0;
-    }
-
     static public function removeExtraWhiteSpaces($valueToFilter)
     {
         if (is_array($valueToFilter)) {
@@ -698,7 +694,7 @@ class SegmentTest extends IntegrationTestCase
                 "found",
             ));
 
-        $cache = new TableLogAction\Cache();
+        $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache');
         $this->assertTrue( empty($cache->isEnabled) );
         $this->assertCacheWasHit($hit = 0);
         $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -768,7 +764,7 @@ class SegmentTest extends IntegrationTestCase
                 3, // pageUrl!@not-found
             ));
 
-        $cache = new TableLogAction\Cache();
+        $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache');
         $this->assertTrue( !empty($cache->isEnabled) );
 
         $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -836,7 +832,7 @@ class SegmentTest extends IntegrationTestCase
                 "not-found", // pageUrl!@not-found
             ));
 
-        $cache = new TableLogAction\Cache();
+        $cache = StaticContainer::get('Piwik\Tracker\TableLogAction\Cache');
         $this->assertTrue( !empty($cache->isEnabled) );
 
         $this->assertEquals($this->removeExtraWhiteSpaces($expected), $this->removeExtraWhiteSpaces($query));
@@ -856,13 +852,6 @@ class SegmentTest extends IntegrationTestCase
         $this->assertCacheWasHit($hits = 2);
     }
 
-    public function provideContainerConfig()
-    {
-        return array(
-            'Piwik\Access' => new FakeAccess()
-        );
-    }
-
     /**
      * @param $pageUrlFoundInDb
      * @return string
@@ -896,7 +885,9 @@ class SegmentTest extends IntegrationTestCase
 
     private function assertCacheWasHit($expectedHits)
     {
-        $this->assertTrue(TableLogAction\Cache::$hits == $expectedHits, "expected cache was hit $expectedHits time(s), but got " . TableLogAction\Cache::$hits . " cache hits instead.");
+        $hits = $this->tableLogActionCacheHits;
+        $this->assertEquals($expectedHits, $hits,
+            "expected cache was hit $expectedHits time(s), but got $hits cache hits instead.");
     }
 
     private function disableSubqueryCache()
@@ -908,4 +899,43 @@ class SegmentTest extends IntegrationTestCase
     {
         Config::getInstance()->General['enable_segments_subquery_cache'] = 1;
     }
+
+    public function provideContainerConfig()
+    {
+        $self = $this;
+
+        $cacheProxy = $this->getMock('Piwik\Cache\Lazy', array('fetch', 'contains', 'save', 'delete', 'flushAll'),
+            array(), '', $callOriginalConstructor = false);
+        $cacheProxy->expects($this->any())->method('fetch')->willReturnCallback(function ($id) {
+            $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+            return $realCache->fetch($id);
+        });
+        $cacheProxy->expects($this->any())->method('contains')->willReturnCallback(function ($id) use ($self) {
+            $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+
+            $result = $realCache->contains($id);
+            if ($result) {
+                ++$self->tableLogActionCacheHits;
+            }
+
+            return $result;
+        });
+        $cacheProxy->expects($this->any())->method('save')->willReturnCallback(function ($id, $data, $lifetime = 0) {
+            $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+            return $realCache->save($id, $data, $lifetime);
+        });
+        $cacheProxy->expects($this->any())->method('delete')->willReturnCallback(function ($id) {
+            $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+            return $realCache->delete($id);
+        });
+        $cacheProxy->expects($this->any())->method('flushAll')->willReturnCallback(function () {
+            $realCache = StaticContainer::get('Piwik\Cache\Lazy');
+            return $realCache->flushAll();
+        });
+
+        return array(
+            'Piwik\Access' => new FakeAccess(),
+            'Piwik\Tracker\TableLogAction\Cache' => \DI\object()->constructorParameter('cache', $cacheProxy),
+        );
+    }
 }
diff --git a/tests/PHPUnit/Integration/Tracker/VisitTest.php b/tests/PHPUnit/Integration/Tracker/VisitTest.php
index e870fa6c51c01532d3b4200dea3ec87b0761ec4d..e686146f73c49961185c5ec99648f390957aa566 100644
--- a/tests/PHPUnit/Integration/Tracker/VisitTest.php
+++ b/tests/PHPUnit/Integration/Tracker/VisitTest.php
@@ -9,7 +9,7 @@
 namespace Piwik\Tests\Integration\Tracker;
 
 use Piwik\Cache;
-use Piwik\Archive\ArchiveInvalidator;
+use Piwik\Container\StaticContainer;
 use Piwik\Date;
 use Piwik\Network\IPUtils;
 use Piwik\Plugin\Manager;
@@ -411,7 +411,7 @@ class VisitTest extends IntegrationTestCase
 
         $visit->handle();
 
-        $archive = new ArchiveInvalidator();
+        $archive = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
         $remembered = $archive->getRememberedArchivedReportsThatShouldBeInvalidated();
 
         $this->assertSame($expectedRemeberedArchivedReports, $remembered);
diff --git a/tests/PHPUnit/System/ArchiveInvalidationTest.php b/tests/PHPUnit/System/ArchiveInvalidationTest.php
index b64aa82479498e0e75143047d706e4e05537bb61..7e41cd6eae3d773396bd90f4c7aae9b26f44b4d5 100644
--- a/tests/PHPUnit/System/ArchiveInvalidationTest.php
+++ b/tests/PHPUnit/System/ArchiveInvalidationTest.php
@@ -52,9 +52,9 @@ class ArchiveInvalidationTest extends SystemTestCase
         return array(
 
             array($apiToCall, array('idSite'                 => self::$fixture->idSite2,
-                                    'testSuffix'             => 'Website' . self::$fixture->idSite2 . "_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated",
+                                    'testSuffix'             => 'Website' . self::$fixture->idSite2 . "_NewDataShouldNotAppear_BecauseDayWasNotInvalidated",
                                     'date'                   => self::$fixture->dateTimeFirstDateWebsite2,
-                                    'periods'                => 'week',
+                                    'periods'                => 'day',
                                     'segment'                => 'pageUrl=@category/',
                                     'setDateLastN'           => 4, // 4months ahead
                                     'otherRequestParameters' => array('expanded' => 1))
@@ -99,8 +99,8 @@ class ArchiveInvalidationTest extends SystemTestCase
     public function testAnotherApi($api, $params)
     {
         if ($params['periods'] === 'month') {
-            // we do now need to invalidate weeks as well since months are based on weeks
-            $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2);
+            // we do now need to invalidate days as well since weeks are based on weeks
+            $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2, true);
         }
 
         $this->setBrowserArchivingTriggering(1);
@@ -135,16 +135,15 @@ class ArchiveInvalidationTest extends SystemTestCase
         $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&idSites=" . self::$fixture->idSite1 . "&dates=" . $dateToInvalidate1->format('Y-m-d'));
         $this->assertApiResponseHasNoError($r->process());
 
-        // Days & Months reports only are invalidated and we test our weekly report will still show old data.
-        $this->invalidateTestArchive(self::$fixture->idSite2, 'day', self::$fixture->dateTimeFirstDateWebsite2);
-        $this->invalidateTestArchive(self::$fixture->idSite2, 'month', self::$fixture->dateTimeFirstDateWebsite2);
+        // week reports only are invalidated and we test our daily report will still show old data.
+        $this->invalidateTestArchive(self::$fixture->idSite2, 'week', self::$fixture->dateTimeFirstDateWebsite2);
     }
 
-    private function invalidateTestArchive($idSite, $period, $dateTime)
+    private function invalidateTestArchive($idSite, $period, $dateTime, $cascadeDown = false)
     {
         $dates = new \DateTime($dateTime);
         $dates = $dates->format('Y-m-d');
-        $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&period=$period&idSites=$idSite&dates=$dates");
+        $r = new Request("module=API&method=CoreAdminHome.invalidateArchivedReports&period=$period&idSites=$idSite&dates=$dates&cascadeDown=" . (int)$cascadeDown);
         $this->assertApiResponseHasNoError($r->process());
     }
 }
diff --git a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
index 12cb4b15f875c6dd2fa50f8f4cebc8df1deb2d8c..cf22ba95cbf54d17796237c97783b9330fbdccae 100755
--- a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
+++ b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
@@ -9,9 +9,7 @@ namespace Piwik\Tests\System;
 
 use Piwik\Archive;
 use Piwik\Cache;
-use Piwik\Archive\ArchiveInvalidator;
-use Piwik\Option;
-use Piwik\Plugins\Goals\Archiver;
+use Piwik\Container\StaticContainer;
 use Piwik\Segment;
 use Piwik\Tests\Framework\TestCase\SystemTestCase;
 use Piwik\Tests\Fixtures\TwoSitesTwoVisitorsDifferentDays;
@@ -166,7 +164,7 @@ class TwoVisitorsTwoWebsitesDifferentDaysConversionsTest extends SystemTestCase
         $this->assertEquals(array(self::$fixture->idSite1, self::$fixture->idSite2),
                             $cache->fetch('Archive.SiteIdsOfRememberedReportsInvalidated'));
 
-        $invalidator = new ArchiveInvalidator();
+        $invalidator = StaticContainer::get('Piwik\Archive\ArchiveInvalidator');
 
         self::$fixture->trackVisits();
 
diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml
deleted file mode 100644
index bcd758b7c59def8c1b05e3f1b2cdaf8e32888f26..0000000000000000000000000000000000000000
--- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<results>
-	<result date="From 2010-01-04 to 2010-01-10">
-		<row>
-			<label>category</label>
-			<nb_visits>6</nb_visits>
-			<nb_hits>9</nb_hits>
-			<sum_time_spent>0</sum_time_spent>
-			<entry_nb_visits>2</entry_nb_visits>
-			<entry_nb_actions>18</entry_nb_actions>
-			<entry_sum_visit_length>2</entry_sum_visit_length>
-			<entry_bounce_count>0</entry_bounce_count>
-			<avg_time_on_page>0</avg_time_on_page>
-			<bounce_rate>0%</bounce_rate>
-			<exit_rate>0%</exit_rate>
-			<subtable>
-				<row>
-					<label>/Page1</label>
-					<nb_visits>2</nb_visits>
-					<nb_hits>3</nb_hits>
-					<sum_time_spent>0</sum_time_spent>
-					<entry_nb_visits>2</entry_nb_visits>
-					<entry_nb_actions>18</entry_nb_actions>
-					<entry_sum_visit_length>2</entry_sum_visit_length>
-					<entry_bounce_count>0</entry_bounce_count>
-					<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
-					<sum_daily_entry_nb_uniq_visitors>2</sum_daily_entry_nb_uniq_visitors>
-					<avg_time_on_page>0</avg_time_on_page>
-					<bounce_rate>0%</bounce_rate>
-					<exit_rate>0%</exit_rate>
-					<url>http://example.org/category/Page1</url>
-				</row>
-				<row>
-					<label>/Page2</label>
-					<nb_visits>2</nb_visits>
-					<nb_hits>3</nb_hits>
-					<sum_time_spent>0</sum_time_spent>
-					<sum_daily_nb_uniq_visitors>2</sum_daily_nb_uniq_visitors>
-					<avg_time_on_page>0</avg_time_on_page>
-					<bounce_rate>0%</bounce_rate>
-					<exit_rate>0%</exit_rate>
-					<url>http://example.org/category/Page2</url>
-				</row>
-				<row>
-					<label>/NewPage</label>
-					<nb_visits>1</nb_visits>
-					<nb_hits>2</nb_hits>
-					<sum_time_spent>0</sum_time_spent>
-					<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
-					<avg_time_on_page>0</avg_time_on_page>
-					<bounce_rate>0%</bounce_rate>
-					<exit_rate>0%</exit_rate>
-					<url>http://example.org/category/NewPage</url>
-				</row>
-				<row>
-					<label>/Page3</label>
-					<nb_visits>1</nb_visits>
-					<nb_hits>1</nb_hits>
-					<sum_time_spent>0</sum_time_spent>
-					<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
-					<avg_time_on_page>0</avg_time_on_page>
-					<bounce_rate>0%</bounce_rate>
-					<exit_rate>0%</exit_rate>
-					<url>http://example.org/category/Page3</url>
-				</row>
-			</subtable>
-		</row>
-	</result>
-	<result date="From 2010-01-11 to 2010-01-17" />
-	<result date="From 2010-01-18 to 2010-01-24" />
-	<result date="From 2010-01-25 to 2010-01-31" />
-	<result date="From 2010-02-01 to 2010-02-07" />
-</results>
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml
deleted file mode 100644
index c494788d70b5d79c3e6d71382ce1237abe7c371d..0000000000000000000000000000000000000000
--- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<results>
-	<result date="From 2010-01-04 to 2010-01-10">
-		<nb_uniq_visitors>2</nb_uniq_visitors>
-		<nb_users>1</nb_users>
-		<nb_visits>2</nb_visits>
-		<nb_actions>18</nb_actions>
-		<nb_visits_converted>0</nb_visits_converted>
-		<bounce_count>0</bounce_count>
-		<sum_visit_length>2</sum_visit_length>
-		<max_actions>12</max_actions>
-		<bounce_rate>0%</bounce_rate>
-		<nb_actions_per_visit>9</nb_actions_per_visit>
-		<avg_time_on_site>1</avg_time_on_site>
-	</result>
-	<result date="From 2010-01-11 to 2010-01-17" />
-	<result date="From 2010-01-18 to 2010-01-24" />
-	<result date="From 2010-01-25 to 2010-01-31" />
-	<result date="From 2010-02-01 to 2010-02-07" />
-</results>
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml
similarity index 76%
rename from tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml
rename to tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml
index 3f580dfcf7a32545bfdb064b3078e73726dad24c..dea43adf43064b612956850ba5caf34755d4396c 100644
--- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__Actions.getPageUrls_week.xml
+++ b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__Actions.getPageUrls_day.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <results>
-	<result date="From 2010-01-04 to 2010-01-10">
+	<result date="2010-01-06">
 		<row>
 			<label>category</label>
 			<nb_visits>3</nb_visits>
@@ -17,14 +17,14 @@
 				<row>
 					<label>/Page1</label>
 					<nb_visits>1</nb_visits>
+					<nb_uniq_visitors>1</nb_uniq_visitors>
 					<nb_hits>1</nb_hits>
 					<sum_time_spent>0</sum_time_spent>
+					<entry_nb_uniq_visitors>1</entry_nb_uniq_visitors>
 					<entry_nb_visits>1</entry_nb_visits>
 					<entry_nb_actions>6</entry_nb_actions>
 					<entry_sum_visit_length>1</entry_sum_visit_length>
 					<entry_bounce_count>0</entry_bounce_count>
-					<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
-					<sum_daily_entry_nb_uniq_visitors>1</sum_daily_entry_nb_uniq_visitors>
 					<avg_time_on_page>0</avg_time_on_page>
 					<bounce_rate>0%</bounce_rate>
 					<exit_rate>0%</exit_rate>
@@ -33,9 +33,9 @@
 				<row>
 					<label>/Page2</label>
 					<nb_visits>1</nb_visits>
+					<nb_uniq_visitors>1</nb_uniq_visitors>
 					<nb_hits>1</nb_hits>
 					<sum_time_spent>0</sum_time_spent>
-					<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
 					<avg_time_on_page>0</avg_time_on_page>
 					<bounce_rate>0%</bounce_rate>
 					<exit_rate>0%</exit_rate>
@@ -44,9 +44,9 @@
 				<row>
 					<label>/Page3</label>
 					<nb_visits>1</nb_visits>
+					<nb_uniq_visitors>1</nb_uniq_visitors>
 					<nb_hits>1</nb_hits>
 					<sum_time_spent>0</sum_time_spent>
-					<sum_daily_nb_uniq_visitors>1</sum_daily_nb_uniq_visitors>
 					<avg_time_on_page>0</avg_time_on_page>
 					<bounce_rate>0%</bounce_rate>
 					<exit_rate>0%</exit_rate>
@@ -55,8 +55,8 @@
 			</subtable>
 		</row>
 	</result>
-	<result date="From 2010-01-11 to 2010-01-17" />
-	<result date="From 2010-01-18 to 2010-01-24" />
-	<result date="From 2010-01-25 to 2010-01-31" />
-	<result date="From 2010-02-01 to 2010-02-07" />
+	<result date="2010-01-07" />
+	<result date="2010-01-08" />
+	<result date="2010-01-09" />
+	<result date="2010-01-10" />
 </results>
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml
similarity index 65%
rename from tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml
rename to tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml
index 75d267cfc4226333800fe2485fd44ae66dc0d107..241f0a7a02a797112990e673746f6921b16dbf4e 100644
--- a/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseWeekWasNotInvalidated__VisitsSummary.get_week.xml
+++ b/tests/PHPUnit/System/expected/test_Archive_InvalidationWebsite2_NewDataShouldNotAppear_BecauseDayWasNotInvalidated__VisitsSummary.get_day.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <results>
-	<result date="From 2010-01-04 to 2010-01-10">
+	<result date="2010-01-06">
 		<nb_uniq_visitors>1</nb_uniq_visitors>
 		<nb_users>0</nb_users>
 		<nb_visits>1</nb_visits>
@@ -13,8 +13,8 @@
 		<nb_actions_per_visit>6</nb_actions_per_visit>
 		<avg_time_on_site>1</avg_time_on_site>
 	</result>
-	<result date="From 2010-01-11 to 2010-01-17" />
-	<result date="From 2010-01-18 to 2010-01-24" />
-	<result date="From 2010-01-25 to 2010-01-31" />
-	<result date="From 2010-02-01 to 2010-02-07" />
+	<result date="2010-01-07" />
+	<result date="2010-01-08" />
+	<result date="2010-01-09" />
+	<result date="2010-01-10" />
 </results>
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml
index 953afdb0c94f1b2bc1d90dbe6946247130126416..d13ec927453e10accf2a59cdf3625eb352881f85 100644
--- a/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml
+++ b/tests/PHPUnit/System/expected/test_OneVisitorTwoVisits__subtable__API.getProcessedReport_week.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <result>
 	<website>new name</website>
-	<prettyDate>Week March 1 – 7, 2010</prettyDate>
+	<prettyDate>week March 1 – 7, 2010</prettyDate>
 	<metadata>
 		<category>Actions</category>
 		<subcategory>Pages</subcategory>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml
index 2bb327912b663bb819f6ab968f77f8c16772a554..097ddcd4c474702400426b95550c7d54d889125e 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getGlossaryMetrics.xml
@@ -80,6 +80,21 @@
 		<id>exit_nb_visits</id>
 		<documentation>Number of visits that ended on this page.</documentation>
 	</row>
+	<row>
+		<name>Impressions</name>
+		<id>nb_impressions</id>
+		<documentation>The number of times a content block, such as a banner or an ad, was displayed on a page.</documentation>
+	</row>
+	<row>
+		<name>Interaction Rate</name>
+		<id>interaction_rate</id>
+		<documentation>The ratio of content impressions to interactions.</documentation>
+	</row>
+	<row>
+		<name>Interactions</name>
+		<id>nb_interactions</id>
+		<documentation>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</documentation>
+	</row>
 	<row>
 		<name>Maximum value</name>
 		<id>max_event_value</id>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
index 700c9c5d342ffae3e10cf105b57866ad0fd2692f..58c2b694cd6c56a707772f9bb301f358154cdd1e 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata__API.getReportMetadata_day.xml
@@ -1296,6 +1296,53 @@
 	<row>
 		<category>Actions</category>
 		<subcategory>Events</subcategory>
+		<name>Content Name</name>
+		<module>Contents</module>
+		<action>getContentNames</action>
+		<dimension>Content Name</dimension>
+		<metrics>
+			<nb_impressions>Impressions</nb_impressions>
+			<nb_interactions>Interactions</nb_interactions>
+		</metrics>
+		<metricsDocumentation>
+			<nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions>
+			<nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions>
+			<interaction_rate>The ratio of content impressions to interactions.</interaction_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<interaction_rate>Interaction Rate</interaction_rate>
+		</processedMetrics>
+		<actionToLoadSubTables>getContentNames</actionToLoadSubTables>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Contents&amp;apiAction=getContentNames&amp;period=day&amp;date=2009-01-04</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Contents&amp;apiAction=getContentNames&amp;period=day&amp;date=2008-12-06,2009-01-04</imageGraphEvolutionUrl>
+		<uniqueId>Contents_getContentNames</uniqueId>
+	</row>
+	<row>
+		<category>Actions</category>
+		<name>Content Piece</name>
+		<module>Contents</module>
+		<action>getContentPieces</action>
+		<dimension>Content Piece</dimension>
+		<metrics>
+			<nb_impressions>Impressions</nb_impressions>
+			<nb_interactions>Interactions</nb_interactions>
+		</metrics>
+		<metricsDocumentation>
+			<nb_impressions>The number of times a content block, such as a banner or an ad, was displayed on a page.</nb_impressions>
+			<nb_interactions>The number of times a content block was interacted with (eg, a 'click' on a banner or ad).</nb_interactions>
+			<interaction_rate>The ratio of content impressions to interactions.</interaction_rate>
+		</metricsDocumentation>
+		<processedMetrics>
+			<interaction_rate>Interaction Rate</interaction_rate>
+		</processedMetrics>
+		<actionToLoadSubTables>getContentPieces</actionToLoadSubTables>
+		<imageGraphUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Contents&amp;apiAction=getContentPieces&amp;period=day&amp;date=2009-01-04</imageGraphUrl>
+		<imageGraphEvolutionUrl>index.php?module=API&amp;method=ImageGraph.get&amp;idSite=1&amp;apiModule=Contents&amp;apiAction=getContentPieces&amp;period=day&amp;date=2008-12-06,2009-01-04</imageGraphEvolutionUrl>
+		<uniqueId>Contents_getContentPieces</uniqueId>
+	</row>
+	<row>
+		<category>Events</category>
+>>>>>>> master
 		<name>Event Categories</name>
 		<module>Events</module>
 		<action>getCategory</action>
diff --git a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml
index e3321058352e2f8a9332847e96f951841fbbdebe..d0c3b6b1314b1f942e4eb6c2c102fe688af73308 100644
--- a/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml
+++ b/tests/PHPUnit/System/expected/test_apiGetReportMetadata_year__LanguagesManager.getAvailableLanguageNames.xml
@@ -122,7 +122,7 @@
 	</row>
 	<row>
 		<code>id</code>
-		<name>Bahasa Indonesia</name>
+		<name>Indonesia</name>
 		<english_name>Indonesian</english_name>
 	</row>
 	<row>
diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
index f30d629c3dca824cd15cce6676aa50a1d9c708d1..b81c8a37d0cc87bd202b9ecfa7289286e6729110 100644
--- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
+++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_in_html_tables_only__ScheduledReports.generateReport_week.original.html
@@ -12,7 +12,7 @@
 </h1>
 
 <p>
-    Mail Test report - Date range: Week April 4 – 10, 2011
+    Mail Test report - Date range: week April 4 – 10, 2011
 </p>
 
 
diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt
index d93abaaa9943e9721a87d7dd886ad7d8353d3aec..645d7467c3b2f27999d1d957d89b282ceca06978 100644
--- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt
+++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_all_sites__ScheduledReports.generateReport_week.original.sms.txt
@@ -1 +1 @@
-Week April 4 – 10, 2011. Piwik test: 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%). Piwik test: 2 Visits (+100%), 1 Actions (+100%), Revenue: $ 250 (+100%), 1 Goal conversions (+100%)
\ No newline at end of file
+week April 4 – 10, 2011. Piwik test: 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%). Piwik test: 2 Visits (+100%), 1 Actions (+100%), Revenue: $ 250 (+100%), 1 Goal conversions (+100%)
\ No newline at end of file
diff --git a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt
index 3632f5fb811c3911aaf8eea565d32d730c4d1efd..f36a23fa6ec943da8dec69ccbada744140356165 100644
--- a/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt
+++ b/tests/PHPUnit/System/expected/test_ecommerceOrderWithItems_scheduled_report_via_sms_one_site__ScheduledReports.generateReport_week.original.sms.txt
@@ -1 +1 @@
-Week April 4 – 10, 2011. 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%)
\ No newline at end of file
+week April 4 – 10, 2011. 5 Visits (+100%), 16 Actions (+100%), Revenue: $ 13361 (+100%), 5 Goal conversions (+100%), Product Revenue: $ 13351 (+100%), 4 Ecommerce Orders (+100%)
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/AssetManagerTest.php b/tests/PHPUnit/Unit/AssetManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9fef76473362184b2ccd8aca957dab18815a11da
--- /dev/null
+++ b/tests/PHPUnit/Unit/AssetManagerTest.php
@@ -0,0 +1,48 @@
+<?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\Tests\Unit;
+
+use Piwik\Cache;
+use Piwik\AssetManager;
+use Piwik\Config;
+
+/**
+ * @group AssetManager
+ */
+class AssetManagerTest extends \PHPUnit_Framework_TestCase
+{
+
+    public function testIsMergedAssetsDisabled()
+    {
+        $manager = new AssetManager();
+        
+        // default
+        $this->assertFalse($manager->isMergedAssetsDisabled());
+        
+        // with configuration
+        $defaultConfig = Config::getInstance()->Development['disable_merged_assets'];
+        
+        Config::getInstance()->Development['disable_merged_assets'] = false;
+        $this->assertFalse($manager->isMergedAssetsDisabled());
+        
+        Config::getInstance()->Development['disable_merged_assets'] = true;
+        $this->assertTrue($manager->isMergedAssetsDisabled());
+        
+        // reset the config
+        Config::getInstance()->Development['disable_merged_assets'] = $defaultConfig;
+        
+        // with $_GET parameter
+        $_GET['disable_merged_assets'] = '1';
+        $this->assertTrue($manager->isMergedAssetsDisabled());
+        unset($_GET['disable_merged_assets']);
+        
+        $_GET['disable_merged_assets'] = '0';
+        $this->assertFalse($manager->isMergedAssetsDisabled());
+        unset($_GET['disable_merged_assets']);
+    }
+}
diff --git a/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d879aa0da517f47d426425ac5ae1ee4cb681594
--- /dev/null
+++ b/tests/PHPUnit/Unit/DataAccess/ArchiveTableCreatorTest.php
@@ -0,0 +1,106 @@
+<?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\Tests\Unit\DataAccess;
+
+use Piwik\DataAccess\ArchiveTableCreator;
+
+/**
+ * @group Core
+ */
+class ArchiveTableCreatorTest extends \PHPUnit_Framework_TestCase
+{
+    private $tables;
+
+    public function setUp()
+    {
+        parent::setUp();
+
+        $this->tables = array(
+            'archive_numeric_2015_02',
+            'archive_blob_2015_05',
+            'garbage',
+            'archive_numeric_2014_03',
+            'archive_blob_2015_01',
+            'archive_blob_2015_02',
+            'aslkdfjsd',
+            'prefixed_archive_numeric_2012_01',
+        );
+    }
+
+    public function tearDown()
+    {
+        ArchiveTableCreator::clear();
+
+        parent::tearDown();
+    }
+
+    /**
+     * @dataProvider getTestDataForGetTablesArchivesInstalled
+     */
+    public function test_getTablesArchivesInstalled_CorrectlyFiltersTableNames($type, $expectedTables)
+    {
+        ArchiveTableCreator::$tablesAlreadyInstalled = $this->tables;
+
+        $tables = ArchiveTableCreator::getTablesArchivesInstalled($type);
+
+        $this->assertEquals($expectedTables, $tables);
+    }
+
+    public function getTestDataForGetTablesArchivesInstalled()
+    {
+        return array(
+            array(
+                ArchiveTableCreator::BLOB_TABLE,
+                array(
+                    'archive_blob_2015_05',
+                    'archive_blob_2015_01',
+                    'archive_blob_2015_02',
+                ),
+            ),
+
+            array(
+                ArchiveTableCreator::NUMERIC_TABLE,
+                array(
+                    'archive_numeric_2015_02',
+                    'archive_numeric_2014_03',
+                    'prefixed_archive_numeric_2012_01',
+                ),
+            ),
+
+            array(
+                'qewroufsjdlf',
+                array(),
+            ),
+
+            array(
+                '',
+                array(
+                    'archive_numeric_2015_02',
+                    'archive_blob_2015_05',
+                    'archive_numeric_2014_03',
+                    'archive_blob_2015_01',
+                    'archive_blob_2015_02',
+                    'prefixed_archive_numeric_2012_01',
+                ),
+            ),
+
+            array(
+                null,
+                array(
+                    'archive_numeric_2015_02',
+                    'archive_blob_2015_05',
+                    'archive_numeric_2014_03',
+                    'archive_blob_2015_01',
+                    'archive_blob_2015_02',
+                    'prefixed_archive_numeric_2012_01',
+                ),
+            ),
+        );
+    }
+}
\ No newline at end of file
diff --git a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
index 8d797576d3c6a3620ae686d58d1687b568d52b3f..c123378941ad5bc3a35b82c2c82aef16fe0b72dd 100644
--- a/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
+++ b/tests/PHPUnit/Unit/DeprecatedMethodsTest.php
@@ -72,6 +72,11 @@ class DeprecatedMethodsTest extends \PHPUnit_Framework_TestCase
         $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Archive', 'getDataTableFromArchive');
         $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Plugin', 'getListHooksRegistered');
         $this->assertDeprecatedMethodIsRemovedInPiwik3('\Piwik\Plugins\API\API', 'getLastDate');
+
+        $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\DevicesDetection\DevicesDetection', 'renameUserSettingsModuleAndAction');
+        $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\Resolution\Resolution', 'renameUserSettingsModuleAndAction');
+        $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\DevicePlugins\DevicePlugins', 'renameUserSettingsModuleAndAction');
+        $this->assertDeprecatedMethodIsRemovedInPiwik3('Piwik\Plugins\UserLanguage\UserLanguage', 'renameUserSettingsModuleAndAction');
     }
 
     private function assertDeprecatedMethodIsRemoved($className, $method, $removalDate)
diff --git a/tests/PHPUnit/Unit/Metrics/FormatterTest.php b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
index f0f1e618a9e84ec6456dfe1ef3ed3080ed4bed80..e0ecfacccd0982427e23ebe0c60a07e6e1c825cf 100644
--- a/tests/PHPUnit/Unit/Metrics/FormatterTest.php
+++ b/tests/PHPUnit/Unit/Metrics/FormatterTest.php
@@ -7,7 +7,7 @@
  */
 namespace Piwik\Tests\Unit\Metrics;
 
-use Piwik\Intl\Locale;
+use Piwik\Container\StaticContainer;
 use Piwik\Metrics\Formatter;
 use Piwik\Translate;
 use Piwik\Plugins\SitesManager\API as SitesManagerAPI;
@@ -57,6 +57,7 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
 
     public function tearDown()
     {
+        StaticContainer::get('Piwik\NumberFormatter')->unsetInstance();
         Translate::reset();
         $this->unsetSiteManagerApiMock();
     }
@@ -74,13 +75,8 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
      */
     public function test_getPrettyNumber_ReturnsCorrectResult_WhenLocaleIsEuropean($number, $expected)
     {
-        $locale = setlocale(LC_ALL, array('de-AT', 'de_DE', 'de', 'ge', 'de_DE.utf8'));
-        if (empty($locale)) {
-            $this->markTestSkipped("de_DE locale is not present on this system");
-        }
-
+        StaticContainer::get('Piwik\Translation\Translator')->setCurrentLanguage('de');
         $this->assertEquals($expected, $this->formatter->getPrettyNumber($number, 2));
-        Locale::setDefaultLocale();
     }
 
     /**
@@ -137,12 +133,11 @@ class FormatterTest extends \PHPUnit_Framework_TestCase
     public function getPrettyNumberLocaleTestData()
     {
         return array(
-            array(0.14, '0,14'),
-            array(0.14567, '0,15'),
-            array(100.1234, '100,12'),
-            // Those last two are commented because locales are platform dependent, on some platforms the separator is '' instead of '.'
-//            array(1000.45, '1.000,45'),
-//            array(23456789.00, '23.456.789,00'),
+            array(0.14, '0.14'),
+            array(0.14567, '0.15'),
+            array(100.1234, '100.12'),
+            array(1000.45, '1,000.45'),
+            array(23456789.00, '23,456,789.00'),
         );
     }
 
diff --git a/tests/PHPUnit/Unit/Period/MonthTest.php b/tests/PHPUnit/Unit/Period/MonthTest.php
index 2779a2e582d1a8259d1c9a24e66f128306b5810a..a3abb80d073c1e54b98776407efe955c78c758e3 100644
--- a/tests/PHPUnit/Unit/Period/MonthTest.php
+++ b/tests/PHPUnit/Unit/Period/MonthTest.php
@@ -334,7 +334,7 @@ class MonthTest extends BasePeriodTest
     {
         return array(
             array('en', 'October 2024'),
-            array('lt', '2024 Spalis'),
+            array('lt', '2024 m. Spalis'),
             array('zh-cn', '2024年10月'),
         );
     }
diff --git a/tests/PHPUnit/Unit/Period/RangeTest.php b/tests/PHPUnit/Unit/Period/RangeTest.php
index 115a45fd8b0cfad74caf900f79dfa8830dbd7a13..9b0a8215511a6e6c21b8d2dfed06fb88fe64decc 100644
--- a/tests/PHPUnit/Unit/Period/RangeTest.php
+++ b/tests/PHPUnit/Unit/Period/RangeTest.php
@@ -10,6 +10,7 @@ namespace Piwik\Tests\Unit\Period;
 
 use Exception;
 use Piwik\Date;
+use Piwik\Period;
 use Piwik\Period\Month;
 use Piwik\Period\Range;
 use Piwik\Period\Week;
diff --git a/tests/PHPUnit/Unit/Period/WeekTest.php b/tests/PHPUnit/Unit/Period/WeekTest.php
index 4adf7666a2af7b2a0c78cf911ba349dc13d9453a..5df53acb45b7c9de775b0af8dc1abf3ebac7e8b5 100644
--- a/tests/PHPUnit/Unit/Period/WeekTest.php
+++ b/tests/PHPUnit/Unit/Period/WeekTest.php
@@ -12,6 +12,11 @@ use Piwik\Container\StaticContainer;
 use Piwik\Date;
 use Piwik\Period\Week;
 
+/**
+ * Class WeekTest
+ * @package Piwik\Tests\Unit\Period
+ * @group WeekTest
+ */
 class WeekTest extends BasePeriodTest
 {
     /**
@@ -122,7 +127,7 @@ class WeekTest extends BasePeriodTest
     {
         return array(
             array('en', array('Oct 7 – 13, 2024', 'Nov 25 – Dec 1, 2024', 'Dec 30, 2024 – Jan 5, 2025')),
-            array('lt', array('2024-10-07 – 2024-10-13', '2024-11-25 – 2024-12-01', '2024-12-30 – 2025-1-05')),
+            array('lt', array('2024 Spal. 7–13', '2024 Lapkr. 25 – Gruod. 1', '2024 Gruod. 30 – 2025 Saus. 5')),
             array('zh-cn', array('2024年10月7日至13日', '2024年11月25日至12月1日', '2024年12月30日至2025年01月5日')),
         );
     }
@@ -150,8 +155,8 @@ class WeekTest extends BasePeriodTest
     public function getLocalizedLongStrings()
     {
         return array(
-            array('en', array('Week October 7 – 13, 2024', 'Week November 25 – December 1, 2024', 'Week December 30, 2024 – January 5, 2025')),
-            array('lt', array('Savaitė 2024 Spalio 7–13', 'Savaitė 2024 Lapkričio 25 – Gruodžio 1', 'Savaitė 2024 Gruodžio 30 – 2025 Sausio 5')),
+            array('en', array('week October 7 – 13, 2024', 'week November 25 – December 1, 2024', 'week December 30, 2024 – January 5, 2025')),
+            array('lt', array('savaitė 2024 Spalio 7–13', 'savaitė 2024 Lapkričio 25 – Gruodžio 1', 'savaitė 2024 Gruodžio 30 – 2025 Sausio 5')),
             array('zh-cn', array('周 2024年10月7日至13日', '周 2024年11月25日至12月1日', '周 2024年12月30日至2025年01月5日')),
         );
     }
diff --git a/tests/PHPUnit/Unit/PeriodTest.php b/tests/PHPUnit/Unit/PeriodTest.php
index c8dc2c757eafcb1d8629a6004b4c628f522e04d3..f4c7d4ee1d88568918f09d8d1fa30e187b4435a7 100644
--- a/tests/PHPUnit/Unit/PeriodTest.php
+++ b/tests/PHPUnit/Unit/PeriodTest.php
@@ -123,4 +123,91 @@ class PeriodTest extends \PHPUnit_Framework_TestCase
             array(3434),
         );
     }
+
+    /**
+     * @dataProvider getTestDataForGetAllOverlappingChildPeriods
+     */
+    public function test_getAllOverlappingChildPeriods_ReturnsTheCorrectChildPeriods($periodType, $dateRange, $expectedChildPeriodRanges)
+    {
+        $period = Period\Factory::build($periodType, $dateRange);
+
+        $overlappingPeriods = $period->getAllOverlappingChildPeriods();
+        $overlappingPeriods = $this->getPeriodInfoForAssert($overlappingPeriods);
+
+        $this->assertEquals($expectedChildPeriodRanges, $overlappingPeriods);
+    }
+
+    public function getTestDataForGetAllOverlappingChildPeriods()
+    {
+        return array(
+            array(
+                'month',
+                '2015-09-10',
+                array(
+                    array('week', '2015-08-31,2015-09-06'),
+                    array('week', '2015-09-07,2015-09-13'),
+                    array('week', '2015-09-14,2015-09-20'),
+                    array('week', '2015-09-21,2015-09-27'),
+                    array('week', '2015-09-28,2015-10-04'),
+                    array('day', '2015-09-01,2015-09-01'),
+                    array('day', '2015-09-02,2015-09-02'),
+                    array('day', '2015-09-03,2015-09-03'),
+                    array('day', '2015-09-04,2015-09-04'),
+                    array('day', '2015-09-05,2015-09-05'),
+                    array('day', '2015-09-06,2015-09-06'),
+                    array('day', '2015-09-07,2015-09-07'),
+                    array('day', '2015-09-08,2015-09-08'),
+                    array('day', '2015-09-09,2015-09-09'),
+                    array('day', '2015-09-10,2015-09-10'),
+                    array('day', '2015-09-11,2015-09-11'),
+                    array('day', '2015-09-12,2015-09-12'),
+                    array('day', '2015-09-13,2015-09-13'),
+                    array('day', '2015-09-14,2015-09-14'),
+                    array('day', '2015-09-15,2015-09-15'),
+                    array('day', '2015-09-16,2015-09-16'),
+                    array('day', '2015-09-17,2015-09-17'),
+                    array('day', '2015-09-18,2015-09-18'),
+                    array('day', '2015-09-19,2015-09-19'),
+                    array('day', '2015-09-20,2015-09-20'),
+                    array('day', '2015-09-21,2015-09-21'),
+                    array('day', '2015-09-22,2015-09-22'),
+                    array('day', '2015-09-23,2015-09-23'),
+                    array('day', '2015-09-24,2015-09-24'),
+                    array('day', '2015-09-25,2015-09-25'),
+                    array('day', '2015-09-26,2015-09-26'),
+                    array('day', '2015-09-27,2015-09-27'),
+                    array('day', '2015-09-28,2015-09-28'),
+                    array('day', '2015-09-29,2015-09-29'),
+                    array('day', '2015-09-30,2015-09-30'),
+                ),
+            ),
+
+            array(
+                'week',
+                '2015-09-03',
+                array(
+                    array('day', '2015-08-31,2015-08-31'),
+                    array('day', '2015-09-01,2015-09-01'),
+                    array('day', '2015-09-02,2015-09-02'),
+                    array('day', '2015-09-03,2015-09-03'),
+                    array('day', '2015-09-04,2015-09-04'),
+                    array('day', '2015-09-05,2015-09-05'),
+                    array('day', '2015-09-06,2015-09-06'),
+                ),
+            ),
+
+            array(
+                'day',
+                '2015-09-05',
+                array(),
+            ),
+        );
+    }
+
+    private function getPeriodInfoForAssert($periods)
+    {
+        return array_map(function (Period $period) {
+            return array($period->getLabel(), $period->getRangeString());
+        }, $periods);
+    }
 }
\ No newline at end of file
diff --git a/tests/UI/expected-ui-screenshots b/tests/UI/expected-ui-screenshots
index 7ae250b899595aa7e0c8c4512cae2bffe3c0b769..ae43d0c24150d059c9350c89fe20589d171fb40a 160000
--- a/tests/UI/expected-ui-screenshots
+++ b/tests/UI/expected-ui-screenshots
@@ -1 +1 @@
-Subproject commit 7ae250b899595aa7e0c8c4512cae2bffe3c0b769
+Subproject commit ae43d0c24150d059c9350c89fe20589d171fb40a
diff --git a/tests/UI/specs/DashboardManager_spec.js b/tests/UI/specs/DashboardManager_spec.js
index 77bfbcc9db33e4fc660761ec733bcc92fb1ea442..815fd6e2c98de686a3b48284d7ad9779accb7b4d 100644
--- a/tests/UI/specs/DashboardManager_spec.js
+++ b/tests/UI/specs/DashboardManager_spec.js
@@ -24,7 +24,7 @@ describe("DashboardManager", function () {
 
     it("should expand when clicked", function (done) {
         expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
         }, done);
     });
 
diff --git a/tests/UI/specs/Dashboard_spec.js b/tests/UI/specs/Dashboard_spec.js
index d02411d1a2e776d979c6d559a53e8f3a70ed5413..b268cff47be6525aa72e967241dd5941fc05f22c 100644
--- a/tests/UI/specs/Dashboard_spec.js
+++ b/tests/UI/specs/Dashboard_spec.js
@@ -84,7 +84,7 @@ describe("Dashboard", function () {
     });
 
     it("should refresh widget when widget refresh icon clicked", function (done) {
-        expect.screenshot("widget_move").to.be.capture("widget_refresh", function (page) {
+        expect.screenshot("widget_move_refresh").to.be.capture(function (page) {
             page.mouseMove('.widgetTop');
             page.click('.button#refresh');
             page.mouseMove('.dashboard-manager'); // let widget top hide again
@@ -99,7 +99,7 @@ describe("Dashboard", function () {
     });
 
     it("should unminimise widget when widget maximise icon is clicked after being minimised", function (done) {
-        expect.screenshot("widget_move").to.be.capture("widget_unminimised", function (page) {
+        expect.screenshot("widget_move_unminimised").to.be.capture(function (page) {
             page.mouseMove('.widgetTop');
             page.click('.button#maximise');
             page.mouseMove('.dashboard-manager'); // let widget top hide again
@@ -114,7 +114,7 @@ describe("Dashboard", function () {
     });
 
     it("should close maximise dialog when minimise icon is clicked", function (done) {
-        expect.screenshot("widget_move").to.be.capture("widget_unmaximise", function (page) {
+        expect.screenshot("widget_move_unmaximise").to.be.capture(function (page) {
             page.mouseMove('.widgetTop');
             page.click('.button#minimise');
             page.mouseMove('.dashboard-manager'); // let widget top hide again
@@ -123,7 +123,7 @@ describe("Dashboard", function () {
 
     it("should add a widget when a widget is selected in the dashboard manager", function (done) {
         expect.screenshot("widget_add_widget").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
 
             page.mouseMove('.widgetpreview-categorylist>li:contains(Live!)'); // have to mouse move twice... otherwise Live! will just be highlighted
             page.mouseMove('.widgetpreview-categorylist>li:contains(Times):first');
@@ -140,6 +140,7 @@ describe("Dashboard", function () {
 
             page.mouseMove(widget + ' .widgetTop');
             page.click(widget + ' .button#close');
+
             page.click('.ui-dialog button>span:contains(Yes)');
             page.mouseMove('.dashboard-manager');
         }, done);
@@ -147,7 +148,7 @@ describe("Dashboard", function () {
 
     it("should change dashboard layout when new layout is selected", function (done) {
         expect.screenshot("change_layout").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=showChangeDashboardLayoutDialog]');
             page.click('div[layout=50-50]');
             page.click('.ui-dialog button>span:contains(Save)');
@@ -156,7 +157,7 @@ describe("Dashboard", function () {
 
     it("should rename dashboard when dashboard rename process completed", function (done) {
         expect.screenshot("rename").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=renameDashboard]');
             page.evaluate(function () {
                 $('#newDashboardName:visible').val('newname'); // don't use sendKeys or click, since in this test it appears to trigger a seg fault on travis
@@ -167,7 +168,7 @@ describe("Dashboard", function () {
 
     it("should copy dashboard successfully when copy dashboard process completed", function (done) {
         expect.screenshot("copied").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=copyDashboardToUser]');
             page.evaluate(function () {
                 $('[id=copyDashboardName]:last').val('');
@@ -184,7 +185,7 @@ describe("Dashboard", function () {
 
     it("should reset dashboard when reset dashboard process completed", function (done) {
         expect.screenshot("reset").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=resetDashboard]');
             page.click('.ui-dialog button>span:contains(Yes)', 4000);
             page.mouseMove('.dashboard-manager');
@@ -193,7 +194,7 @@ describe("Dashboard", function () {
 
     it("should remove dashboard when remove dashboard process completed", function (done) {
         expect.screenshot("removed").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=removeDashboard]');
             page.click('.ui-dialog[aria-describedby=removeDashboardConfirm] button>span:contains(Yes)');
             page.mouseMove('.dashboard-manager');
@@ -206,7 +207,7 @@ describe("Dashboard", function () {
     it("should not fail when default widget selection changed", function (done) {
         expect.screenshot("default_widget_selection_changed").to.be.capture(function (page) {
             page.load(url);
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=setAsDefaultWidgets]');
             page.click('.ui-dialog button>span:contains(Yes)');
         }, done);
@@ -214,7 +215,7 @@ describe("Dashboard", function () {
 
     it("should create new dashboard with new default widget selection when create dashboard process completed", function (done) {
         expect.screenshot("create_new").to.be.capture(function (page) {
-            page.click('.dashboard-manager');
+            page.click('.dashboard-manager .title');
             page.click('li[data-action=createDashboard]');
             page.sendKeys('#createDashboardName:visible', 'newdash2');
             page.click('.ui-dialog[aria-describedby=createDashboardConfirm] button>span:contains(Yes)');
diff --git a/tests/UI/specs/EmptySite_spec.js b/tests/UI/specs/EmptySite_spec.js
index 704bda87210ae028e15df89b75ada90b81bc9857..31b8524d6f6032702616d1f116327ffaae64b238 100644
--- a/tests/UI/specs/EmptySite_spec.js
+++ b/tests/UI/specs/EmptySite_spec.js
@@ -15,7 +15,7 @@ describe("EmptySite", function () {
     it('should show the tracking code if the website has no recorded data', function (done) {
         var urlToTest = "?" + generalParams + "&module=CoreHome&action=index";
 
-        expect.screenshot('emptySiteDashboard').to.be.captureSelector('.site-without-data', function (page) {
+        expect.screenshot('emptySiteDashboard').to.be.captureSelector('.page', function (page) {
             page.load(urlToTest);
         }, done);
     });
diff --git a/tests/UI/specs/ImageGraph_spec.js b/tests/UI/specs/ImageGraph_spec.js
index 570ebabe5bcd81843cbd83fc4dbcf2480856b8e1..057f7306e0553d9ac7c138620e7763d1068c21fe 100644
--- a/tests/UI/specs/ImageGraph_spec.js
+++ b/tests/UI/specs/ImageGraph_spec.js
@@ -23,7 +23,7 @@ describe("ImageGraph", function () {
 
     it("should render horizontal bar graphs correctly", function (done) {
         expect.screenshot('horizontal_bar').to.be.similar(.95).to.capture(function (page) {
-            page.load(getImageGraphUrl('DevicesDetection', 'getBrowsers', 'horizontalBar', 'year', '2012-01-01'));
+            page.load(getImageGraphUrl('UserSettings', 'getBrowser', 'horizontalBar', 'year', '2012-01-01'));
         }, done);
     });
 
diff --git a/tests/UI/specs/Login_spec.js b/tests/UI/specs/Login_spec.js
index c58dd5fc53a765ad1901b14c2171965f7b409215..ed4ad31ba3da49821ff54e73f1f67b12e95eca2e 100644
--- a/tests/UI/specs/Login_spec.js
+++ b/tests/UI/specs/Login_spec.js
@@ -49,7 +49,7 @@ describe("Login", function () {
 
     it("should redirect to login when logout link clicked", function (done) {
         expect.screenshot("login_form").to.be.capture("logout_form", function (page) {
-            page.click("#topBars a:contains(Sign out)");
+            page.click("#topRightBar .icon-sign-out");
         }, done);
     });
 
@@ -89,7 +89,7 @@ describe("Login", function () {
 
     it("should login successfully when formless login used", function (done) {
         expect.page("").contains('#dashboard', 'formless_login', function (page) {
-            page.click("#topBars a:contains(Sign out)");
+            page.click("#topRightBar .icon-sign-out");
             page.load(formlessLoginUrl);
         }, done);
     });
diff --git a/tests/UI/specs/MeasurableManager_spec.js b/tests/UI/specs/MeasurableManager_spec.js
index 539576a7c10b2f98e282b54c7293516749640f25..691af5c436e671f45693af0536ca05086d7978fd 100644
--- a/tests/UI/specs/MeasurableManager_spec.js
+++ b/tests/UI/specs/MeasurableManager_spec.js
@@ -31,7 +31,7 @@ describe("MeasurableManager", function () {
     });
 
     it("should use measurable wording in menu", function (done) {
-        var selector = '.Menu-tabList *:contains(Administration):first';
+        var selector = '#secondNavBar li:contains(Administration):first';
         expect.screenshot('measurable_menu_item').to.be.captureSelector(selector, function (page) {
 
         }, done);
diff --git a/tests/UI/specs/Menus_spec.js b/tests/UI/specs/Menus_spec.js
index a79c282ce79323be280f266f99f6ae2b5b160f68..a9a070838472935fbe32cd834e62d4d6d905e96c 100644
--- a/tests/UI/specs/Menus_spec.js
+++ b/tests/UI/specs/Menus_spec.js
@@ -14,61 +14,55 @@ describe("Menus", function () {
         urlBase = 'module=CoreHome&action=index&' + generalParams
         ;
 
+    function openMenuItem(page, menuItem)
+    {
+        page.click('#secondNavBar .navbar a:contains('+ menuItem + ')');
+    }
+
     // main menu tests
     it('should load the main reporting menu correctly', function (done) {
-        expect.screenshot('mainmenu_loaded').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) {
+        expect.screenshot('mainmenu_loaded').to.be.captureSelector('#secondNavBar', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=General_Actions&subcategory=General_Pages");
         }, done);
     });
 
     it('should change the menu when a upper menu item is clicked in the main menu', function (done) {
-        expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) {
-            page.click('.menuItem:contains(Visitors)');
+        expect.screenshot('mainmenu_upper_clicked').to.be.captureSelector('#secondNavBar', function (page) {
+            page.click('#secondNavBar .navbar a:contains:contains(Visitors)');
         }, done);
     });
 
     it('should change the menu when a lower menu item is clicked in the main menu', function (done) {
-        expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('.Menu--dashboard,.nav_sep', function (page) {
-            page.click('.menuItem:contains(Visitor Log)');
-        }, done);
-    });
-
-    // user menu tests
-    it('should load the user reporting menu correctly', function (done) {
-        expect.screenshot('user_loaded').to.be.captureSelector('.Menu--admin', function (page) {
-            page.load("?" + generalParams + "&module=UsersManager&action=userSettings");
-        }, done);
-    });
-
-    it('should change the user page correctly when a user menu item is clicked', function (done) {
-        expect.screenshot('user_changed').to.be.captureSelector('.Menu--admin', function (page) {
-            page.click('.Menu--admin a:contains(API)');
+        expect.screenshot('mainmenu_lower_clicked').to.be.captureSelector('#secondNavBar', function (page) {
+            page.click('#secondNavBar .navbar a:contains:contains(Visitor Log)');
         }, done);
     });
 
     // user menu tests
     it('should load the user reporting menu correctly', function (done) {
-        expect.screenshot('user_loaded').to.be.captureSelector('.Menu--admin', function (page) {
+        expect.screenshot('user_loaded').to.be.captureSelector('#secondNavBar', function (page) {
             page.load("?" + generalParams + "&module=UsersManager&action=userSettings");
         }, done);
     });
 
     it('should change the user page correctly when a user menu item is clicked', function (done) {
-        expect.screenshot('user_changed').to.be.captureSelector('.Menu--admin', function (page) {
-            page.click('.Menu--admin a:contains(API)');
+        expect.screenshot('user_changed').to.be.captureSelector('#secondNavBar', function (page) {
+            openMenuItem(page, 'Platform');
+            openMenuItem(page, 'API');
         }, done);
     });
 
     // admin menu tests
     it('should load the admin reporting menu correctly', function (done) {
-        expect.screenshot('admin_loaded').to.be.captureSelector('.Menu--admin', function (page) {
+        expect.screenshot('admin_loaded').to.be.captureSelector('#secondNavBar', function (page) {
             page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings");
         }, done);
     });
 
     it('should change the admin page correctly when an admin menu item is clicked', function (done) {
-        expect.screenshot('admin_changed').to.be.captureSelector('.Menu--admin', function (page) {
-            page.click('.Menu--admin a:contains(Websites)');
+        expect.screenshot('admin_changed').to.be.captureSelector('#secondNavBar', function (page) {
+            openMenuItem(page, 'Administration');
+            openMenuItem(page, 'Websites');
         }, done);
     });
 });
diff --git a/tests/UI/specs/MultiSites_spec.js b/tests/UI/specs/MultiSites_spec.js
index bab72a1d7710307208731a4852a181770a22de33..6037a196ef8c99bcd61386f7ea52bc731469cab0 100644
--- a/tests/UI/specs/MultiSites_spec.js
+++ b/tests/UI/specs/MultiSites_spec.js
@@ -11,7 +11,7 @@ describe("MultiSitesTest", function () {
     this.timeout(0);
 
     var generalParams = 'idSite=1&period=year&date=2012-08-09';
-    var selector = '.pageWrap,.expandDataTableFooterDrawer';
+    var selector = '#multisites,.expandDataTableFooterDrawer';
 
     var createdSiteId = null;
 
diff --git a/tests/UI/specs/PeriodSelector_spec.js b/tests/UI/specs/PeriodSelector_spec.js
index 4706498ccbca9ffc3b4ab078c7c46656ee597ed9..7668d273758b7d107ce738ae5e62a402dc8e5849 100644
--- a/tests/UI/specs/PeriodSelector_spec.js
+++ b/tests/UI/specs/PeriodSelector_spec.js
@@ -84,7 +84,7 @@ describe("PeriodSelector", function () {
         expect.screenshot("date_range_selected").to.be.captureSelector('#periodString', function (page) {
             page.click('#calendarFrom .ui-datepicker-calendar a:contains(10)');
             page.click('#calendarTo .ui-datepicker-calendar a:contains(18)');
-            page.mouseMove('#calendarRangeApply');
+            page.mouseMove('#calendarApply');
         }, done);
     });
 });
\ No newline at end of file
diff --git a/tests/UI/specs/QuickAccess_spec.js b/tests/UI/specs/QuickAccess_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..75879d2729672a5f391e9f695a7f46066813f0f5
--- /dev/null
+++ b/tests/UI/specs/QuickAccess_spec.js
@@ -0,0 +1,75 @@
+/*!
+ * Piwik - free/libre analytics platform
+ *
+ * ActionsDataTable screenshot tests.
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ */
+
+describe("QuickAccess", function () {
+    var selectorToCapture = "#search,.quick-access";
+
+    this.timeout(0);
+
+    var url = "?module=CoreHome&action=index&idSite=1&period=year&date=2012-08-09";
+
+    function enterSearchTerm(page, searchTermToAdd)
+    {
+        page.sendKeys("#search input", searchTermToAdd);
+    }
+
+    function captureSelector(screenshotName, done, selector, callback)
+    {
+        expect.screenshot(screenshotName).to.be.captureSelector(selector, callback, done);
+    }
+
+    function capture(screenshotName, done, callback)
+    {
+        captureSelector(screenshotName, done, selectorToCapture, callback);
+    }
+
+    it("should be displayed", function (done) {
+        capture('initially', done, function (page) {
+            page.load(url);
+        });
+    });
+
+    it("should search for something and update view", function (done) {
+        capture('search_1', done, function (page) {
+            enterSearchTerm(page, 'b');
+        });
+    });
+
+    it("should search again when typing another letter", function (done) {
+        capture('search_2', done, function (page) {
+            enterSearchTerm(page, 'a');
+        });
+    });
+
+    it("should show message if no results", function (done) {
+        capture('search_no_result', done, function (page) {
+            enterSearchTerm(page, 'x');
+        });
+    });
+
+    it("should be possible to activate via shortcut", function (done) {
+        capture('shortcut', done, function (page) {
+            page.load(url);
+            page.sendKeys("body", 'f');
+        });
+    });
+
+    it("should search for websites", function (done) {
+        capture('search_sites', done, function (page) {
+            enterSearchTerm(page, 'si');
+        });
+    });
+
+    it("clicking on a category should show all items that belong to that category", function (done) {
+        capture('search_category', done, function (page) {
+            page.click('.quick-access-category:first');
+        });
+    });
+
+});
diff --git a/tests/UI/specs/SegmentSelectorEditor_spec.js b/tests/UI/specs/SegmentSelectorEditor_spec.js
index f00a9e87d56c4e2748e09b32d11bff30676a28e8..0f53003c10066e425b9ca2bfa7850298492ab18d 100644
--- a/tests/UI/specs/SegmentSelectorEditor_spec.js
+++ b/tests/UI/specs/SegmentSelectorEditor_spec.js
@@ -23,13 +23,13 @@ describe("SegmentSelectorEditorTest", function () {
 
     it("should open selector when control clicked", function (done) {
         expect.screenshot("1_selector_open").to.be.captureSelector(selectorsToCapture, function (page) {
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
         }, done);
     });
 
     it("should open segment editor when edit link clicked for existing segment", function (done) {
         expect.screenshot("2_segment_editor_update").to.be.captureSelector(selectorsToCapture, function (page) {
-            page.click('.segmentList .editSegment');
+            page.click('.segmentList .editSegment:first');
         }, done);
     });
 
@@ -66,7 +66,7 @@ describe("SegmentSelectorEditorTest", function () {
 
     it("should open blank segment editor when create new segment link is clicked", function (done) {
         expect.screenshot("8_segment_editor_create").to.be.captureSelector(selectorsToCapture, function (page) {
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
             page.click('.add_new_segment');
         }, done);
     });
@@ -121,7 +121,7 @@ describe("SegmentSelectorEditorTest", function () {
     it("should show the new segment after page reload", function (done) {
         expect.screenshot("saved").to.be.captureSelector("saved_reload", selectorsToCapture, function (page) {
             page.reload();
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
         }, done);
     });
 
@@ -161,7 +161,7 @@ describe("SegmentSelectorEditorTest", function () {
     it("should show the updated segment after page reload", function (done) {
         expect.screenshot("updated").to.be.captureSelector("updated_reload", selectorsToCapture, function (page) {
             page.reload();
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
         }, done);
     });
 
@@ -181,14 +181,14 @@ describe("SegmentSelectorEditorTest", function () {
         expect.screenshot('deleted').to.be.captureSelector(selectorsToCapture + ',.ui-dialog', function (page) {
             page.click('.ui-dialog button>span:contains(Yes):visible');
 
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
         }, done);
     });
 
     it("should not show the deleted segment after page reload", function (done) {
         expect.screenshot('deleted').to.be.captureSelector('deleted_reload', selectorsToCapture, function (page) {
             page.reload();
-            page.click('.segmentationContainer');
+            page.click('.segmentationContainer .title');
         }, done);
     });
 });
\ No newline at end of file
diff --git a/tests/UI/specs/SiteSelector_spec.js b/tests/UI/specs/SiteSelector_spec.js
index 71ae7995588a2124fd3f5a445a76af12352beb5e..8ee2c71e0baab37c783173ceb0b61f24f6f28b6f 100644
--- a/tests/UI/specs/SiteSelector_spec.js
+++ b/tests/UI/specs/SiteSelector_spec.js
@@ -8,7 +8,7 @@
  */
 
 describe("SiteSelector", function () {
-    var selectorToCapture = '[piwik-siteselector],[piwik-siteselector] .custom_select';
+    var selectorToCapture = '[piwik-siteselector],[piwik-siteselector] .dropdown';
 
     this.timeout(0);
 
@@ -22,7 +22,7 @@ describe("SiteSelector", function () {
 
     it("should display expanded when clicked", function (done) {
         expect.screenshot("expanded").to.be.captureSelector(selectorToCapture, function (page) {
-            page.click('.sites_autocomplete');
+            page.click('.sites_autocomplete .title');
         }, done);
     });
 
diff --git a/tests/UI/specs/UIIntegration_spec.js b/tests/UI/specs/UIIntegration_spec.js
index c58f50af4ffe099b8beb5d49d98c72673729cd0b..fbcaf5474d2f43abf96560992f5177ebd9a9d48f 100644
--- a/tests/UI/specs/UIIntegration_spec.js
+++ b/tests/UI/specs/UIIntegration_spec.js
@@ -110,6 +110,12 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
         }, done);
     });
 
+    it('should redirect the old UserSettings index to visitors > software', function (done) {
+        expect.screenshot('usersettings_index').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+            page.load("?" + urlBase + "#" + generalParams + "&module=UserSettings&action=index");
+        }, done);
+    });
+
     it('should load the visitors > times page correctly', function (done) {
         expect.screenshot("visitors_times").to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=General_Visitors&subcategory=VisitTime_SubmenuTimes");
@@ -236,8 +242,14 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     // goals pages
+    it('should load the goals > ecommerce page correctly', function (done) {
+        expect.screenshot('goals_ecommerce').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
+            page.load( "?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=General_Overview")
+        }, done);
+    });
+
     it('should load the goals > overview page correctly', function (done) {
-        expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+        expect.screenshot('goals_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
             page.load( "?" + urlBase + "#?" + generalParams + "&category=Goals_Goals&subcategory=General_Overview");
         }, done);
     });
@@ -250,7 +262,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the goals > single goal page correctly', function (done) {
-        expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+        expect.screenshot('goals_individual_goal').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Goals&subcategory=1");
         }, done);
     });
@@ -343,7 +355,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
 
     // Ecommerce
     it('should load the ecommerce overview page', function (done) {
-        expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+        expect.screenshot('ecommerce_overview').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=General_Overview");
         }, done);
     });
@@ -355,20 +367,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the ecommerce products page', function (done) {
-        expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+        expect.screenshot('ecommerce_products').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=Goals_Products");
         }, done);
     });
 
     it('should load the ecommerce sales page', function (done) {
-        expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer', function (page) {
+        expect.screenshot('ecommerce_sales').to.be.captureSelector('.pageWrap,.expandDataTableFooterDrawer,.dataTable', function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=Goals_Ecommerce&subcategory=Ecommerce_Sales");
         }, done);
     });
 
     // Admin user settings (plugins not displayed)
     it('should load the Manage > Websites admin page correctly', function (done) {
-        expect.screenshot('admin_manage_websites').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_manage_websites').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=SitesManager&action=index");
             page.evaluate(function () {
                 $('.form-help:contains(UTC time is)').hide();
@@ -377,7 +389,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the Manage > Users admin page correctly', function (done) {
-        expect.screenshot('admin_manage_users').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_manage_users').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=UsersManager&action=index");
 
             // remove token auth which can be random
@@ -393,25 +405,25 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the user settings admin page correctly', function (done) {
-        expect.screenshot('admin_user_settings').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_user_settings').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=UsersManager&action=userSettings");
         }, done);
     });
 
     it('should load the Manage > Tracking Code admin page correctly', function (done) {
-        expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_manage_tracking_code').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CoreAdminHome&action=trackingCodeGenerator");
         }, done);
     });
 
     it('should load the Settings > General Settings admin page correctly', function (done) {
-        expect.screenshot('admin_settings_general').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_settings_general').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CoreAdminHome&action=generalSettings");
         }, done);
     });
 
     it('should load the Settings > Privacy admin page correctly', function (done) {
-        expect.screenshot('admin_privacy_settings').to.be.captureSelector('#content,.ui-inline-help', function (page) {
+        expect.screenshot('admin_privacy_settings').to.be.captureSelector('.pageWrap,.ui-inline-help', function (page) {
             page.load("?" + generalParams + "&module=PrivacyManager&action=privacySettings");
         }, done);
     });
@@ -423,43 +435,43 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the Settings > Mobile Messaging admin page correctly', function (done) {
-        expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=MobileMessaging&action=index");
         }, done);
     });
 
     it('should load the Settings > Mobile Messaging user page correctly', function (done) {
-        expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('user_settings_mobilemessaging').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=MobileMessaging&action=userSettings");
         }, done);
     });
 
     it('should load the themes admin page correctly', function (done) {
-        expect.screenshot('admin_themes').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_themes').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CorePluginsAdmin&action=themes");
         }, done);
     });
 
     it('should load the plugins admin page correctly', function (done) {
-        expect.screenshot('admin_plugins').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_plugins').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CorePluginsAdmin&action=plugins");
         }, done);
     });
 
     it('should load the plugin settings admin page correctly', function (done) {
-        expect.screenshot('admin_plugin_settings').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_plugin_settings').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CoreAdminHome&action=adminPluginSettings");
         }, done);
     });
 
     it('should load the plugin settings user page correctly', function (done) {
-        expect.screenshot('user_plugin_settings').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('user_plugin_settings').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CoreAdminHome&action=userPluginSettings");
         }, done);
     });
 
     it('should load the Settings > Visitor Generator admin page correctly', function (done) {
-        expect.screenshot('admin_visitor_generator').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('admin_visitor_generator').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=VisitorGenerator&action=index");
 
             page.evaluate(function () {
@@ -471,7 +483,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
 
     // Notifications
     it('should load the notifications page correctly', function (done) {
-        expect.screenshot('notifications').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('notifications').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=ExampleUI&action=notifications&idSite=1&period=day&date=yesterday");
             page.evaluate(function () {
                 $('#header').hide();
@@ -511,20 +523,20 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
 
     // CustomAlerts plugin TODO: move to CustomAlerts plugin
     it('should load the custom alerts list correctly', function (done) {
-        expect.screenshot('customalerts_list').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('customalerts_list').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CustomAlerts&action=index&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1");
         }, done);
     });
 
     it('should load the triggered custom alerts list correctly', function (done) {
-        expect.screenshot('customalerts_list_triggered').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('customalerts_list_triggered').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=CustomAlerts&action=historyTriggeredAlerts&idSite=1&period=day&date=yesterday&tests_hide_piwik_version=1");
         }, done);
     });
 
     // top bar pages
     it('should load the widgets listing page correctly', function (done) {
-        expect.screenshot('widgets_listing').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('widgets_listing').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=Widgetize&action=index");
             page.mouseMove('.widgetpreview-categorylist>li:contains(Visitors)');
             page.mouseMove('li[uniqueid="widgetVisitsSummarygetEvolutionGraphforceView1viewDataTablegraphEvolution"]');
@@ -532,7 +544,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the API listing page correctly', function (done) {
-        expect.screenshot('api_listing').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('api_listing').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=API&action=listAllAPI");
             page.evaluate(function () { // remove token_auth since it can change on each test run
                 $('span#token_auth>strong').text('dummytokenauth');
@@ -541,7 +553,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the email reports page correctly', function (done) {
-        expect.screenshot('email_reports').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('email_reports').to.be.captureSelector('.pageWrap', function (page) {
             page.load("?" + generalParams + "&module=ScheduledReports&action=index");
             page.evaluate(function () {
                 $('#header').hide();
@@ -550,7 +562,7 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     });
 
     it('should load the feedback form when the feedback form link is clicked', function (done) {
-        expect.screenshot('feedback_form').to.be.captureSelector('#content', function (page) {
+        expect.screenshot('feedback_form').to.be.captureSelector('.pageWrap', function (page) {
 
             page.load("?" + generalParams + "&module=Feedback&action=index");
 
@@ -571,13 +583,15 @@ describe("UIIntegrationTest", function () { // TODO: Rename to Piwik?
     it('should reload to the correct date when a date range is selected in the period selector', function (done) {
         expect.screenshot('period_select_date_range_click').to.be.capture(function (page) {
             page.load("?" + urlBase + "#?" + generalParams + "&category=General_Visitors&subcategory=VisitTime_SubmenuTimes");
+            page.wait(1000);
+            page.click('#date.title');
+            // we need to make sure there to wait for a bit till date is opened and period selected
+            page.click('#period_id_range');
             page.evaluate(function () {
                 $(document).ready(function () {
-                    $('#date').click();
-                    $('#period_id_range').click();
                     $('#inputCalendarFrom').val('2012-08-02');
                     $('#inputCalendarTo').val('2012-08-12');
-                    setTimeout(function () {$('#calendarRangeApply').click();}, 500);
+                    setTimeout(function () {$('#calendarApply').click();}, 500);
                 });
             });
         }, done);
diff --git a/tests/angularjs/bootstrap.js b/tests/angularjs/bootstrap.js
index 77e034051947ef416935ab008d1c5d1855696107..ef813f5d2ca215ba8cd817258cebf2e98fa6ab83 100644
--- a/tests/angularjs/bootstrap.js
+++ b/tests/angularjs/bootstrap.js
@@ -24,5 +24,19 @@ piwik.config = {"action_url_category_delimiter":"\/","autocomplete_min_sites":"5
 var translations = {"CorePluginsAdmin_NoZipFileSelected":"Please select a ZIP file.","General_InvalidDateRange":"Invalid Date Range, Please Try Again","General_Loading":"Loading...","General_Show":"show","General_Hide":"hide","Intl_Year_Short":"yr","General_MultiSitesSummary":"All Websites","CoreHome_YouAreUsingTheLatestVersion":"You are using the latest version of Piwik!","CoreHome_IncludeRowsWithLowPopulation":"Rows with low population are hidden %s Show all rows","CoreHome_ExcludeRowsWithLowPopulation":"All rows are shown %s Exclude low population","CoreHome_DataTableIncludeAggregateRows":"Aggregate rows are hidden %s Show them","CoreHome_DataTableExcludeAggregateRows":"Aggregate rows are shown %s Hide them","CoreHome_Default":"default","CoreHome_PageOf":"%1$s of %2$s","CoreHome_FlattenDataTable":"The report is hierarchical %s Make it flat","CoreHome_UnFlattenDataTable":"The report is flat %s Make it hierarchical","CoreHome_ExternalHelp":"Help (opens in new tab)","SitesManager_NotFound":"No websites found for","Annotations_ViewAndAddAnnotations":"View and add annotations for %s...","General_RowEvolutionRowActionTooltipTitle":"Open Row Evolution","General_RowEvolutionRowActionTooltip":"See how the metrics for this row changed over time","Annotations_IconDesc":"View notes for this date range.","Annotations_IconDescHideNotes":"Hide notes for this date range.","Annotations_HideAnnotationsFor":"Hide annotations for %s...","General_LoadingPopover":"Loading %s...","General_LoadingPopoverFor":"Loading %s for","Intl_Month_Short_StandAlone_1":"Jan","Intl_Month_Short_StandAlone_2":"Feb","Intl_Month_Short_StandAlone_3":"Mar","Intl_Month_Short_StandAlone_4":"Apr","Intl_Month_Short_StandAlone_5":"May","Intl_Month_Short_StandAlone_6":"Jun","Intl_Month_Short_StandAlone_7":"Jul","Intl_Month_Short_StandAlone_8":"Aug","Intl_Month_Short_StandAlone_9":"Sep","Intl_Month_Short_StandAlone_10":"Oct","Intl_Month_Short_StandAlone_11":"Nov","Intl_Month_Short_StandAlone_12":"Dec","Intl_Month_Long_StandAlone_1":"January","Intl_Month_Long_StandAlone_2":"February","Intl_Month_Long_StandAlone_3":"March","Intl_Month_Long_StandAlone_4":"April","Intl_Month_Long_StandAlone_5":"May","Intl_Month_Long_StandAlone_6":"June","Intl_Month_Long_StandAlone_7":"July","Intl_Month_Long_StandAlone_8":"August","Intl_Month_Long_StandAlone_9":"September","Intl_Month_Long_StandAlone_10":"October","Intl_Month_Long_StandAlone_11":"November","Intl_Month_Long_StandAlone_12":"December","Intl_Day_Short_StandAlone_1":"Mon","Intl_Day_Short_StandAlone_2":"Tue","Intl_Day_Short_StandAlone_3":"Wed","Intl_Day_Short_StandAlone_4":"Thu","Intl_Day_Short_StandAlone_5":"Fri","Intl_Day_Short_StandAlone_6":"Sat","Intl_Day_Short_StandAlone_7":"Sun","Intl_Day_Long_StandAlone_1":"Monday","Intl_Day_Long_StandAlone_2":"Tuesday","Intl_Day_Long_StandAlone_3":"Wednesday","Intl_Day_Long_StandAlone_4":"Thursday","Intl_Day_Long_StandAlone_5":"Friday","Intl_Day_Long_StandAlone_6":"Saturday","Intl_Day_Long_StandAlone_7":"Sunday","Intl_Day_Min_StandAlone_1":"Mo","Intl_Day_Min_StandAlone_2":"Tu","Intl_Day_Min_StandAlone_3":"We","Intl_Day_Min_StandAlone_4":"Th","Intl_Day_Min_StandAlone_5":"Fr","Intl_Day_Min_StandAlone_6":"Sa","Intl_Day_Min_StandAlone_7":"Su","General_Search":"Search","General_MoreDetails":"More Details","General_Help":"Help","General_MetricsToPlot":"Metrics to plot","General_MetricToPlot":"Metric to plot","General_RecordsToPlot":"Records to plot","General_SaveImageOnYourComputer":"To save the image on your computer, right click on the image and select \"Save Image As...\"","General_ExportAsImage":"Export as Image","General_NoDataForGraph":"No data for this graph.","Widgetize_OpenInNewWindow":"Open in a new window","Dashboard_LoadingWidget":"Loading widget, please wait...","General_TransitionsRowActionTooltipTitle":"Open Transitions","General_TransitionsRowActionTooltip":"See what visitors did before and after viewing this page","Dashboard_AddPreviewedWidget":"Click to add widget to the dashboard","Dashboard_WidgetPreview":"Widget preview","Dashboard_Maximise":"Maximise","Dashboard_Minimise":"Minimise","Dashboard_WidgetNotFound":"Widget not found","Dashboard_DashboardCopied":"Current dashboard successfully copied to selected user.","General_Close":"Close","General_Refresh":"Refresh","General_Website":"Website","General_ColumnNbVisits":"Visits","General_ColumnPageviews":"Pageviews","General_ColumnRevenue":"Revenue","General_TotalVisitsPageviewsRevenue":"(Total: %s visits, %s pageviews, %s revenue)","General_EvolutionSummaryGeneric":"%1$s in %2$s compared to %3$s in %4$s. Evolution: %5$s","General_AllWebsitesDashboard":"All Websites dashboard","General_NVisits":"%s visits","MultiSites_Evolution":"Evolution","SitesManager_AddSite":"Add a new website","General_Next":"Next","General_Previous":"Previous","General_GoTo":"Go to %s","Dashboard_DashboardOf":"Dashboard of %s","Actions_SubmenuSitesearch":"Site Search","MultiSites_LoadingWebsites":"Loading websites","General_ErrorRequest":"Oops\u2026 problem during the request, please try again.","Goals_AddGoal":"Add Goal","Goals_UpdateGoal":"Update Goal","Goals_DeleteGoalConfirm":"Are you sure you want to delete the Goal %s?","UserCountry_FatalErrorDuringDownload":"A fatal error occurred while downloading this file. There might be something wrong with your internet connection, with the GeoIP database you downloaded or Piwik. Try downloading and installing it manually.","UserCountry_SetupAutomaticUpdatesOfGeoIP":"Setup automatic updates of GeoIP databases","General_Done":"Done","Feedback_ThankYou":"Thank you for helping us to make Piwik better!","Feedback_RateFeatureTitle":"Do you like the '%s' feature? Please rate and leave a comment","Feedback_RateFeatureThankYouTitle":"Thank you for rating '%s'!","Feedback_RateFeatureLeaveMessageLike":"We are glad you like it! Please let us know what you like the most or if you have a feature request.","Feedback_RateFeatureLeaveMessageDislike":"We are sorry to hear you don't like it! Please let us know how we can improve.","Feedback_SendFeedback":"Send Feedback","Feedback_RateFeatureSendFeedbackInformation":"Your Piwik platform will send us (the Piwik team) an email (including your email address) so we can get in contact with you if you have any question.","General_Ok":"Ok","General_OrCancel":"or %s Cancel %s","General_Save":"Save","UsersManager_DeleteConfirm":"Are you sure you want to delete the user %s?","UsersManager_ConfirmGrantSuperUserAccess":"Do you really want to grant '%s' Super User access? Warning: the user will have access to all websites and will be able to perform administrative tasks.","UsersManager_ConfirmProhibitOtherUsersSuperUserAccess":"Do you really want to remove Super User access from '%s'? The user will lose all permissions and access to all websites. Make sure to set permissions to needed websites afterwards if necessary.","UsersManager_ConfirmProhibitMySuperUserAccess":"%s, do you really want to remove your own Super User access? You will lose all permissions and access to all websites and will be logged out from Piwik.","SitesManager_OnlyOneSiteAtTime":"You can only edit one website at a time. Please Save or Cancel your current modifications to the website %s.","SitesManager_DeleteConfirm":"Are you sure you want to delete the website %s?","ScheduledReports_ReportSent":"Report sent","ScheduledReports_ReportUpdated":"Report updated","General_OverlayRowActionTooltipTitle":"Open Page Overlay","General_OverlayRowActionTooltip":"See analytics data directly on your website (opens new tab)","CustomAlerts_InvalidMetricValue":"Value must be numeric","Live_VisitorProfile":"Visitor profile","Live_NoMoreVisits":"There are no more visits for this visitor.","Live_ShowMap":"show map","Live_HideMap":"hide map","Live_PageRefreshed":"Number of times this page was viewed \/ refreshed in a row."};
 if(typeof(piwik_translations) == 'undefined') { var piwik_translations = new Object; }for(var i in translations) { piwik_translations[i] = translations[i];}
 
+var piwikUsageTracking = {
+    targets: [
+        {url: 'http://localhost/piwik.php', idSite: 1, cookieDomain: ''},
+        {url: 'http://127.0.0.1/piwik.php', idSite: 20, cookieDomain: ''},
+        {url: 'http://localhost/piwik.php', idSite: 33, cookieDomain: ''},
+    ],
+    visitorCustomVariables: [
+        {id: 1, name: 'Access', value: 'user'}
+    ],
+    trackingDomain: 'http://demo.piwik.org',
+    exampleDomain: 'http://example.com'
+};
+
 var expect = chai.expect
-    , should = chai.should();
\ No newline at end of file
+    , should = chai.should();
+
diff --git a/tests/angularjs/karma.conf.js b/tests/angularjs/karma.conf.js
index 237d39b57a4e90994b3cfc0d8814368f7327777e..9525c7e06b023b949168f0ef0ab31c153da9e024 100755
--- a/tests/angularjs/karma.conf.js
+++ b/tests/angularjs/karma.conf.js
@@ -30,7 +30,10 @@ module.exports = function(config) {
         'plugins/CoreHome/angularjs/common/directives/directive.module.js',
         'plugins/CoreHome/angularjs/piwikApp.js',
         'plugins/*/angularjs/**/*.js',
-        'plugins/*/angularjs/**/*.spec.js'
+        'piwik.js',
+        'plugins/AnonymousPiwikUsageMeasurement/javascripts/url.js',
+        'plugins/AnonymousPiwikUsageMeasurement/javascripts/tracking.js',
+        'plugins/*/**/*.spec.js'
     ],
 
     // list of files to exclude
diff --git a/tests/lib/screenshot-testing/support/app.js b/tests/lib/screenshot-testing/support/app.js
index e0838b7025cc6ab5edbbab0345c8cd13a36efab6..95995797c2cf2b0067736f70a8d0c5ff9e6e8d96 100644
--- a/tests/lib/screenshot-testing/support/app.js
+++ b/tests/lib/screenshot-testing/support/app.js
@@ -42,8 +42,8 @@ var isCorePlugin = function (pathToPlugin) {
 var Application = function () {
     this.runner = null;
 
-    var diffviewerDir = path.join(PIWIK_INCLUDE_PATH, 'tests/UI', config.screenshotDiffDir);
-    this.diffViewerGenerator = new DiffViewerGenerator(diffviewerDir);
+    this.diffviewerDir = path.join(PIWIK_INCLUDE_PATH, 'tests/UI', config.screenshotDiffDir);
+    this.diffViewerGenerator = new DiffViewerGenerator(this.diffviewerDir);
 };
 
 Application.prototype.printHelpAndExit = function () {
@@ -259,4 +259,9 @@ Application.prototype.finish = function () {
     phantom.exit(this.runner ? this.runner.failures : -1);
 };
 
+Application.prototype.appendMissingExpected = function (screenName) {
+    var missingExpectedFilePath = path.join(this.diffviewerDir, 'missing-expected.list');
+    fs.write(missingExpectedFilePath, screenName + "\n", "a");
+};
+
 exports.Application = new Application();
\ No newline at end of file
diff --git a/tests/lib/screenshot-testing/support/chai-extras.js b/tests/lib/screenshot-testing/support/chai-extras.js
index 05cabf82da17501fdb74673a22c180b708d82ba8..aeb2d86b1bb38d7964d81742487e3209681727d6 100644
--- a/tests/lib/screenshot-testing/support/chai-extras.js
+++ b/tests/lib/screenshot-testing/support/chai-extras.js
@@ -137,6 +137,8 @@ function capture(screenName, compareAgainst, selector, pageSetupFn, comparisonTh
             }
 
             if (!testInfo.expected) {
+                app.appendMissingExpected(screenName);
+
                 fail("No expected screenshot found for " + screenshotFileName + ".");
                 return;
             }
@@ -404,4 +406,4 @@ chai.Assertion.addChainableMethod('pageContents', function (pageSetupFn, done) {
     var compareAgainst = this.__flags['object'];
 
     compareContents(compareAgainst, pageSetupFn, done);
-});
\ No newline at end of file
+});
diff --git a/tests/lib/screenshot-testing/support/page-renderer.js b/tests/lib/screenshot-testing/support/page-renderer.js
index 70231c3ca73e78f6deb6aee3432798597819d452..2bb909f721675e13eb44a38f13e2d69f9829160e 100644
--- a/tests/lib/screenshot-testing/support/page-renderer.js
+++ b/tests/lib/screenshot-testing/support/page-renderer.js
@@ -137,6 +137,8 @@ PageRenderer.prototype._sendMouseEvent = function (type, pos, callback) {
 PageRenderer.prototype._click = function (selector, modifiers, callback) {
     var position = this._getPosition(selector);
 
+    this._makeSurePositionIsInViewPort(position.x, position.y);
+
     if (modifiers.length) {
         var self = this;
         modifiers = modifiers.reduce(function (previous, mStr) {
@@ -152,6 +154,46 @@ PageRenderer.prototype._click = function (selector, modifiers, callback) {
     callback();
 };
 
+PageRenderer.prototype._makeSurePositionIsInViewPort = function (width, height) {
+
+    var currentWidth  = this._getViewportWidth();
+    var currentHeight = this._getViewportHeight();
+
+    var update = false;
+
+    if (width && width > 0 && width >= currentWidth) {
+        currentWidth = width + 50;
+        update = true;
+    }
+
+    if (height && height > 0 && height >= currentHeight) {
+        currentHeight = height + 50;
+        update = true;
+    }
+
+    if (update) {
+        this._setCorrectViewportSize({width: currentWidth, height: currentHeight});
+    }
+};
+
+PageRenderer.prototype._getViewportWidth = function () {
+    var width = 1350;
+    if (this._viewportSizeOverride && this._viewportSizeOverride.width) {
+        width = this._viewportSizeOverride.width;
+    }
+
+    return width;
+};
+
+PageRenderer.prototype._getViewportHeight = function () {
+    var height = 768;
+    if (this._viewportSizeOverride && this._viewportSizeOverride.height) {
+        height = this._viewportSizeOverride.height;
+    }
+
+    return height;
+};
+
 PageRenderer.prototype._keypress = function (keys, callback) {
     this.webpage.sendEvent('keypress', keys);
 
@@ -574,8 +616,10 @@ PageRenderer.prototype._waitForNextEvent = function (events, callback, i, waitTi
     }, waitTime);
 };
 
-PageRenderer.prototype._setCorrectViewportSize = function () {
-    var viewportSize = this._viewportSizeOverride || {width:1350, height:768};
+PageRenderer.prototype._setCorrectViewportSize = function (viewportSize) {
+    if (!viewportSize) {
+        viewportSize = {width: this._getViewportWidth(), height: this._getViewportHeight()};
+    }
 
     this.webpage.viewportSize = viewportSize;
     var height = Math.max(viewportSize.height, this.webpage.evaluate(function() {
diff --git a/tests/resources/screenshot-override/override.css b/tests/resources/screenshot-override/override.css
index 9616c5acb86c32b59590c56b0cde73c26e0993cd..f74ae3545f8f135ab9319e0f32df841f8d578a04 100644
--- a/tests/resources/screenshot-override/override.css
+++ b/tests/resources/screenshot-override/override.css
@@ -1,5 +1,5 @@
-#header_message>.header_short {
-    display:none;
+#header_message>.title {
+    visibility: hidden;
 }
 
 .visitor-profile-widget-link>strong {
diff --git a/tests/travis b/tests/travis
index 1d994a294112da5a67e229e7d02bda91806cbd03..73e688cb29439cb997ec99d68ff6379dd4486f5b 160000
--- a/tests/travis
+++ b/tests/travis
@@ -1 +1 @@
-Subproject commit 1d994a294112da5a67e229e7d02bda91806cbd03
+Subproject commit 73e688cb29439cb997ec99d68ff6379dd4486f5b