diff --git a/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php b/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php
index 59b587594d66a81d46cf74ffb6d783065e96f029..4e5014fd24bec8d9ea212e51c32b2fd99403dc26 100644
--- a/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php
+++ b/core/DataTable/Filter/AddColumnsProcessedMetricsGoal.php
@@ -19,6 +19,7 @@ use Piwik\Tracker\GoalManager;
  * Adds goal related metrics to a {@link DataTable} using metrics that already exist.
  *
  * Metrics added are:
+ *
  * - **revenue_per_visit**: total goal and ecommerce revenue / nb_visits
  * - **goal_%idGoal%_conversion_rate**: the conversion rate. There will be one of
  *                                      these columns for each goal that exists
diff --git a/core/Http.php b/core/Http.php
index f131bc44cd5b78a5be036f5d7775eade85c5ceb7..ab7973f0cb5d5ac8bb8619df393a72ddbb15dfdc 100644
--- a/core/Http.php
+++ b/core/Http.php
@@ -488,7 +488,8 @@ class Http
             } else if ($response === false) {
                 $errstr = curl_error($ch);
                 if ($errstr != '') {
-                    throw new Exception('curl_exec: ' . $errstr);
+                    throw new Exception('curl_exec: ' . $errstr
+                        . '. Hostname requested was: ' . UrlHelper::getHostFromUrl($aUrl));
                 }
                 $response = '';
             } else {
diff --git a/core/Plugin/Visualization.php b/core/Plugin/Visualization.php
index 387858f51892cc871bacdb629961688eebceb254..fc4002948dd411ab325f0ef0a9a91cc63b63832a 100644
--- a/core/Plugin/Visualization.php
+++ b/core/Plugin/Visualization.php
@@ -505,6 +505,8 @@ class Visualization extends ViewDataTable
      * 
      * Use this method to change the request parameters that is sent to the API when requesting
      * data.
+     *
+     * @api
      */
     public function beforeLoadDataTable()
     {
@@ -515,6 +517,8 @@ class Visualization extends ViewDataTable
      * 
      * Use this method if you need access to the entire dataset (since generic filters will
      * limit and truncate reports).
+     *
+     * @api
      */
     public function beforeGenericFiltersAreAppliedToLoadedDataTable()
     {
@@ -522,6 +526,8 @@ class Visualization extends ViewDataTable
 
     /**
      * Hook that is executed after generic filters are applied.
+     *
+     * @api
      */
     public function afterGenericFiltersAreAppliedToLoadedDataTable()
     {
@@ -530,6 +536,8 @@ class Visualization extends ViewDataTable
     /**
      * Hook that is executed after the report data is loaded and after all filters have been applied.
      * Use this method to format the report data before the view is rendered.
+     *
+     * @api
      */
     public function afterAllFiltersAreApplied()
     {
@@ -538,6 +546,8 @@ class Visualization extends ViewDataTable
     /**
      * Hook that is executed directly before rendering. Use this hook to force display properties to
      * be a certain value, despite changes from plugins and query parameters.
+     *
+     * @api
      */
     public function beforeRender()
     {
diff --git a/core/Url.php b/core/Url.php
index fbcd379df5756aeeb888b0729b78e8b24ac59ad0..d9fa0bf55f29f8304eed4b52ac871080232bc7c4 100644
--- a/core/Url.php
+++ b/core/Url.php
@@ -474,7 +474,7 @@ class Url
         }
 
         if(Common::isPhpCliMode()) {
-            die("If you were using a browser, Piwik would redirect you to this URL: $url \n\n");
+            throw new Exception("If you were using a browser, Piwik would redirect you to this URL: $url \n\n");
         }
         exit;
     }
diff --git a/core/Version.php b/core/Version.php
index 08bea8bdb5e058b1381f28b715b8723123a28c8e..c67cef15291d92748dd0c2ce977fb0fe756c23aa 100644
--- a/core/Version.php
+++ b/core/Version.php
@@ -21,5 +21,5 @@ final class Version
      * The current Piwik version.
      * @var string
      */
-    const VERSION = '2.4.0-b2';
+    const VERSION = '2.4.0-b3';
 }
diff --git a/misc/log-analytics/import_logs.py b/misc/log-analytics/import_logs.py
index 991ed401696d100a41b3d74b833c374ae65839de..632d7b69f230f97e5341ac86319633f0634bfbb3 100755
--- a/misc/log-analytics/import_logs.py
+++ b/misc/log-analytics/import_logs.py
@@ -1535,7 +1535,7 @@ class Parser(object):
 
         if not format:
             fatal_error("cannot automatically determine the log format using the first %d lines of the log file. " % limit +
-                        "\Maybe try specifying the format with the --log-format-name command line argument." )
+                        "\nMaybe try specifying the format with the --log-format-name command line argument." )
             return
 
         logging.debug('Format %s is the best match', format.name)
diff --git a/plugins/Installation/ServerFilesGenerator.php b/plugins/Installation/ServerFilesGenerator.php
index 255cea6314e1014410e88c5b9c9b3775bcf49c3a..3f0ece911434fee17ff617bf7e923b3562339e81 100644
--- a/plugins/Installation/ServerFilesGenerator.php
+++ b/plugins/Installation/ServerFilesGenerator.php
@@ -32,6 +32,10 @@ class ServerFilesGenerator
             "</Files>\n";
 
         $allowStaticAssets =
+            "# Serve HTML files as text/html mime type\n" .
+            "AddHandler text/html .html\n" .
+            "AddHandler text/html .htm\n\n" .
+
             "# Allow to serve static files which are safe\n" .
             "<Files ~ \"\\.(gif|ico|jpg|png|svg|js|css|htm|html|swf|mp3|mp4|wav|ogg|avi)$\">\n" .
                  $allow . "\n" .
@@ -74,7 +78,7 @@ class ServerFilesGenerator
      * @param bool $overwrite whether to overwrite an existing file or not
      * @param string $content
      */
-    public static function createHtAccess($path, $overwrite = true, $content)
+    protected static function createHtAccess($path, $overwrite = true, $content)
     {
         if (SettingsServer::isApache()) {
             $file = $path . '/.htaccess';
diff --git a/plugins/UserCountry/LocationProvider.php b/plugins/UserCountry/LocationProvider.php
index b1bef9defac5faa2dc7cc55c304157578ae4fd34..20754a20b523a31c4c0085a600ebf42141c315f4 100755
--- a/plugins/UserCountry/LocationProvider.php
+++ b/plugins/UserCountry/LocationProvider.php
@@ -30,8 +30,8 @@ require_once PIWIK_INCLUDE_PATH . '/plugins/UserCountry/LocationProvider/GeoIp.p
 /**
  * The base class of all LocationProviders.
  *
- * LocationProviders attempt to determine a visitor's location using other
- * visitor info. All LocationProviders require a visitor's IP address, some
+ * LocationProviders attempt to determine a visitor's location using
+ * visit information. All LocationProviders require a visitor's IP address, some
  * require more, such as the browser language.
  */
 abstract class LocationProvider
diff --git a/plugins/ZenMode/javascripts/zen-mode.js b/plugins/ZenMode/javascripts/zen-mode.js
index 846cd7b9e0daf2896b38d7e8d339d1a0209ba17d..ded2b3f74d2975204c25cdd73b57d060ca804c1f 100644
--- a/plugins/ZenMode/javascripts/zen-mode.js
+++ b/plugins/ZenMode/javascripts/zen-mode.js
@@ -102,22 +102,23 @@ $(document).ready(function () {
     }
 
     function overMainLI () {
-        var $this = $(this);
+        var $this    = $(this);
         var position = $this.position();
-        var width = $this.width();
-        var height = $this.height();
+        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'
+            top: (position.top + height) + 'px',
+            maxHeight: 'none',
         });
     }
 
     function outMainLI () {
-        $(this).find('ul').css({left: '', display: '', minWidth: '', position: '', top: ''});
+        $(this).find('ul').css({left: '', display: '', minWidth: '', position: '', top: '', maxHeight: ''});
     }
 
     function resetSubmenu()
diff --git a/tests/PHPUnit/UI b/tests/PHPUnit/UI
index b1077f442c581f26acefeb6103392976030d8d8e..4b93c616c6f81d03f5ea7bcae3ad909b77f29fb3 160000
--- a/tests/PHPUnit/UI
+++ b/tests/PHPUnit/UI
@@ -1 +1 @@
-Subproject commit b1077f442c581f26acefeb6103392976030d8d8e
+Subproject commit 4b93c616c6f81d03f5ea7bcae3ad909b77f29fb3