diff --git a/CHANGELOG b/CHANGELOG
index 5521c1286a8c4d462ec493ef893160be1e3e9d54..5ad85ab8ccc4cef18e324c9cf3d61782425e73fd 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -3,6 +3,7 @@ Please view this file on the master branch, on stable branches it's out of date.
 v 8.6.0 (unreleased)
   - Improve the formatting for the user page bio (Connor Shea)
   - Fix avatar stretching by providing a cropping feature (Johann Pardanaud)
+  - Use specialized system notes when MR is (un)marked as WIP
 
 v 8.5.1
   - Fix group projects styles
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 1543ef311d7d05adcd0bb45478be14c6d9a088ac..04c378691f3cb0aa6c1b541417272b1d6e784426 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -259,8 +259,14 @@ class MergeRequest < ActiveRecord::Base
     self.target_project.events.where(target_id: self.id, target_type: "MergeRequest", action: Event::CLOSED).last
   end
 
+  WIP_REGEX = /\A\[?WIP(\]|:| )\s*/i.freeze
+
   def work_in_progress?
-    !!(title =~ /\A\[?WIP(\]|:| )/i)
+    title =~ WIP_REGEX
+  end
+
+  def wipless_title
+    self.title.sub(WIP_REGEX, "")
   end
 
   def mergeable?
diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb
index 7b306a8a5319d3a347a0f19e550ca0962b41fd7d..9370b4c01a611f3541758d3b13156200f9ec0091 100644
--- a/app/services/merge_requests/base_service.rb
+++ b/app/services/merge_requests/base_service.rb
@@ -5,6 +5,22 @@ module MergeRequests
       SystemNoteService.change_status(merge_request, merge_request.target_project, current_user, merge_request.state, nil)
     end
 
+    def create_title_change_note(issuable, old_title)
+      wipless_old_title = old_title.sub(MergeRequest::WIP_REGEX, "")
+      wipless_new_title = issuable.title.sub(MergeRequest::WIP_REGEX, "")
+      
+      removed_wip = wipless_old_title == issuable.title
+      added_wip = wipless_new_title == old_title
+
+      if removed_wip
+        SystemNoteService.remove_merge_request_wip(issuable, issuable.project, current_user)
+      elsif added_wip
+        SystemNoteService.add_merge_request_wip(issuable, issuable.project, current_user)
+      else
+        super
+      end
+    end
+
     def hook_data(merge_request, action)
       hook_data = merge_request.to_hook_data(current_user)
       merge_request_url = Gitlab::UrlBuilder.new(:merge_request).build(merge_request.id)
diff --git a/app/services/system_note_service.rb b/app/services/system_note_service.rb
index edced010811b9b9a7fe5a4579751a0d1755d8a09..e579ca76565b149a32dd5e8264762193088c81a7 100644
--- a/app/services/system_note_service.rb
+++ b/app/services/system_note_service.rb
@@ -144,6 +144,18 @@ class SystemNoteService
     create_note(noteable: noteable, project: project, author: author, note: body)
   end
 
+  def self.remove_merge_request_wip(noteable, project, author)
+    body = 'Unmarked this merge request as Work In Progress'
+
+    create_note(noteable: noteable, project: project, author: author, note: body)
+  end
+
+  def self.add_merge_request_wip(noteable, project, author)
+    body = 'Marked this merge request as **Work In Progress**'
+
+    create_note(noteable: noteable, project: project, author: author, note: body)
+  end
+
   # Called when the title of a Noteable is changed
   #
   # noteable  - Noteable object that responds to `title`