diff --git a/app/controllers/projects/snippets_controller.rb b/app/controllers/projects/snippets_controller.rb
index ebff5039ffae1160f885ed284086216b6aed717b..cd14c08c7792b083ef5f264e4ce482fe450ffdc0 100644
--- a/app/controllers/projects/snippets_controller.rb
+++ b/app/controllers/projects/snippets_controller.rb
@@ -23,11 +23,11 @@ class Projects::SnippetsController < Projects::ApplicationController
   end
 
   def new
-    @snippet = @project.snippets.new
+    @snippet = @project.snippets.build
   end
 
   def create
-    @snippet = @project.snippets.new(params[:project_snippet])
+    @snippet = @project.snippets.build(params[:project_snippet])
     @snippet.author = current_user
     @snippet.save
 
diff --git a/app/models/ability.rb b/app/models/ability.rb
index 2dadb584460c3b198ee387cc5c9b372ada1b28cc..b86a4b5a04477166313397f3481dfaf8eaa563ec 100644
--- a/app/models/ability.rb
+++ b/app/models/ability.rb
@@ -55,7 +55,7 @@ class Ability
         :read_wiki,
         :read_issue,
         :read_milestone,
-        :read_snippet,
+        :read_project_snippet,
         :read_team_member,
         :read_merge_request,
         :read_note,
@@ -68,7 +68,7 @@ class Ability
     def project_report_rules
       project_guest_rules + [
         :download_code,
-        :write_snippet
+        :write_project_snippet
       ]
     end
 
@@ -84,11 +84,11 @@ class Ability
       project_dev_rules + [
         :push_code_to_protected_branches,
         :modify_issue,
-        :modify_snippet,
+        :modify_project_snippet,
         :modify_merge_request,
         :admin_issue,
         :admin_milestone,
-        :admin_snippet,
+        :admin_project_snippet,
         :admin_team_member,
         :admin_merge_request,
         :admin_note,
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index d4f50fda1b54b4b5f2366e67abfe7b2628048538..3699971f25c37ad168b89276627d90eb8630add9 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -408,7 +408,7 @@ module Gitlab
       # Example Request:
       #   POST /projects/:id/snippets
       post ":id/snippets" do
-        authorize! :write_snippet, user_project
+        authorize! :write_project_snippet, user_project
         required_attributes! [:title, :file_name, :code]
 
         attrs = attributes_for_keys [:title, :file_name]
@@ -437,7 +437,7 @@ module Gitlab
       #   PUT /projects/:id/snippets/:snippet_id
       put ":id/snippets/:snippet_id" do
         @snippet = user_project.snippets.find(params[:snippet_id])
-        authorize! :modify_snippet, @snippet
+        authorize! :modify_project_snippet, @snippet
 
         attrs = attributes_for_keys [:title, :file_name]
         attrs[:expires_at] = params[:lifetime] if params[:lifetime].present?
@@ -460,7 +460,7 @@ module Gitlab
       delete ":id/snippets/:snippet_id" do
         begin
           @snippet = user_project.snippets.find(params[:snippet_id])
-          authorize! :modify_snippet, user_project
+          authorize! :modify_project_snippet, @snippet
           @snippet.destroy
         rescue
         end
diff --git a/spec/helpers/gitlab_markdown_helper_spec.rb b/spec/helpers/gitlab_markdown_helper_spec.rb
index b9025026c1bbed705f664b039c54d06e766b2ead..94ccefa79f94b821a17a44817049c4a44be45402 100644
--- a/spec/helpers/gitlab_markdown_helper_spec.rb
+++ b/spec/helpers/gitlab_markdown_helper_spec.rb
@@ -10,7 +10,7 @@ describe GitlabMarkdownHelper do
   let(:commit)        { CommitDecorator.decorate(project.repository.commit) }
   let(:issue)         { create(:issue, project: project) }
   let(:merge_request) { create(:merge_request, project: project) }
-  let(:snippet)       { create(:snippet, project: project) }
+  let(:snippet)       { create(:project_snippet, project: project) }
   let(:member)        { project.users_projects.where(user_id: user).first }
 
   before do
@@ -190,8 +190,43 @@ describe GitlabMarkdownHelper do
     describe "referencing a snippet" do
       let(:object)    { snippet }
       let(:reference) { "$#{snippet.id}" }
+      let(:actual)   { "Reference to #{reference}" }
+      let(:expected) { project_snippet_path(project, object) }
+
+      it "should link using a valid id" do
+        gfm(actual).should match(expected)
+      end
+
+      it "should link with adjacent text" do
+        # Wrap the reference in parenthesis
+        gfm(actual.gsub(reference, "(#{reference})")).should match(expected)
+
+        # Append some text to the end of the reference
+        gfm(actual.gsub(reference, "#{reference}, right?")).should match(expected)
+      end
+
+      it "should keep whitespace intact" do
+        actual   = "Referenced #{reference} already."
+        expected = /Referenced <a.+>[^\s]+<\/a> already/
+        gfm(actual).should match(expected)
+      end
+
+      it "should not link with an invalid id" do
+        # Modify the reference string so it's still parsed, but is invalid
+        reference.gsub!(/^(.)(\d+)$/, '\1' + ('\2' * 2))
+        gfm(actual).should == actual
+      end
+
+      it "should include a title attribute" do
+        title = "Snippet: #{object.title}"
+        gfm(actual).should match(/title="#{title}"/)
+      end
+
+      it "should include standard gfm classes" do
+        css = object.class.to_s.underscore
+        gfm(actual).should match(/class="\s?gfm gfm-snippet\s?"/)
+      end
 
-      include_examples 'referenced object'
     end
 
     describe "referencing multiple objects" do
diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb
index 9423c7de6ecf4029e30944c562d4e0fb968b2470..17033973dfe9c7bf5a8d68be58993d2f601a6366 100644
--- a/spec/models/project_spec.rb
+++ b/spec/models/project_spec.rb
@@ -34,7 +34,7 @@ describe Project do
     it { should have_many(:milestones).dependent(:destroy) }
     it { should have_many(:users_projects).dependent(:destroy) }
     it { should have_many(:notes).dependent(:destroy) }
-    it { should have_many(:snippets).dependent(:destroy) }
+    it { should have_many(:project_snippets).class_name('ProjectSnippet').dependent(:destroy) }
     it { should have_many(:deploy_keys).dependent(:destroy) }
     it { should have_many(:hooks).dependent(:destroy) }
     it { should have_many(:wikis).dependent(:destroy) }
diff --git a/spec/requests/api/notes_spec.rb b/spec/requests/api/notes_spec.rb
index 901640834f212f04e558bd7833f549ec61a32e6e..0df3189ca0c019c70f256b84802006df61b12475 100644
--- a/spec/requests/api/notes_spec.rb
+++ b/spec/requests/api/notes_spec.rb
@@ -7,7 +7,7 @@ describe Gitlab::API do
   let!(:project) { create(:project, namespace: user.namespace ) }
   let!(:issue) { create(:issue, project: project, author: user) }
   let!(:merge_request) { create(:merge_request, project: project, author: user) }
-  let!(:snippet) { create(:snippet, project: project, author: user) }
+  let!(:snippet) { create(:project_snippet, project: project, author: user) }
   let!(:issue_note) { create(:note, noteable: issue, project: project, author: user) }
   let!(:merge_request_note) { create(:note, noteable: merge_request, project: project, author: user) }
   let!(:snippet_note) { create(:note, noteable: snippet, project: project, author: user) }
diff --git a/spec/requests/api/projects_spec.rb b/spec/requests/api/projects_spec.rb
index cddb72640189df893e847fb8e9a117d4f1f6b979..c5a74ed9e0db0333bce5939856778a25db468b80 100644
--- a/spec/requests/api/projects_spec.rb
+++ b/spec/requests/api/projects_spec.rb
@@ -9,7 +9,7 @@ describe Gitlab::API do
   let(:admin) { create(:admin) }
   let!(:project) { create(:project, namespace: user.namespace ) }
   let!(:hook) { create(:project_hook, project: project, url: "http://example.com") }
-  let!(:snippet) { create(:snippet, author: user, project: project, title: 'example') }
+  let!(:snippet) { create(:project_snippet, author: user, project: project, title: 'example') }
   let!(:users_project) { create(:users_project, user: user, project: project, project_access: UsersProject::MASTER) }
   let!(:users_project2) { create(:users_project, user: user3, project: project, project_access: UsersProject::DEVELOPER) }
   let(:key) { create(:key, project: project) }