diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 040dceff142dcdfed81325bea8d6da2115247153..27d54f6b46f319e68236f3e643f6014d9b07a43e 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -150,7 +150,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
 
   def resolve_conflicts
     begin
-      Gitlab::Conflict::FileCollection.new(@merge_request).resolve_conflicts!(params, user: current_user)
+      MergeRequests::ResolveService.new(project, current_user, params).execute(@merge_request)
 
       head :ok
     rescue Gitlab::Conflict::File::MissingResolution => e
diff --git a/app/models/repository.rb b/app/models/repository.rb
index e56bac509a4ed1e774778c68b998565b8b1218b9..01b02ccc0dcad4a6a4945a51aced46dca0fc6000 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -869,6 +869,14 @@ class Repository
     end
   end
 
+  def resolve_conflicts(user, branch, params)
+    commit_with_hooks(user, branch) do
+      committer = user_to_committer(user)
+
+      Rugged::Commit.create(rugged, params.merge(author: committer, committer: committer))
+    end
+  end
+
   def check_revert_content(commit, base_branch)
     source_sha = find_branch(base_branch).target.sha
     args       = [commit.id, source_sha]
diff --git a/app/services/merge_requests/resolve_service.rb b/app/services/merge_requests/resolve_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..adc71b0c2bcfb47ff7e5cda058af6197a06e2ace
--- /dev/null
+++ b/app/services/merge_requests/resolve_service.rb
@@ -0,0 +1,31 @@
+module MergeRequests
+  class ResolveService < MergeRequests::BaseService
+    attr_accessor :conflicts, :rugged, :merge_index
+
+    def execute(merge_request)
+      @conflicts = merge_request.conflicts
+      @rugged = project.repository.rugged
+      @merge_index = conflicts.merge_index
+
+      conflicts.files.each do |file|
+        write_resolved_file_to_index(file, params[:sections])
+      end
+
+      commit_params = {
+        message: params[:commit_message] || conflicts.default_commit_message,
+        parents: [conflicts.our_commit, conflicts.their_commit].map(&:oid),
+        tree: merge_index.write_tree(rugged)
+      }
+
+      project.repository.resolve_conflicts(current_user, merge_request.source_branch, commit_params)
+    end
+
+    def write_resolved_file_to_index(file, resolutions)
+      new_file = file.resolve_lines(resolutions).map(&:text).join("\n")
+      our_path = file.our_path
+
+      merge_index.add(path: our_path, oid: rugged.write(new_file, :blob), mode: file.our_mode)
+      merge_index.conflict_remove(our_path)
+    end
+  end
+end
diff --git a/lib/gitlab/conflict/file.rb b/lib/gitlab/conflict/file.rb
index 6284b0dd3776966d52df087e614ef2b387549eb2..3560fae5b091a96654cdced3ccf28713a65722b0 100644
--- a/lib/gitlab/conflict/file.rb
+++ b/lib/gitlab/conflict/file.rb
@@ -28,14 +28,6 @@ module Gitlab
                                                       parent_file: self)
       end
 
-      def resolve!(resolution, index:, rugged:)
-        new_file = resolve_lines(resolution).map(&:text).join("\n")
-
-        oid = rugged.write(new_file, :blob)
-        index.add(path: our_path, oid: oid, mode: our_mode)
-        index.conflict_remove(our_path)
-      end
-
       def resolve_lines(resolution)
         section_id = nil
 
diff --git a/lib/gitlab/conflict/file_collection.rb b/lib/gitlab/conflict/file_collection.rb
index 04a75f9edc3d71deee4a83c8d4f7ff89283085fb..e8157fb9e91c8feddba5cdb727306d0cef634347 100644
--- a/lib/gitlab/conflict/file_collection.rb
+++ b/lib/gitlab/conflict/file_collection.rb
@@ -20,27 +20,6 @@ module Gitlab
         @merge_index ||= repository.rugged.merge_commits(our_commit, their_commit)
       end
 
-      def resolve_conflicts!(params, user:)
-        resolutions = params[:sections]
-        commit_message = params[:commit_message] || default_commit_message
-        rugged = repository.rugged
-        committer = repository.user_to_committer(user)
-
-        files.each do |file|
-          file.resolve!(resolutions, index: merge_index, rugged: rugged)
-        end
-
-        new_tree = merge_index.write_tree(rugged)
-
-        Rugged::Commit.create(rugged,
-                              author: committer,
-                              committer: committer,
-                              tree: new_tree,
-                              message: commit_message,
-                              parents: [our_commit, their_commit].map(&:oid),
-                              update_ref: Gitlab::Git::BRANCH_REF_PREFIX + merge_request.source_branch)
-      end
-
       def files
         @files ||= merge_index.conflicts.map do |conflict|
           raise ConflictSideMissing unless conflict[:theirs] && conflict[:ours]