diff --git a/app/models/concerns/spammable.rb b/app/models/concerns/spammable.rb
index 423ae98a60e8206fcea6e2c03003b004a0c2341c..79adc77c9e42dd1894363d492b3762b4acb92beb 100644
--- a/app/models/concerns/spammable.rb
+++ b/app/models/concerns/spammable.rb
@@ -22,6 +22,10 @@ module Spammable
     delegate :ip_address, :user_agent, to: :user_agent_detail, allow_nil: true
   end
 
+  def submittable_as_spam_by?(current_user)
+    current_user && current_user.admin? && submittable_as_spam?
+  end
+
   def submittable_as_spam?
     if user_agent_detail
       user_agent_detail.submittable? && current_application_settings.akismet_enabled
diff --git a/app/views/projects/issues/show.html.haml b/app/views/projects/issues/show.html.haml
index d3eb3b7055b6dcf85a0ba8a409e4e6354e1714e4..069f3d979435edfe6b18988eec081948099ef8fc 100644
--- a/app/views/projects/issues/show.html.haml
+++ b/app/views/projects/issues/show.html.haml
@@ -40,7 +40,7 @@
                 = link_to 'Close issue', issue_path(@issue, issue: { state_event: :close }, format: 'json'), data: {no_turbolink: true}, class: "btn-close #{issue_button_visibility(@issue, true)}", title: 'Close issue'
               %li
                 = link_to 'Edit', edit_namespace_project_issue_path(@project.namespace, @project, @issue)
-            - if @issue.submittable_as_spam? && current_user.admin?
+            - if @issue.submittable_as_spam_by?(current_user)
               %li
                 = link_to 'Submit as spam', mark_as_spam_namespace_project_issue_path(@project.namespace, @project, @issue), method: :post, class: 'btn-spam', title: 'Submit as spam'
 
@@ -50,7 +50,7 @@
         - if can?(current_user, :update_issue, @issue)
           = link_to 'Reopen issue', issue_path(@issue, issue: { state_event: :reopen }, format: 'json'), data: {no_turbolink: true}, class: "hidden-xs hidden-sm btn btn-grouped btn-reopen #{issue_button_visibility(@issue, false)}", title: 'Reopen issue'
           = link_to 'Close issue', issue_path(@issue, issue: { state_event: :close }, format: 'json'), data: {no_turbolink: true}, class: "hidden-xs hidden-sm btn btn-grouped btn-close #{issue_button_visibility(@issue, true)}", title: 'Close issue'
-          - if @issue.submittable_as_spam? && current_user.admin?
+          - if @issue.submittable_as_spam_by?(current_user)
             = link_to 'Submit as spam', mark_as_spam_namespace_project_issue_path(@project.namespace, @project, @issue), method: :post, class: 'hidden-xs hidden-sm btn btn-grouped btn-spam', title: 'Submit as spam'
           = link_to 'Edit', edit_namespace_project_issue_path(@project.namespace, @project, @issue), class: 'hidden-xs hidden-sm btn btn-grouped issuable-edit'
 
diff --git a/app/views/projects/snippets/_actions.html.haml b/app/views/projects/snippets/_actions.html.haml
index dde2e2b644d6e7ab4a9c564d79fd423ae8c5c168..34ee4ff1937d254f14201a4f5bd4fb390f89efa4 100644
--- a/app/views/projects/snippets/_actions.html.haml
+++ b/app/views/projects/snippets/_actions.html.haml
@@ -10,7 +10,7 @@
   - if can?(current_user, :create_project_snippet, @project)
     = link_to new_namespace_project_snippet_path(@project.namespace, @project), class: 'btn btn-grouped btn-inverted btn-create', title: "New snippet" do
       New snippet
-  - if @snippet.submittable_as_spam? && current_user.admin?
+  - if @snippet.submittable_as_spam_by?(current_user)
     = link_to 'Submit as spam', mark_as_spam_namespace_project_snippet_path(@project.namespace, @project, @snippet), method: :post, class: 'btn btn-grouped btn-spam', title: 'Submit as spam'
 - if can?(current_user, :create_project_snippet, @project) || can?(current_user, :update_project_snippet, @snippet)
   .visible-xs-block.dropdown
@@ -31,6 +31,6 @@
           %li
             = link_to edit_namespace_project_snippet_path(@project.namespace, @project, @snippet) do
               Edit
-        - if @snippet.submittable_as_spam? && current_user.admin?
+        - if @snippet.submittable_as_spam_by?(current_user)
           %li
             = link_to 'Submit as spam', mark_as_spam_namespace_project_snippet_path(@project.namespace, @project, @snippet), method: :post
diff --git a/app/views/snippets/_actions.html.haml b/app/views/snippets/_actions.html.haml
index 855a995afa931ae9a0709e8d7d9c7219b385d8bc..a7f118d3f7d1562c5631dfc31e9056032eef46a7 100644
--- a/app/views/snippets/_actions.html.haml
+++ b/app/views/snippets/_actions.html.haml
@@ -9,7 +9,7 @@
       Delete
   = link_to new_snippet_path, class: "btn btn-grouped btn-inverted btn-create", title: "New snippet" do
     New snippet
-  - if @snippet.submittable_as_spam? && current_user.admin?
+  - if @snippet.submittable_as_spam_by?(current_user)
     = link_to 'Submit as spam', mark_as_spam_snippet_path(@snippet), method: :post, class: 'btn btn-grouped btn-spam', title: 'Submit as spam'
 .visible-xs-block.dropdown
   %button.btn.btn-default.btn-block.append-bottom-0.prepend-top-5{ data: { toggle: "dropdown" } }
@@ -28,6 +28,6 @@
         %li
           = link_to edit_snippet_path(@snippet) do
             Edit
-      - if @snippet.submittable_as_spam? && current_user.admin?
+      - if @snippet.submittable_as_spam_by?(current_user)
         %li
           = link_to 'Submit as spam', mark_as_spam_snippet_path(@snippet), method: :post
diff --git a/db/migrate/20170210103609_add_index_to_user_agent_detail.rb b/db/migrate/20170210103609_add_index_to_user_agent_detail.rb
new file mode 100644
index 0000000000000000000000000000000000000000..c01753cfbd216721eaf7c7a88b4dd3b8e368be7f
--- /dev/null
+++ b/db/migrate/20170210103609_add_index_to_user_agent_detail.rb
@@ -0,0 +1,14 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class AddIndexToUserAgentDetail < ActiveRecord::Migration
+  include Gitlab::Database::MigrationHelpers
+
+  DOWNTIME = false
+
+  disable_ddl_transaction!
+
+  def change
+    add_concurrent_index(:user_agent_details, [:subject_id, :subject_type])
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index e0208dab3d3a19e608cc99be647cbe988a510155..88aaa6c3c55c8bd65ee4850fbe31e939d898bfa4 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1218,6 +1218,8 @@ ActiveRecord::Schema.define(version: 20170215200045) do
     t.datetime "updated_at", null: false
   end
 
+  add_index "user_agent_details", ["subject_id", "subject_type"], name: "index_user_agent_details_on_subject_id_and_subject_type", using: :btree
+
   create_table "users", force: :cascade do |t|
     t.string "email", default: "", null: false
     t.string "encrypted_password", default: "", null: false
diff --git a/spec/models/concerns/spammable_spec.rb b/spec/models/concerns/spammable_spec.rb
index 32935bc0b09343404f7db11ea92c52a544d60588..b6e5c95d18a4614c4bc0967ed23c9de841354db7 100644
--- a/spec/models/concerns/spammable_spec.rb
+++ b/spec/models/concerns/spammable_spec.rb
@@ -14,8 +14,9 @@ describe Issue, 'Spammable' do
   end
 
   describe 'InstanceMethods' do
+    let(:issue) { build(:issue, spam: true) }
+
     it 'should be invalid if spam' do
-      issue = build(:issue, spam: true)
       expect(issue.valid?).to be_falsey
     end
 
@@ -29,5 +30,20 @@ describe Issue, 'Spammable' do
         expect(issue.check_for_spam?).to eq(false)
       end
     end
+
+    describe '#submittable_as_spam_by?' do
+      let(:admin) { build(:admin) }
+      let(:user) { build(:user) }
+
+      before do
+        allow(issue).to receive(:submittable_as_spam?).and_return(true)
+      end
+
+      it 'tests if the user can submit spam' do
+        expect(issue.submittable_as_spam_by?(admin)).to be(true)
+        expect(issue.submittable_as_spam_by?(user)).to be(false)
+        expect(issue.submittable_as_spam_by?(nil)).to be_nil
+      end
+    end
   end
 end