diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb
index 4694c7fc25219810a2fe2e5477ee85d700ea917e..e7d6e3e6bd963715507f7d8f7156d0fb36ccbcfb 100644
--- a/lib/gitlab/markdown.rb
+++ b/lib/gitlab/markdown.rb
@@ -45,12 +45,11 @@ module Gitlab
 
       # Extract pre blocks so they are not altered
       # from http://github.github.com/github-flavored-markdown/
-      extractions = {}
-      text.gsub!(%r{<pre>.*?</pre>|<code>.*?</code>}m) do |match|
-        md5 = Digest::MD5.hexdigest(match)
-        extractions[md5] = match
-        "{gfm-extraction-#{md5}}"
-      end
+      text.gsub!(%r{<pre>.*?</pre>|<code>.*?</code>}m) { |match| extract_piece(match) }
+      # Extract links with probably parsable hrefs
+      text.gsub!(%r{<a.*?>.*?</a>}m) { |match| extract_piece(match) }
+      # Extract images with probably parsable src
+      text.gsub!(%r{<img.*?>}m) { |match| extract_piece(match) }
 
       # TODO: add popups with additional information
 
@@ -58,7 +57,7 @@ module Gitlab
 
       # Insert pre block extractions
       text.gsub!(/\{gfm-extraction-(\h{32})\}/) do
-        extractions[$1]
+        insert_piece($1)
       end
 
       sanitize text.html_safe, attributes: ActionView::Base.sanitized_allowed_attributes + %w(id class)
@@ -66,6 +65,18 @@ module Gitlab
 
     private
 
+    def extract_piece(text)
+      @extractions ||= {}
+
+      md5 = Digest::MD5.hexdigest(text)
+      @extractions[md5] = text
+      "{gfm-extraction-#{md5}}"
+    end
+
+    def insert_piece(id)
+      @extractions[id]
+    end
+
     # Private: Parses text for references and emoji
     #
     # text - Text to parse
diff --git a/lib/redcarpet/render/gitlab_html.rb b/lib/redcarpet/render/gitlab_html.rb
index 3a430e0bf9ecbb9cbf891297a5603cd678196461..4f2c86e2d413dcf094ed30b660aef1711b06e9d4 100644
--- a/lib/redcarpet/render/gitlab_html.rb
+++ b/lib/redcarpet/render/gitlab_html.rb
@@ -27,6 +27,10 @@ class Redcarpet::Render::GitlabHTML < Redcarpet::Render::HTML
     HTML
   end
 
+  def link(link, title, content)
+    h.link_to_gfm(content, link, title: title)
+  end
+
   def postprocess(full_document)
     h.gfm(full_document)
   end
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index b7e16f1ee266bb20a2c0793690247762f570fd59..6d17c4eaf165956654f327bfe200d7ad34c53185 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -1,6 +1,8 @@
 require "spec_helper"
 
 describe GitlabMarkdownHelper do
+  include ApplicationHelper
+
   let!(:project) { create(:project) }
 
   let(:user)          { create(:user, username: 'gfm') }
@@ -340,6 +342,18 @@ describe GitlabMarkdownHelper do
       markdown("\nDon't use `$#{snippet.id}` here.\n").should == "<p>Don&#39;t use <code>$#{snippet.id}</code> here.</p>\n"
     end
 
+    it "should leave ref-like autolinks untouched" do
+      markdown("look at http://example.tld/#!#{merge_request.id}").should == "<p>look at <a href=\"http://example.tld/#!#{merge_request.id}\">http://example.tld/#!#{merge_request.id}</a></p>\n"
+    end
+
+    it "should leave ref-like href of 'manual' links untouched" do
+      markdown("why not [inspect !#{merge_request.id}](http://example.tld/#!#{merge_request.id})").should == "<p>why not <a href=\"http://example.tld/#!#{merge_request.id}\">inspect </a><a href=\"http://test.host/project60/merge_requests/#{merge_request.id}\" class=\"gfm gfm-merge_request \" title=\"Merge Request: #{merge_request.title}\">!#{merge_request.id}</a><a href=\"http://example.tld/#!#{merge_request.id}\"></a></p>\n"
+    end
+
+    it "should leave ref-like src of images untouched" do
+      markdown("screen shot: ![some image](http://example.tld/#!#{merge_request.id})").should == "<p>screen shot: <img src=\"http://example.tld/#!#{merge_request.id}\" alt=\"some image\"></p>\n"
+    end
+
     it "should generate absolute urls for refs" do
       markdown("##{issue.id}").should include(project_issue_url(project, issue))
     end