diff --git a/core/Tracker/TableLogAction.php b/core/Tracker/TableLogAction.php
index b7ec978876eb4a24ba3af8a111e20ddee9f44ff2..25deaad0cd920715fa508537b57efdd5600f8724 100644
--- a/core/Tracker/TableLogAction.php
+++ b/core/Tracker/TableLogAction.php
@@ -233,6 +233,15 @@ class TableLogAction
      */
     private static function guessActionTypeFromSegment($segmentName)
     {
+        $exactMatch = array(
+            'eventAction' => Action::TYPE_EVENT_ACTION,
+            'eventCategory' => Action::TYPE_EVENT_CATEGORY,
+            'eventName' => Action::TYPE_EVENT_NAME,
+        );
+        if(!empty($exactMatch[$segmentName])) {
+            return $exactMatch[$segmentName];
+        }
+
         if (stripos($segmentName, 'pageurl') !== false) {
             $actionType = Action::TYPE_PAGE_URL;
             return $actionType;
@@ -243,7 +252,7 @@ class TableLogAction
             $actionType = Action::TYPE_SITE_SEARCH;
             return $actionType;
         } else {
-            throw new \Exception(" The segment $segmentName has an unexpected value.");
+            throw new \Exception("We cannot guess the action type from the segment $segmentName.");
         }
     }
 
diff --git a/lang/en.json b/lang/en.json
index 981aac3ffeeab0cd616a9acbd6b8c7a9e9a1c9a8..83a340a55dfdcb82f0482d00993e476deb95b120 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -2310,5 +2310,14 @@
         "LoadingSegmentedDataMayTakeSomeTime": "Processing segmented visitor data may take a few minutes...",
         "AutoArchiveRealTime": "segmented reports are processed in real time",
         "AutoArchivePreProcessed": "segmented reports are pre-processed (faster, requires archive.php cron)"
+    },
+    "Events": {
+        "Events": "Events",
+        "EventCategory": "Event Category",
+        "EventAction": "Event Action",
+        "EventName": "Event Name",
+        "EventValue": "Event Value",
+        "NbEvents": "Number of Events",
+        "": ""
     }
 }
diff --git a/plugins/API/API.php b/plugins/API/API.php
index 30e11f0fcb58a680d216e769cf6d952787625f4b..deda5cb0fba2278fb27251b227e89225809430f3 100644
--- a/plugins/API/API.php
+++ b/plugins/API/API.php
@@ -291,7 +291,7 @@ class API extends \Piwik\Plugin\API
 
     private function sortSegments($row1, $row2)
     {
-        $columns = array('type', 'category', 'name', 'segment');
+        $columns = array('category', 'name', 'segment');
         foreach ($columns as $column) {
             // Keep segments ordered alphabetically inside categories..
             $type = -1;
diff --git a/plugins/API/Controller.php b/plugins/API/Controller.php
index e82d1923c0cc9b4adcd817ea7d91b36f91f7f5dc..8e8842858da22bb8693f5eb0cfeb7a17004030c8 100644
--- a/plugins/API/Controller.php
+++ b/plugins/API/Controller.php
@@ -15,6 +15,7 @@ use Piwik\API\Proxy;
 use Piwik\API\Request;
 use Piwik\Common;
 use Piwik\Config;
+use Piwik\Piwik;
 use Piwik\View;
 
 /**
@@ -58,6 +59,12 @@ class Controller extends \Piwik\Plugin\Controller
         $customVariables = 0;
         $lastCategory = array();
         foreach ($segments as $segment) {
+            // Eg. Event Value is a metric, not in the Visit metric category,
+            // we make sure it is displayed along with the Events dimensions
+            if($segment['type'] == 'metric' && $segment['category'] != Piwik::translate('General_Visit')) {
+                $segment['type'] = 'dimension';
+            }
+
             $onlyDisplay = array('customVariableName1', 'customVariableName2', 'customVariableValue1', 'customVariableValue2', 'customVariablePageName1', 'customVariablePageValue1');
             $customVariableWillBeDisplayed = in_array($segment['segment'], $onlyDisplay);
             // Don't display more than 4 custom variables name/value rows
diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index fa59748bb0b98836e228dcf96ce19089e14a19d5..f15e82ce07cc456c2bcb918e6c8f6945074ab16a 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -64,7 +64,7 @@ class Actions extends \Piwik\Plugin
 
     public function getSegmentsMetadata(&$segments)
     {
-        $sqlFilter = 'TableLogAction::getIdActionFromSegment';
+        $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
 
         // entry and exit pages of visit
         $segments[] = array(
diff --git a/plugins/Events/Events.php b/plugins/Events/Events.php
new file mode 100644
index 0000000000000000000000000000000000000000..d703066637f23f56ac77b9788275a69edc8ba907
--- /dev/null
+++ b/plugins/Events/Events.php
@@ -0,0 +1,75 @@
+<?php
+/**
+ * Piwik - Open source web analytics
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ * @category Piwik_Plugins
+ * @package Events
+ */
+namespace Piwik\Plugins\Events;
+
+use Piwik\Piwik;
+use Piwik\Plugin;
+
+/**
+ * @package Events
+ */
+class Events extends Plugin
+{
+    /**
+     * @see Piwik\Plugin::getListHooksRegistered
+     */
+    public function getListHooksRegistered()
+    {
+        return array(
+            'API.getSegmentsMetadata'         => 'getSegmentsMetadata',
+        );
+    }
+
+    public function getSegmentsMetadata(&$segments)
+    {
+        $sqlFilter = '\\Piwik\\Tracker\\TableLogAction::getIdActionFromSegment';
+
+        $segments[] = array(
+            'type'       => 'dimension',
+            'category'   => 'Events_Events',
+            'name'       => 'Events_EventCategory',
+            'segment'    => 'eventCategory',
+            'sqlSegment' => 'log_link_visit_action.idaction_event_category',
+            'sqlFilter'  => $sqlFilter,
+        );
+        $segments[] = array(
+            'type'       => 'dimension',
+            'category'   => 'Events_Events',
+            'name'       => 'Events_EventAction',
+            'segment'    => 'eventAction',
+            'sqlSegment' => 'log_link_visit_action.idaction_event_action',
+            'sqlFilter'  => $sqlFilter,
+        );
+        $segments[] = array(
+            'type'       => 'dimension',
+            'category'   => 'Events_Events',
+            'name'       => 'Events_EventName',
+            'segment'    => 'eventName',
+            'sqlSegment' => 'log_link_visit_action.idaction_name',
+            'sqlFilter'  => $sqlFilter,
+        );
+        $segments[] = array(
+            'type'       => 'metric',
+            'category'   => 'Events_Events',
+            'name'       => 'Events_EventValue',
+            'segment'    => 'eventValue',
+            'sqlSegment' => 'log_link_visit_action.custom_float'
+        );
+        $segments[] = array(
+            'type'           => 'metric',
+            'category'       => Piwik::translate('General_Visit'),
+            'name'           => 'Events_NbEvents',
+            'segment'        => 'events',
+            'sqlSegment'     => 'log_visit.visit_total_events',
+            'acceptedValues' => 'To select all visits who triggered an Event, use: &segment=events>0',
+        );
+    }
+}
diff --git a/plugins/Events/plugin.json b/plugins/Events/plugin.json
new file mode 100644
index 0000000000000000000000000000000000000000..908441b7b5830171db368257b04288bb0eafcec7
--- /dev/null
+++ b/plugins/Events/plugin.json
@@ -0,0 +1,6 @@
+{
+ "name": "Events",
+ "version": "1.0",
+ "description": "Track Custom Events and get reports on your visitors activity.",
+ "theme": false
+}
\ No newline at end of file
diff --git a/tests/PHPUnit/Integration/CustomEventsTest.php b/tests/PHPUnit/Integration/CustomEventsTest.php
index 8ab5b8e06be3e3d69084f945fb4a590e4639b1e4..e2d64d161e645830bcd0a606b93c57a80efa7ad6 100644
--- a/tests/PHPUnit/Integration/CustomEventsTest.php
+++ b/tests/PHPUnit/Integration/CustomEventsTest.php
@@ -53,6 +53,32 @@ class Test_Piwik_Integration_CustomEvents extends IntegrationTestCase
                 'periods'      => $periods,
                 'setDateLastN' => false,
                 'testSuffix'   => '')),
+
+            array('Actions.getPageUrls', array(
+                'idSite'       => $idSite1,
+                'date'         => $dateTime,
+                'periods'      => $dayPeriod,
+                'segment'      => "events>0",
+                'setDateLastN' => false,
+                'testSuffix'   => '')
+            ),
+            // FIXMEA: Add Events.get* here
+            array('Actions.getPageUrls', array(
+                'idSite'       => $idSite1,
+                'date'         => $dateTime,
+                'periods'      => $dayPeriod,
+                'segment'      => "eventCategory==Movie,eventName==".urlencode('La fiancée de l\'eau'),
+                'setDateLastN' => false,
+                'testSuffix'   => '_eventCategoryOrNameMatch')
+            ),
+            array('Actions.getPageUrls', array(
+                'idSite'       => $idSite1,
+                'date'         => $dateTime,
+                'periods'      => $dayPeriod,
+                'segment'      => "eventAction=@play",
+                'setDateLastN' => false,
+                'testSuffix'   => '_eventActionContainsPlay')
+            ),
         );
 
         // testing metadata API for one metadata report