diff --git a/app/helpers/gitlab_markdown_helper.rb b/app/helpers/gitlab_markdown_helper.rb
index 9890ec7c75780cf6b11f3aa1af3875b4aa7a9030..f2cab2840d4da5162169ff77fb4a8cbfc8171c23 100644
--- a/app/helpers/gitlab_markdown_helper.rb
+++ b/app/helpers/gitlab_markdown_helper.rb
@@ -52,7 +52,8 @@ module GitlabMarkdownHelper
       ref:          @ref
     )
 
-    Gitlab::Markdown.render(text, context)
+    html = Gitlab::Markdown.render(text, context)
+    Gitlab::Markdown.post_process(html, current_user)
   end
 
   # TODO (rspeicher): Remove all usages of this helper and just call `markdown`
@@ -65,7 +66,8 @@ module GitlabMarkdownHelper
       ref:          @ref
     )
 
-    Gitlab::Markdown.gfm(text, options)
+    html = Gitlab::Markdown.gfm(text, options)
+    Gitlab::Markdown.post_process(html, current_user)
   end
 
   def asciidoc(text)
diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb
index 478851fc656447379e6ab9711ed341cb7315595c..dbb8da3f0ad6ecb4b227acbbc023df539dc5251e 100644
--- a/lib/gitlab/markdown.rb
+++ b/lib/gitlab/markdown.rb
@@ -31,6 +31,24 @@ module Gitlab
       renderer.render(markdown)
     end
 
+    # Perform post-processing on an HTML String
+    #
+    # This method is used to perform state-dependent changes to a String of
+    # HTML, such as removing references that the current user doesn't have
+    # permission to make (`RedactorFilter`).
+    #
+    # html     - String to process
+    # for_user - User state
+    #
+    # Returns an HTML-safe String
+    def self.post_process(html, for_user)
+      result = post_processor.call(html, current_user: for_user)
+
+      result[:output].
+        to_html.
+        html_safe
+    end
+
     # Provide autoload paths for filters to prevent a circular dependency error
     autoload :AutolinkFilter,               'gitlab/markdown/autolink_filter'
     autoload :CommitRangeReferenceFilter,   'gitlab/markdown/commit_range_reference_filter'
@@ -115,6 +133,10 @@ module Gitlab
       end
     end
 
+    def self.post_processor
+      @post_processor ||= HTML::Pipeline.new([Gitlab::Markdown::RedactorFilter])
+    end
+
     def self.redcarpet_options
       # https://github.com/vmg/redcarpet#and-its-like-really-simple-to-use
       @redcarpet_options ||= {
diff --git a/spec/features/markdown_spec.rb b/spec/features/markdown_spec.rb
index c557a1061af269741f7c9d674e57b7d5ba994fdb..fdd8cf07b12cf14c792caaaac76296ac368206f1 100644
--- a/spec/features/markdown_spec.rb
+++ b/spec/features/markdown_spec.rb
@@ -220,7 +220,7 @@ describe 'GitLab Markdown', feature: true do
     end
   end
 
-  # `markdown` calls these two methods
+  # Fake a `current_user` helper
   def current_user
     @feat.user
   end