diff --git a/CHANGELOG b/CHANGELOG
index 68962f20d0b058d496dc35bfd252dfa73cc120bc..5b68a67050739bab9fe3c3936629a1dd4f18ef06 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -194,6 +194,7 @@ v 8.12.0
   - Remove prefixes from transition CSS property (ClemMakesApps)
   - Add Sentry logging to API calls
   - Add BroadcastMessage API
+  - Merge request tabs are fixed when scrolling page
   - Use 'git update-ref' for safer web commits !6130
   - Sort pipelines requested through the API
   - Automatically expand hidden discussions when accessed by a permalink !5585 (Mike Greiling)
diff --git a/app/assets/javascripts/merge_request_tabs.js b/app/assets/javascripts/merge_request_tabs.js
index bec11a198a1cfaa50177e72e401fbfc0ee913c82..f685af7d97e567fd045404229ece6f062b2aa7e4 100644
--- a/app/assets/javascripts/merge_request_tabs.js
+++ b/app/assets/javascripts/merge_request_tabs.js
@@ -68,6 +68,7 @@
       this._location = location;
       this.bindEvents();
       this.activateTab(this.opts.action);
+      this.initAffix();
     }
 
     MergeRequestTabs.prototype.bindEvents = function() {
@@ -367,6 +368,43 @@
     // Only when sidebar is collapsed
     };
 
+    MergeRequestTabs.prototype.initAffix = function () {
+      // Screen space on small screens is usually very sparse
+      // So we dont affix the tabs on these
+      if (Breakpoints.get().getBreakpointSize() === 'xs') return;
+
+      var $tabs = $('.js-tabs-affix'),
+          tabsWidth = $tabs.outerWidth(),
+          $diffTabs = $('#diff-notes-app'),
+          offsetTop = $tabs.offset().top - ($('.navbar-fixed-top').height() + $('.layout-nav').height());
+
+      $tabs.off('affix.bs.affix affix-top.bs.affix')
+        .affix({
+          offset: offsetTop
+        }).on('affix.bs.affix', function () {
+          $tabs.css({
+            left: $tabs.offset().left,
+            width: tabsWidth
+          });
+          $diffTabs.css({
+            marginTop: $tabs.height()
+          });
+        }).on('affix-top.bs.affix', function () {
+          $tabs.css({
+            left: '',
+            width: ''
+          });
+          $diffTabs.css({
+            marginTop: ''
+          });
+        });
+
+      // Fix bug when reloading the page already scrolling
+      if ($tabs.hasClass('affix')) {
+        $tabs.trigger('affix.bs.affix');
+      }
+    };
+
     return MergeRequestTabs;
 
   })();
diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss
index bc8693ae467f7649f1ab19781fdcaba47a4155e1..d01aaa4be51c12f3654c27326d9e4e339b7c4d9d 100644
--- a/app/assets/stylesheets/pages/merge_requests.scss
+++ b/app/assets/stylesheets/pages/merge_requests.scss
@@ -421,3 +421,12 @@
     margin-bottom: 20px;
   }
 }
+
+.merge-request-tabs {
+  background-color: #fff;
+
+  &.affix {
+    top: 100px;
+    z-index: 9;
+  }
+}
diff --git a/app/views/projects/merge_requests/_show.html.haml b/app/views/projects/merge_requests/_show.html.haml
index 9f34ca9ff4e8b041d64fc5ec842ce63404b26b85..351c9d6ff9171dd5454e78e51ac35c0caba038a3 100644
--- a/app/views/projects/merge_requests/_show.html.haml
+++ b/app/views/projects/merge_requests/_show.html.haml
@@ -47,7 +47,7 @@
           = link_to "command line", "#modal_merge_info", class: "how_to_merge_link vlink", title: "How To Merge", "data-toggle" => "modal"
 
     - if @commits_count.nonzero?
-      %ul.merge-request-tabs.nav-links.no-top.no-bottom
+      %ul.merge-request-tabs.nav-links.no-top.no-bottom.js-tabs-affix
         %li.notes-tab
           = link_to namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: 'div#notes', action: 'notes', toggle: 'tab' } do
             Discussion
diff --git a/spec/features/merge_requests/sticky_tabs_spec.rb b/spec/features/merge_requests/sticky_tabs_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6f8c3dc55f4e992aec7731b4bab0d3b047ba2ee3
--- /dev/null
+++ b/spec/features/merge_requests/sticky_tabs_spec.rb
@@ -0,0 +1,26 @@
+require 'spec_helper'
+
+feature 'Merge request tabs', js: true, feature: true do
+  let(:user)          { create(:user) }
+  let(:project)       { create(:project, :public) }
+  let(:merge_request) { create(:merge_request_with_diffs, source_project: project, author: user, title: "Bug NS-04") }
+
+  before do
+    project.team << [user, :master]
+    login_as user
+    visit diffs_namespace_project_merge_request_path(project.namespace, project, merge_request)
+  end
+
+  it 'affixes to top of page when scrolling' do
+    page.execute_script "window.scrollBy(0,10000)"
+    expect(page).to have_selector('.js-tabs-affix.affix')
+  end
+
+  it 'removes affix when scrolling to top' do
+    page.execute_script "window.scrollBy(0,10000)"
+    expect(page).to have_selector('.js-tabs-affix.affix')
+
+    page.execute_script "window.scrollBy(0,-10000)"
+    expect(page).to have_selector('.js-tabs-affix.affix-top')
+  end
+end