diff --git a/CHANGELOG b/CHANGELOG
index 979c9e6e30d5d63ef008b4682cced53ffd22fd33..5c735bd1420a13a362aec33a44d4c3b334bf44f3 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -6,6 +6,7 @@ v 8.10.0 (unreleased)
   - Wrap code blocks on Activies and Todos page. !4783 (winniehell)
   - Display last commit of deleted branch in push events !4699 (winniehell)
   - Add Sidekiq queue duration to transaction metrics.
+  - Let Workhorse serve format-patch diffs
   - Make images fit to the size of the viewport !4810
   - Fix check for New Branch button on Issue page !4630 (winniehell)
   - Fix MR-auto-close text added to description. !4836
diff --git a/GITLAB_WORKHORSE_VERSION b/GITLAB_WORKHORSE_VERSION
index 8bd6ba8c5c366585c0343c027cb738d5fdeb8d4d..879be8a98fc7a080771e966eb405fca1b40108de 100644
--- a/GITLAB_WORKHORSE_VERSION
+++ b/GITLAB_WORKHORSE_VERSION
@@ -1 +1 @@
-0.7.5
+0.7.7
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 39c8ba40ca25e6b43b110be0e27ca2030d9ce6a0..dd86b940a08c62ae61e011ab4cb45b42854ad823 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -59,7 +59,13 @@ class Projects::MergeRequestsController < Projects::ApplicationController
     respond_to do |format|
       format.html
       format.json   { render json: @merge_request }
-      format.patch  { render text: @merge_request.to_patch }
+      format.patch  do
+        headers.store(*Gitlab::Workhorse.send_git_patch(@project.repository,
+                                                        @merge_request.diff_base_commit.id,
+                                                        @merge_request.last_commit.id))
+        headers['Content-Disposition'] = 'inline'
+        head :ok
+      end
       format.diff do
         return render_404 unless @merge_request.diff_refs
 
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index f5c5b7c13065920ad3f34b436fe96f9b149873be..53d9aa588af8bba38d0279f7ac4d50774f686606 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -319,13 +319,6 @@ class MergeRequest < ActiveRecord::Base
     )
   end
 
-  # Returns the commit as a series of email patches.
-  #
-  # see "git format-patch"
-  def to_patch
-    target_project.repository.format_patch(diff_base_commit.sha, source_sha)
-  end
-
   def hook_attrs
     attrs = {
       source: source_project.try(:hook_attrs),
diff --git a/lib/gitlab/workhorse.rb b/lib/gitlab/workhorse.rb
index 40e8299c36b36d5ba5e430eb11371c1d786e66be..ef1241f8600a883399df294662e592414fa34cc4 100644
--- a/lib/gitlab/workhorse.rb
+++ b/lib/gitlab/workhorse.rb
@@ -52,6 +52,19 @@ module Gitlab
         ]
       end
 
+      def send_git_patch(repository, from, to)
+        params = {
+          'RepoPath'  => repository.path_to_repo,
+          'ShaFrom'   => from,
+          'ShaTo'     => to
+        }
+
+        [
+          SEND_DATA_HEADER,
+          "git-format-patch:#{encode(params)}"
+        ]
+      end
+
       protected
 
       def encode(hash)
diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb
index 1cc35c66c8fdcdce7b9540edc04d1bc58bbd2c20..74c050f48f1b80e4af72bb9048e3ae498fc65be4 100644
--- a/spec/controllers/projects/merge_requests_controller_spec.rb
+++ b/spec/controllers/projects/merge_requests_controller_spec.rb
@@ -96,26 +96,14 @@ describe Projects::MergeRequestsController do
     end
 
     describe "as patch" do
-      include_examples "export merge as", :patch
-      let(:format) { :patch }
-
-      it "should really be a git email patch with commit" do
-        get(:show,
-            namespace_id: project.namespace.to_param,
-            project_id: project.to_param,
-            id: merge_request.iid, format: format)
-
-        expect(response.body[0..100]).to start_with("From #{merge_request.commits.last.id}")
-      end
-
-      it "should contain git diffs" do
+      it 'triggers workhorse to serve the request' do
         get(:show,
             namespace_id: project.namespace.to_param,
             project_id: project.to_param,
             id: merge_request.iid,
-            format: format)
+            format: :patch)
 
-        expect(response.body).to match(/^diff --git/)
+        expect(response.headers['Gitlab-Workhorse-Send-Data']).to start_with("git-format-patch:")
       end
     end
   end