diff --git a/CHANGELOG b/CHANGELOG
index a215d794670bc7ab91de2f165a6a0fbc922bef95..bb5bde9b08b82824d47efc5f3cf3270af3820d66 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -77,6 +77,7 @@ v 8.9.0 (unreleased)
   - RepositoryCheck::SingleRepositoryWorker public and private methods are now instrumented
   - Improve issuables APIs performance when accessing notes !4471
   - External links now open in a new tab
+  - Prevent default actions of disabled buttons and links
   - Markdown editor now correctly resets the input value on edit cancellation !4175
   - Toggling a task list item in a issue/mr description does not creates a Todo for mentions
   - Improved UX of date pickers on issue & milestone forms
diff --git a/app/assets/javascripts/application.js.coffee b/app/assets/javascripts/application.js.coffee
index 69d4c4f5dd37f2bdd83c4a9ee4bb2aaa7f58d62b..6c16f89cef65b8eedebaa313e01bb16eee533d2a 100644
--- a/app/assets/javascripts/application.js.coffee
+++ b/app/assets/javascripts/application.js.coffee
@@ -125,6 +125,7 @@ window.onload = ->
     setTimeout shiftWindow, 100
 
 $ ->
+  gl.utils.preventDisabledButtons()
   bootstrapBreakpoint = bp.getBreakpointSize()
 
   $(".nicescroll").niceScroll(cursoropacitymax: '0.4', cursorcolor: '#FFF', cursorborder: "1px solid #FFF")
diff --git a/app/assets/javascripts/lib/common_utils.js.coffee b/app/assets/javascripts/lib/common_utils.js.coffee
index 5e3a802f45f759b8cb621effec38f4d40714ff30..4f1779b8483d3c0f13eb7e21f6c37e22f09a6c1c 100644
--- a/app/assets/javascripts/lib/common_utils.js.coffee
+++ b/app/assets/javascripts/lib/common_utils.js.coffee
@@ -32,5 +32,12 @@
       .attr    'title', newTitle
       .tooltip 'fixTitle'
 
+  gl.utils.preventDisabledButtons = ->
+
+    $('.btn').click (e) ->
+      if $(this).hasClass 'disabled'
+        e.preventDefault()
+        e.stopImmediatePropagation()
+        return false
 
 ) window
diff --git a/spec/javascripts/application_spec.js.coffee b/spec/javascripts/application_spec.js.coffee
new file mode 100644
index 0000000000000000000000000000000000000000..8af39c41f2f5a93d718050ad83e38973c37dad89
--- /dev/null
+++ b/spec/javascripts/application_spec.js.coffee
@@ -0,0 +1,30 @@
+#= require lib/common_utils
+
+describe 'Application', ->
+  describe 'disable buttons', ->
+    fixture.preload('application.html')
+
+    beforeEach ->
+      fixture.load('application.html')
+
+    it 'should prevent default action for disabled buttons', ->
+
+      gl.utils.preventDisabledButtons()
+
+      isClicked = false
+      $button   = $ '#test-button'
+
+      $button.click -> isClicked = true
+      $button.trigger 'click'
+
+      expect(isClicked).toBe false
+
+
+    it 'should be on the same page if a disabled link clicked', ->
+
+      locationBeforeLinkClick = window.location.href
+      gl.utils.preventDisabledButtons()
+
+      $('#test-link').click()
+
+      expect(window.location.href).toBe locationBeforeLinkClick
diff --git a/spec/javascripts/fixtures/application.html.haml b/spec/javascripts/fixtures/application.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..3fc6114407d6197bf74c959228d4d0ca96a55e9c
--- /dev/null
+++ b/spec/javascripts/fixtures/application.html.haml
@@ -0,0 +1,2 @@
+%a#test-link.btn.disabled{:href => "/foo"} Test link
+%button#test-button.btn.disabled Test Button