diff --git a/plugins/Actions/Actions.php b/plugins/Actions/Actions.php
index 557e4c77b87cc519d1188799928ce8b7c0628d0b..dfd773bea4ff8f6095ef6e2a8294e264f9d98bc0 100644
--- a/plugins/Actions/Actions.php
+++ b/plugins/Actions/Actions.php
@@ -105,6 +105,7 @@ class Actions extends \Piwik\Plugin
     public function getJsFiles(&$jsFiles)
     {
         $jsFiles[] = "plugins/Actions/javascripts/actionsDataTable.js";
+        $jsFiles[] = "plugins/Actions/javascripts/rowactions.js";
     }
 
     public function isSiteSearchEnabled($idSites, $idSite)
diff --git a/plugins/Actions/javascripts/rowactions.js b/plugins/Actions/javascripts/rowactions.js
new file mode 100644
index 0000000000000000000000000000000000000000..33050b90edf1f37790260fff863c1912e7518a46
--- /dev/null
+++ b/plugins/Actions/javascripts/rowactions.js
@@ -0,0 +1,65 @@
+$(function () {
+
+    function isActionsModule(params)
+    {
+        return params.module == 'Actions';
+    }
+
+    function isPageUrlReport(params) {
+        var action = params.action;
+
+        return isActionsModule(params) &&
+            (action == 'getPageUrls' || action == 'getEntryPageUrls' || action == 'getExitPageUrls' || action == 'getPageUrlsFollowingSiteSearch');
+    };
+
+    function isPageTitleReport(params) {
+        var action = params.action;
+
+        return isActionsModule(params) && (action == 'getPageTitles' || action == 'getPageTitlesFollowingSiteSearch');
+    };
+
+    function getLinkForTransitionAndOverlayPopover(tr)
+    {
+        var link = tr.find('> td:first > a').attr('href');
+        link = $('<textarea>').html(link).val(); // remove html entities
+        return link;
+    }
+
+    DataTable_RowActions_Transitions.registerReport({
+        isAvailableOnReport: function (dataTableParams) {
+            return isPageUrlReport(dataTableParams);
+        },
+        isAvailableOnRow: function (dataTableParams, tr) {
+            return isPageUrlReport(dataTableParams) && tr.find('> td:first span.label').parent().is('a')
+        },
+        trigger: function (tr, e, subTableLabel) {
+            var link = getLinkForTransitionAndOverlayPopover(tr);
+            this.openPopover('url:' + link);
+        }
+    });
+
+    DataTable_RowActions_Transitions.registerReport({
+        isAvailableOnReport: function (dataTableParams) {
+            return isPageTitleReport(dataTableParams);
+        },
+        isAvailableOnRow: function (dataTableParams, tr) {
+            return isPageTitleReport(dataTableParams);
+        },
+        trigger: function (tr, e, subTableLabel) {
+            DataTable_RowAction.prototype.trigger.apply(this, [tr, e, subTableLabel]);
+        }
+    });
+
+    DataTable_RowActions_Overlay.registerReport({
+        isAvailableOnReport: function (dataTableParams) {
+            return isPageUrlReport(dataTableParams);
+        },
+        onClick: function (actionA, tr, e) {
+            return {
+                link: getLinkForTransitionAndOverlayPopover(tr),
+                segment: null
+            }
+        }
+    });
+
+});
\ No newline at end of file
diff --git a/plugins/Overlay/javascripts/rowaction.js b/plugins/Overlay/javascripts/rowaction.js
index 8f11c736d02dd973d4060a2aa163e366f7be5ebe..de063b990e14ac57028c5f9e1abc32d4ecc0a812 100644
--- a/plugins/Overlay/javascripts/rowaction.js
+++ b/plugins/Overlay/javascripts/rowaction.js
@@ -15,39 +15,47 @@ function DataTable_RowActions_Overlay(dataTable) {
 
 DataTable_RowActions_Overlay.prototype = new DataTable_RowAction;
 
+DataTable_RowActions_Overlay.registeredReports = [];
+DataTable_RowActions_Overlay.registerReport = function (handler) {
+    DataTable_RowActions_Overlay.registeredReports.push(handler);
+}
+
+
 DataTable_RowActions_Overlay.prototype.onClick = function (actionA, tr, e) {
     if (!actionA.data('overlay-manipulated')) {
         actionA.data('overlay-manipulated', 1);
 
         var segment, link;
 
-        if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(this.dataTable.param)) {
-
-            link = this.getLabelFromTr(tr);
-            if (link && link.substr(0, 1) === '@') {
-                link = link.substr(1);
+        var i = 0;
+        for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) {
+            var report = DataTable_RowActions_Overlay.registeredReports[i];
+            if (report
+                && report.onClick
+                && report.isAvailableOnReport
+                && report.isAvailableOnReport(this.dataTable.param)) {
+                var result = report.onClick.apply(this, arguments);
+
+                if (!result || !result.link) {
+                    return;
+                }
+
+                link = result.link;
+                if (result.segment) {
+                    segment = result.segment;
+                }
+                break;
             }
-
-            link = 'http://' + unescape(link);
-
-            var subtable = tr.closest('table');
-            if (subtable.is('.subDataTable')) {
-                var prev = subtable.closest('tr').prev();
-                segment = prev.attr('data-segment-filter');
-            }
-        } else {
-
-            link = tr.find('> td:first > a').attr('href');
-            link = $('<textarea>').html(link).val(); // remove html entities
         }
 
+        if (link) {
+            var href = Overlay_Helper.getOverlayLink(this.dataTable.param.idSite, 'month', 'today', segment, link);
 
-        var href = Overlay_Helper.getOverlayLink(this.dataTable.param.idSite, 'month', 'today', segment, link);
-
-        actionA.attr({
-            target: '_blank',
-            href: href
-        });
+            actionA.attr({
+                target: '_blank',
+                href: href
+            });
+        }
     }
 
     return true;
@@ -77,11 +85,17 @@ DataTable_RowActions_Registry.register({
             return false;
         }
 
-        if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams)) {
-            return true;
+        var i = 0;
+        for (i; i < DataTable_RowActions_Overlay.registeredReports.length; i++) {
+            var report = DataTable_RowActions_Overlay.registeredReports[i];
+            if (report
+                && report.isAvailableOnReport
+                && report.isAvailableOnReport(dataTableParams)) {
+                return true;
+            }
         }
 
-        return DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action);
+        return false;
     },
 
     isAvailableOnRow: function (dataTableParams, tr) {
diff --git a/plugins/Transitions/javascripts/transitions.js b/plugins/Transitions/javascripts/transitions.js
index a11f6860c617768ea909785f9c97e8242b2950e8..20a4e7febffb67fd9f9772b432910cc3c334939b 100644
--- a/plugins/Transitions/javascripts/transitions.js
+++ b/plugins/Transitions/javascripts/transitions.js
@@ -30,44 +30,25 @@ DataTable_RowActions_Transitions.isPageTitleReport = function (module, action) {
     return module == 'Actions' && (action == 'getPageTitles' || action == 'getPageTitlesFollowingSiteSearch');
 };
 
-DataTable_RowActions_Transitions.isActionCustomDimensionReport = function (params) {
-    return params.module == 'CustomDimensions' && params.action == 'getCustomDimension' && params.scopeOfDimension && params.scopeOfDimension === 'action';
-};
+DataTable_RowActions_Transitions.registeredReports = [];
+DataTable_RowActions_Transitions.registerReport = function (handler) {
+    DataTable_RowActions_Transitions.registeredReports.push(handler);
+}
 
 DataTable_RowActions_Transitions.prototype.trigger = function (tr, e, subTableLabel) {
-    var link = tr.find('> td:first > a').attr('href');
-    link = $('<textarea>').html(link).val(); // remove html entities
-
-    var module = this.dataTable.param.module;
-    var action = this.dataTable.param.action;
-    if (DataTable_RowActions_Transitions.isPageUrlReport(module, action)) {
-        this.openPopover('url:' + link);
-    } else if (DataTable_RowActions_Transitions.isPageTitleReport(module, action)) {
-        DataTable_RowAction.prototype.trigger.apply(this, [tr, e, subTableLabel]);
-    } else if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(this.dataTable.param)) {
-
-        var label = this.getLabelFromTr(tr);
-        if (label && label.substr(0, 1) === '@') {
-            label = label.substr(1);
-        }
-
-        var subtable = tr.closest('table');
-        if (subtable.is('.subDataTable')) {
-            var prev = subtable.closest('tr').prev();
-            var segment = prev.attr('data-segment-filter');
-            if (segment) {
-                label = unescape(label);
-                if (this.transitions === null) {
-                    this.transitions = new Piwik_Transitions('url', label, this, segment);
-                } else {
-                    this.transitions.reset('url', label, segment);
-                }
-                this.transitions.showPopover();
-            }
+    var i = 0;
+    for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) {
+        var report = DataTable_RowActions_Transitions.registeredReports[i];
+        if (report
+            && report.trigger
+            && report.isAvailableOnReport
+            && report.isAvailableOnReport(this.dataTable.param)) {
+            report.trigger.apply(this, arguments);
+            return;
         }
-    } else {
-        alert('Transitions can\'t be used on this report.');
     }
+
+    alert('Transitions can\'t be used on this report.');
 };
 
 DataTable_RowActions_Transitions.prototype.performAction = function (label, tr, e) {
@@ -118,11 +99,17 @@ DataTable_RowActions_Registry.register({
     },
 
     isAvailableOnReport: function (dataTableParams) {
-        return (
-            DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action) ||
-                DataTable_RowActions_Transitions.isPageTitleReport(dataTableParams.module, dataTableParams.action) ||
-                DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams)
-            );
+        var i = 0;
+        for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) {
+            var report = DataTable_RowActions_Transitions.registeredReports[i];
+            if (report
+                && report.isAvailableOnReport
+                && report.isAvailableOnReport(dataTableParams)) {
+                return true;
+            }
+        }
+
+        return false;
     },
 
     isAvailableOnRow: function (dataTableParams, tr) {
@@ -130,16 +117,18 @@ DataTable_RowActions_Registry.register({
             // not available on groups (i.e. folders)
             return false;
         }
-        if (DataTable_RowActions_Transitions.isPageUrlReport(dataTableParams.module, dataTableParams.action)
-            && !tr.find('> td:first span.label').parent().is('a')) {
-            // not on page url without link (i.e. "Page URL not defined")
-            return false;
-        }
-        if (DataTable_RowActions_Transitions.isActionCustomDimensionReport(dataTableParams)
-            && !tr.parents('table').first().hasClass('subDataTable')) {
-            // only show it in subtables of custom dimensions
-            return false;
+
+        var i = 0;
+        for (i; i < DataTable_RowActions_Transitions.registeredReports.length; i++) {
+            var report = DataTable_RowActions_Transitions.registeredReports[i];
+            if (report
+                && report.isAvailableOnRow
+                && report.isAvailableOnReport
+                && report.isAvailableOnReport(dataTableParams)) {
+                return report.isAvailableOnRow(dataTableParams, tr);
+            }
         }
+
         return true;
     }