diff --git a/app/helpers/services_helper.rb b/app/helpers/services_helper.rb
index 790ea446e673ef003d6a7a85521f147cadd21584..715e5893a2cd917723e377c7854362c6e93a66b8 100644
--- a/app/helpers/services_helper.rb
+++ b/app/helpers/services_helper.rb
@@ -26,4 +26,6 @@ module ServicesHelper
     event = event.pluralize if %w[merge_request issue confidential_issue].include?(event)
     "#{event}_events"
   end
+
+  extend self
 end
diff --git a/app/models/project_services/asana_service.rb b/app/models/project_services/asana_service.rb
index 20cf7dc4632d55084e8168dc4a13888ba0050a17..3728f5642e432253a1276d1f289580718a08bc61 100644
--- a/app/models/project_services/asana_service.rb
+++ b/app/models/project_services/asana_service.rb
@@ -48,10 +48,6 @@ http://app.asana.com/-/account_api'
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def client
     @_client ||= begin
       Asana::Client.new do |c|
diff --git a/app/models/project_services/assembla_service.rb b/app/models/project_services/assembla_service.rb
index f18d2204e0e1b3a80eda94f46247b62b74c36483..aeeff8917bf58e2b58fa74db3b54b06432ad6bb0 100644
--- a/app/models/project_services/assembla_service.rb
+++ b/app/models/project_services/assembla_service.rb
@@ -27,10 +27,6 @@ class AssemblaService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/bamboo_service.rb b/app/models/project_services/bamboo_service.rb
index fe95fc14525e9096754f558c8e619701a0bc53af..400020ee04aa8ebd87a50159e84b433a106faf94 100644
--- a/app/models/project_services/bamboo_service.rb
+++ b/app/models/project_services/bamboo_service.rb
@@ -56,10 +56,6 @@ class BambooService < CiService
     ]
   end
 
-  def self.supported_events
-    %w(push)
-  end
-
   def build_page(sha, ref)
     with_reactive_cache(sha, ref) {|cached| cached[:build_page] }
   end
diff --git a/app/models/project_services/bugzilla_service.rb b/app/models/project_services/bugzilla_service.rb
index 18c0cdf2db80eb8f80578bfc98a38a555e21c1b3..046e2809f454ffacf99ec63fd9b8e794a6147758 100644
--- a/app/models/project_services/bugzilla_service.rb
+++ b/app/models/project_services/bugzilla_service.rb
@@ -22,12 +22,4 @@ class BugzillaService < IssueTrackerService
   def self.to_param
     'bugzilla'
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/buildkite_service.rb b/app/models/project_services/buildkite_service.rb
index 94bc179decaecdc400efb7bef28e2bd16acd335f..0956c4a4ede143a41930732633962ee2505941c6 100644
--- a/app/models/project_services/buildkite_service.rb
+++ b/app/models/project_services/buildkite_service.rb
@@ -24,14 +24,6 @@ class BuildkiteService < CiService
     hook.save
   end
 
-  def self.supported_events
-    %w(push)
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/builds_email_service.rb b/app/models/project_services/builds_email_service.rb
index 51c07f731ffe25f6d923ee01fccfb0f85c30045a..ebd21e3718910bcb25076fbff710d7b97e93c4d3 100644
--- a/app/models/project_services/builds_email_service.rb
+++ b/app/models/project_services/builds_email_service.rb
@@ -27,10 +27,6 @@ class BuildsEmailService < Service
     %w(build)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(push_data)
     return unless supported_events.include?(push_data[:object_kind])
     return unless should_build_be_notified?(push_data)
diff --git a/app/models/project_services/campfire_service.rb b/app/models/project_services/campfire_service.rb
index 52371cde20152b26c548b8b52b4aa8dcb9ae2015..0de59af5652de6997f04aa189081107ca0e91e1f 100644
--- a/app/models/project_services/campfire_service.rb
+++ b/app/models/project_services/campfire_service.rb
@@ -28,10 +28,6 @@ class CampfireService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/ci_service.rb b/app/models/project_services/ci_service.rb
index 9b470c3a07811b2f83a8a56102a8d861e352ed18..82979c8bd34ed76a60563b04113f24f8b5db0d46 100644
--- a/app/models/project_services/ci_service.rb
+++ b/app/models/project_services/ci_service.rb
@@ -12,9 +12,6 @@ class CiService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
   # Return complete url to build page
   #
   # Ex.
diff --git a/app/models/project_services/custom_issue_tracker_service.rb b/app/models/project_services/custom_issue_tracker_service.rb
index 9c5c86b1cc931815781fff2ce664c3cdeabc51b4..dea915a4d056c11dab5fa06ab0010094465ced7e 100644
--- a/app/models/project_services/custom_issue_tracker_service.rb
+++ b/app/models/project_services/custom_issue_tracker_service.rb
@@ -36,12 +36,4 @@ class CustomIssueTrackerService < IssueTrackerService
       { type: 'text', name: 'new_issue_url', placeholder: 'New Issue url' }
     ]
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/emails_on_push_service.rb b/app/models/project_services/emails_on_push_service.rb
index 23dc0bc3790f70217c2fb6549c3168a19d47266c..f4f913ee0b60518488ee735d2cad40cfefe0b6d2 100644
--- a/app/models/project_services/emails_on_push_service.rb
+++ b/app/models/project_services/emails_on_push_service.rb
@@ -20,10 +20,6 @@ class EmailsOnPushService < Service
     %w(push tag_push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(push_data)
     return unless supported_events.include?(push_data[:object_kind])
 
diff --git a/app/models/project_services/external_wiki_service.rb b/app/models/project_services/external_wiki_service.rb
index 961b1c19a33b93ed2bfabe60970abf1846aa055f..bdf6fa6a5860eba9b017a39d57cdae8745deb7e2 100644
--- a/app/models/project_services/external_wiki_service.rb
+++ b/app/models/project_services/external_wiki_service.rb
@@ -33,8 +33,4 @@ class ExternalWikiService < Service
   def self.supported_events
     %w()
   end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/flowdock_service.rb b/app/models/project_services/flowdock_service.rb
index 00a15d12efa30f4c45f2ec356b4e0a22e96076ff..10a13c3fbdcb57962dd6ebe0f71bddefe819b5ed 100644
--- a/app/models/project_services/flowdock_service.rb
+++ b/app/models/project_services/flowdock_service.rb
@@ -26,10 +26,6 @@ class FlowdockService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/gemnasium_service.rb b/app/models/project_services/gemnasium_service.rb
index b70d74e75c1a5782e39a8c55c540767d32fe1654..f271e1f1739c9186b4e8a946553dde56f14da48b 100644
--- a/app/models/project_services/gemnasium_service.rb
+++ b/app/models/project_services/gemnasium_service.rb
@@ -27,10 +27,6 @@ class GemnasiumService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/hipchat_service.rb b/app/models/project_services/hipchat_service.rb
index a675a857b06c121788ecb46c595d63817857310f..72da219df28bf2ca8aea5569f02c5617f96dd029 100644
--- a/app/models/project_services/hipchat_service.rb
+++ b/app/models/project_services/hipchat_service.rb
@@ -49,10 +49,6 @@ class HipchatService < Service
     %w(push issue confidential_issue merge_request note tag_push build)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
     message = create_message(data)
diff --git a/app/models/project_services/irker_service.rb b/app/models/project_services/irker_service.rb
index 9a0cbcbca2d3607189f29fb63c369fc50fdc9001..5d93064f9b311af129db78d44cce4b4efa250114 100644
--- a/app/models/project_services/irker_service.rb
+++ b/app/models/project_services/irker_service.rb
@@ -25,10 +25,6 @@ class IrkerService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/jira_service.rb b/app/models/project_services/jira_service.rb
index 46291f2dcc0d975e742bb9fda0f7d90ad85955b0..2ac76e97de00d0dccc26f4b1258016fc99d9fb14 100644
--- a/app/models/project_services/jira_service.rb
+++ b/app/models/project_services/jira_service.rb
@@ -16,10 +16,6 @@ class JiraService < IssueTrackerService
     %w(commit merge_request)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   # {PROJECT-KEY}-{NUMBER} Examples: JIRA-1, PROJECT-1
   def reference_pattern
     @reference_pattern ||= %r{(?<issue>\b([A-Z][A-Z0-9_]+-)\d+)}
diff --git a/app/models/project_services/kubernetes_service.rb b/app/models/project_services/kubernetes_service.rb
index e4d5f04d1fdacc20640a4370cde8a68156a32f18..fa3cedc4354bbdfcaab1e9f4a43683b97079d6e2 100644
--- a/app/models/project_services/kubernetes_service.rb
+++ b/app/models/project_services/kubernetes_service.rb
@@ -158,14 +158,6 @@ class KubernetesService < DeploymentService
     opts
   end
 
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def kubeclient_auth_options
     { bearer_token: token }
   end
diff --git a/app/models/project_services/mattermost_service.rb b/app/models/project_services/mattermost_service.rb
index 939dfea0988fd30252844d96ec8419eb699d7cf3..c5c551b3ef58cbfac1e4139752cb2a74e826362b 100644
--- a/app/models/project_services/mattermost_service.rb
+++ b/app/models/project_services/mattermost_service.rb
@@ -38,12 +38,4 @@ class MattermostService < ChatNotificationService
   def default_channel_placeholder
     "#town-square"
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb
index f25de22e67f18b12a9f30bbac2b64a3b0a569624..50a011db74ed17af82060c6b81bbc33cbecef6eb 100644
--- a/app/models/project_services/mattermost_slash_commands_service.rb
+++ b/app/models/project_services/mattermost_slash_commands_service.rb
@@ -48,12 +48,4 @@ class MattermostSlashCommandsService < ChatSlashCommandsService
       method: 'P',
       username: 'GitLab')
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/pipelines_email_service.rb b/app/models/project_services/pipelines_email_service.rb
index fdfd01192289bc538f7e3398e22c89bf19f0d124..ac617f409d9417bbf4cbdce6e37c27d1ada590ef 100644
--- a/app/models/project_services/pipelines_email_service.rb
+++ b/app/models/project_services/pipelines_email_service.rb
@@ -23,10 +23,6 @@ class PipelinesEmailService < Service
     %w[pipeline]
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data, force: false)
     return unless supported_events.include?(data[:object_kind])
     return unless force || should_pipeline_be_notified?(data)
diff --git a/app/models/project_services/pivotaltracker_service.rb b/app/models/project_services/pivotaltracker_service.rb
index 6e19cd8ddd38f500e45ff1543f232090dcbb7342..9cc642591f4364104ad77e5ac253fe5dbaf10761 100644
--- a/app/models/project_services/pivotaltracker_service.rb
+++ b/app/models/project_services/pivotaltracker_service.rb
@@ -38,10 +38,6 @@ class PivotaltrackerService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
     return unless allowed_branch?(data[:ref])
diff --git a/app/models/project_services/pushover_service.rb b/app/models/project_services/pushover_service.rb
index 223054c1d55954055f78cb9aa031e0e8f2865c7b..a963d27a37652e491cd712115364babbc52f942d 100644
--- a/app/models/project_services/pushover_service.rb
+++ b/app/models/project_services/pushover_service.rb
@@ -65,10 +65,6 @@ class PushoverService < Service
     %w(push)
   end
 
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def execute(data)
     return unless supported_events.include?(data[:object_kind])
 
diff --git a/app/models/project_services/redmine_service.rb b/app/models/project_services/redmine_service.rb
index 1b835afc67805e6d6501b03f4fe23f1acea04b8e..6acf611eba581c9a9e4322b3232db46553f8639c 100644
--- a/app/models/project_services/redmine_service.rb
+++ b/app/models/project_services/redmine_service.rb
@@ -22,12 +22,4 @@ class RedmineService < IssueTrackerService
   def self.to_param
     'redmine'
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/slack_service.rb b/app/models/project_services/slack_service.rb
index a7a7390ac93a838ff8d9068e35d8069ab5e4b0d8..f77d2d7c60ba925c6eaba1ce41e777b85dc9f03d 100644
--- a/app/models/project_services/slack_service.rb
+++ b/app/models/project_services/slack_service.rb
@@ -37,12 +37,4 @@ class SlackService < ChatNotificationService
   def default_channel_placeholder
     "#general"
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/slack_slash_commands_service.rb b/app/models/project_services/slack_slash_commands_service.rb
index b66570c2ece369db97c694b3c416dc2261b01860..c34991e426287da2b74ae9ae296d5f2c5dfe2e2c 100644
--- a/app/models/project_services/slack_slash_commands_service.rb
+++ b/app/models/project_services/slack_slash_commands_service.rb
@@ -25,12 +25,4 @@ class SlackSlashCommandsService < ChatSlashCommandsService
   def format(text)
     Slack::Notifier::LinkFormatter.format(text) if text
   end
-
-  def self.supported_events
-    %w()
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
 end
diff --git a/app/models/project_services/teamcity_service.rb b/app/models/project_services/teamcity_service.rb
index b958333ca458e9a4a537d6084736c3db3391c367..cbaffb8ce48558370314be5056c0c94b9ec6ceb2 100644
--- a/app/models/project_services/teamcity_service.rb
+++ b/app/models/project_services/teamcity_service.rb
@@ -47,14 +47,6 @@ class TeamcityService < CiService
     'teamcity'
   end
 
-  def self.supported_events
-    %w(push)
-  end
-
-  def self.event_names
-    self.supported_events.map { |event| "#{event}_events" }
-  end
-
   def fields
     [
       { type: 'text', name: 'teamcity_url',
diff --git a/app/models/service.rb b/app/models/service.rb
index df8d9a850411cc62566ba5a8bdcb58d50c890c04..043be222f3a40155b291da53b4a575d3f325e4b3 100644
--- a/app/models/service.rb
+++ b/app/models/service.rb
@@ -79,6 +79,10 @@ class Service < ActiveRecord::Base
     self.class.to_param
   end
 
+  def self.to_param
+    raise NotImplementedError
+  end
+
   def fields
     # implement inside child
     []
@@ -93,10 +97,13 @@ class Service < ActiveRecord::Base
   end
 
   def event_names
-    # implement inside child
     self.class.event_names
   end
 
+  def self.event_names
+    self.supported_events.map { |event| "#{event}_events" }
+  end
+
   def event_field(event)
     nil
   end
@@ -109,6 +116,10 @@ class Service < ActiveRecord::Base
     self.class.supported_events
   end
 
+  def self.supported_events
+    %w(push tag_push issue confidential_issue merge_request wiki_page)
+  end
+
   def execute(data)
     # implement inside child
   end
diff --git a/lib/api/services.rb b/lib/api/services.rb
index 907f80db4387ad03c20ffa08c0d6f4d624972862..a0abec494385c3751e9323965de518cefff478e1 100644
--- a/lib/api/services.rb
+++ b/lib/api/services.rb
@@ -600,12 +600,11 @@ module API
           service_classes.each do |service|
             event_names = service.try(:event_names) || []
             event_names.each do |event_name|
-              services[service.to_param.gsub("_", "-")] << {
+              services[service.to_param.tr("_", "-")] << {
                 required: false,
                 name: event_name.to_sym,
                 type: String,
-                desc: ServicesHelper.instance_method(:service_event_description)
-                                    .bind(self).call(event_name)
+                desc: ServicesHelper.service_event_description(event_name)
               }
             end
           end
diff --git a/spec/controllers/projects/services_controller_spec.rb b/spec/controllers/projects/services_controller_spec.rb
index 2e44b5128b421dcbf4527167112b614eeb484fcf..a6e708c01e4a08910173d3abaae449440ac02d35 100644
--- a/spec/controllers/projects/services_controller_spec.rb
+++ b/spec/controllers/projects/services_controller_spec.rb
@@ -54,6 +54,7 @@ describe Projects::ServicesController do
     context 'on successful update' do
       it 'sets the flash' do
         expect(service).to receive(:to_param).and_return('hipchat')
+        expect(service).to receive(:event_names).and_return(HipchatService.event_names)
 
         put :update,
           namespace_id: project.namespace.id,