diff --git a/app/services/merge_requests/build_service.rb b/app/services/merge_requests/build_service.rb
index 3544752d47a77441671542d2b51f684bdbb67938..4add1d66ea57c4a15c2062949f33120d832a8f4d 100644
--- a/app/services/merge_requests/build_service.rb
+++ b/app/services/merge_requests/build_service.rb
@@ -41,21 +41,45 @@ def execute
         merge_request.can_be_created = false
       end
 
+      set_title_and_description(merge_request)
+    end
+
+    private
+
+    # When your branch name starts with an iid followed by a dash this pattern will be
+    # interpreted as the user wants to close that issue on this project.
+    #
+    # For example:
+    # - Issue 112 exists, title: Emoji don't show up in commit title
+    # - Source branch is: 112-fix-mep-mep
+    #
+    # Will lead to:
+    # - Appending `Closes #112` to the description
+    # - Setting the title as 'Resolves "Emoji don't show up in commit title"' if there is
+    #   more than one commit in the MR
+    #
+    def set_title_and_description(merge_request)
+      if match = merge_request.source_branch.match(/\A(\d+)-/)
+        iid = match[1]
+      end
+
       commits = merge_request.compare_commits
       if commits && commits.count == 1
         commit = commits.first
         merge_request.title       = commit.title
         merge_request.description ||= commit.description.try(:strip)
+      elsif iid && (issue = merge_request.target_project.get_issue(iid))
+        case issue
+        when Issue
+          merge_request.title = "Resolve \"#{issue.title}\""
+        when ExternalIssue
+          merge_request.title = "Resolve #{issue.title}"
+        end
       else
         merge_request.title = merge_request.source_branch.titleize.humanize
       end
 
-      # When your branch name starts with an iid followed by a dash this pattern will
-      # be interpreted as the use wants to close that issue on this project
-      # Pattern example: 112-fix-mep-mep
-      # Will lead to appending `Closes #112` to the description
-      if match = merge_request.source_branch.match(/\A(\d+)-/)
-        iid = match[1]
+      if iid
         closes_issue = "Closes ##{iid}"
 
         if merge_request.description.present?
diff --git a/spec/services/merge_requests/build_service_spec.rb b/spec/services/merge_requests/build_service_spec.rb
index 7ad13478dd442ed74da35ef7feb8daf59f90c067..f8b768a1a9b5f2a47fcc015aebd0ea22b69a29cb 100644
--- a/spec/services/merge_requests/build_service_spec.rb
+++ b/spec/services/merge_requests/build_service_spec.rb
@@ -5,7 +5,7 @@
 
   let(:project) { create(:project) }
   let(:user) { create(:user) }
-  let(:issue) { create(:issue, project: project) }
+  let(:issue) { create(:issue, project: project, title: 'A bug') }
   let(:description) { nil }
   let(:source_branch) { 'feature-branch' }
   let(:target_branch) { 'master' }
@@ -141,6 +141,32 @@
           expect(merge_request.description).to eq(description)
         end
       end
+
+      context 'branch starts with GitLab issue IID followed by a hyphen' do
+        let(:source_branch) { "#{issue.iid}-fix-issue" }
+
+        it 'sets the title to: Resolves "$issue-title"' do
+          expect(merge_request.title).to eq("Resolve \"#{issue.title}\"")
+        end
+
+        context 'issue does not exist' do
+          let(:source_branch) { "#{issue.iid.succ}-fix-issue" }
+
+          it 'uses the title of the branch as the merge request title' do
+            expect(merge_request.title).to eq("#{issue.iid.succ} fix issue")
+          end
+        end
+      end
+
+      context 'branch starts with external issue IID followed by a hyphen' do
+        let(:source_branch) { '12345-fix-issue' }
+
+        before { allow(project).to receive(:default_issues_tracker?).and_return(false) }
+
+        it 'sets the title to: Resolves External Issue $issue-iid' do
+          expect(merge_request.title).to eq('Resolve External Issue 12345')
+        end
+      end
     end
   end
 end