diff --git a/src/components/updatemenus/draw.js b/src/components/updatemenus/draw.js
index 39abd0fcf11..1ef44e1294b 100644
--- a/src/components/updatemenus/draw.js
+++ b/src/components/updatemenus/draw.js
@@ -299,6 +299,8 @@ function drawButtons(gd, gHeader, gButton, menuOpts) {
             setActive(gd, menuOpts, buttonOpts, gHeader, gButton, buttonIndex);
 
             Plots.executeAPICommand(gd, buttonOpts.method, buttonOpts.args);
+
+            gd.emit('plotly_buttonclicked', {menu: menuOpts, button: buttonOpts, active: menuOpts.active});
         });
 
         button.on('mouseover', function() {
diff --git a/test/jasmine/tests/updatemenus_test.js b/test/jasmine/tests/updatemenus_test.js
index 02400345e9a..77afe12a5e5 100644
--- a/test/jasmine/tests/updatemenus_test.js
+++ b/test/jasmine/tests/updatemenus_test.js
@@ -380,6 +380,31 @@ describe('update menus interactions', function() {
         });
     });
 
+    it('should emit an event on button click', function(done) {
+        var clickCnt = 0;
+        var data = [];
+        gd.on('plotly_buttonclicked', function(datum) {
+            data.push(datum);
+            clickCnt++;
+        });
+
+        click(selectHeader(0)).then(function() {
+            expect(clickCnt).toEqual(0);
+
+            return click(selectButton(2));
+        }).then(function() {
+            expect(clickCnt).toEqual(1);
+            expect(data.length).toEqual(1);
+            expect(data[0].active).toEqual(2);
+
+            return click(selectButton(1));
+        }).then(function() {
+            expect(clickCnt).toEqual(2);
+            expect(data.length).toEqual(2);
+            expect(data[1].active).toEqual(1);
+        }).catch(fail).then(done);
+    });
+
     it('should apply update on button click', function(done) {
         var header0 = selectHeader(0),
             header1 = selectHeader(1);