diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb
index 97466d532f4bde6056f83c32b39047f159e6772a..eca4ba695a10ad7fb5817c0727adfcdc8902da22 100644
--- a/app/helpers/diff_helper.rb
+++ b/app/helpers/diff_helper.rb
@@ -128,4 +128,26 @@ module DiffHelper
       title
     end
   end
+
+  def hide_whitespaces?
+    params[:w] == '1'
+  end
+
+  def params_with_whitespace
+    hide_whitespaces? ? request.query_parameters.except(:w) : request.query_parameters.merge(w: 1)
+  end
+
+  def toggle_whitespace_link(url)
+    link_to "#{hide_whitespaces? ? 'Show' : 'Hide'} whitespace changes", url, class: "btn btn-default"
+  end
+
+  def commit_diff_whitespace_link(project, commit)
+    url = namespace_project_commit_path(project.namespace, project, commit.id, params_with_whitespace)
+    toggle_whitespace_link(url)
+  end
+
+  def diff_merge_request_whitespace_link(project, merge_request)
+    url = diffs_namespace_project_merge_request_path(project.namespace, project, merge_request, params_with_whitespace)
+    toggle_whitespace_link(url)
+  end
 end
diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml
index eaab99973a4f1776ed6bb18a19ce669eb25dd9ac..fbfff9bc895de5b32565a28b7e56f4aa3ada00fd 100644
--- a/app/views/projects/diffs/_diffs.html.haml
+++ b/app/views/projects/diffs/_diffs.html.haml
@@ -5,6 +5,10 @@
 
 .content-block.oneline-block.files-changed
   .inline-parallel-buttons
+    - if current_controller?(:commit)
+      = commit_diff_whitespace_link(@project, @commit)
+    - if current_controller?(:merge_requests)
+      = diff_merge_request_whitespace_link(@project, @merge_request)
     .btn-group
       = inline_diff_btn
       = parallel_diff_btn