diff --git a/src/app/controllers/row.js b/src/app/controllers/row.js
index 07f7b0d8b17af70c1ccfab37ff7fea8835be7638..de5ff8c6132b60dcbf2465ee3c552602787fcd99 100644
--- a/src/app/controllers/row.js
+++ b/src/app/controllers/row.js
@@ -58,6 +58,11 @@ function (angular, app, _) {
         $scope.row.panels.push(panel);
       };
 
+      $scope.duplicate_panel = function(panel) {
+        var clone = angular.copy(panel);
+        $scope.row.panels.push(clone);
+      };
+
       /** @scratch /panels/0
        * [[panels]]
        * = Panels
diff --git a/src/app/directives/kibanaPanel.js b/src/app/directives/kibanaPanel.js
index 4203246f8013382e65ffdd4af9f9b54be2110218..5948912e1caadcf5ac99a8e3a6b64f0675d93aea 100644
--- a/src/app/directives/kibanaPanel.js
+++ b/src/app/directives/kibanaPanel.js
@@ -47,6 +47,11 @@ function (angular,$) {
               '<i class="icon-cog pointer" bs-tooltip="\'Configure\'"></i></span>'+
             '</span>' +
 
+            '<span class="row-button extra" ng-show="panel.editable != false">' +
+              '<span ng-click="duplicate_panel(panel)" class="pointer">'+
+              '<i class="icon-copy pointer" bs-tooltip="\'Duplicate\'"></i></span>'+
+            '</span>' +
+
             '<span ng-repeat="task in panelMeta.modals" class="row-button extra" ng-show="task.show">' +
               '<span bs-modal="task.partial" class="pointer"><i ' +
                 'bs-tooltip="task.description" ng-class="task.icon" class="pointer"></i></span>'+