diff --git a/app/controllers/projects/tags_controller.rb b/app/controllers/projects/tags_controller.rb
index 64b820160d3599da5d8f3ecd1abed0e07c3f6705..22eb8f67f9ae299fa73d3f56610288953cbb4cd3 100644
--- a/app/controllers/projects/tags_controller.rb
+++ b/app/controllers/projects/tags_controller.rb
@@ -27,7 +27,7 @@ class Projects::TagsController < Projects::ApplicationController
     tag = @repository.find_tag(params[:id])
 
     if tag && @repository.rm_tag(tag.name)
-      Event.create_ref_event(@project, current_user, tag, 'rm', 'refs/tags')
+      EventCreateService.new.push_ref(@project, current_user, tag, 'rm', 'refs/tags')
     end
 
     respond_to do |format|
diff --git a/app/models/event.rb b/app/models/event.rb
index 9a42d380f87e7e7873010dc995867a83dcbf63f8..3ead45a4bb41b3a6a869794cb3fa8862bf83f805 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -49,29 +49,6 @@ class Event < ActiveRecord::Base
   scope :in_projects, ->(project_ids) { where(project_id: project_ids).recent }
 
   class << self
-    def create_ref_event(project, user, ref, action = 'add', prefix = 'refs/heads')
-      commit = project.repository.commit(ref.target)
-
-      if action.to_s == 'add'
-        before = '00000000'
-        after = commit.id
-      else
-        before = commit.id
-        after = '00000000'
-      end
-
-      Event.create(
-        project: project,
-        action: Event::PUSHED,
-        data: {
-          ref: "#{prefix}/#{ref.name}",
-          before: before,
-          after: after
-        },
-        author_id: user.id
-      )
-    end
-
     def reset_event_cache_for(target)
       Event.where(target_id: target.id, target_type: target.class.to_s).
         order('id DESC').limit(100).
diff --git a/app/models/members/project_member.rb b/app/models/members/project_member.rb
index 30c09f768d7069c8b4fc0091e19fb791028a1b79..ff05ab1590fb43d97917b6e62557310adfd31331 100644
--- a/app/models/members/project_member.rb
+++ b/app/models/members/project_member.rb
@@ -114,12 +114,8 @@ class ProjectMember < Member
   end
 
   def post_create_hook
-    Event.create(
-      project_id: self.project.id,
-      action: Event::JOINED,
-      author_id: self.user.id
-    )
 
+    event_service.join_project(self.project, self.user)
     notification_service.new_team_member(self) unless owner?
     system_hook_service.execute_hooks_for(self, :create)
   end
@@ -129,15 +125,14 @@ class ProjectMember < Member
   end
 
   def post_destroy_hook
-    Event.create(
-      project_id: self.project.id,
-      action: Event::LEFT,
-      author_id: self.user.id
-    )
-
+    event_service.leave_project(self.project, self.user)
     system_hook_service.execute_hooks_for(self, :destroy)
   end
 
+  def event_service
+    EventCreateService.new
+  end
+
   def notification_service
     NotificationService.new
   end
diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb
index 901f67bafb31b71b7a73bba0d879c87a59781bc4..5e971c7891c98c8fb7636bf44ec6891566d2fedb 100644
--- a/app/services/create_branch_service.rb
+++ b/app/services/create_branch_service.rb
@@ -17,7 +17,7 @@ class CreateBranchService < BaseService
     new_branch = repository.find_branch(branch_name)
 
     if new_branch
-      Event.create_ref_event(project, current_user, new_branch, 'add')
+      EventCreateService.new.push_ref(project, current_user, new_branch, 'add')
       return success(new_branch)
     else
       return error('Invalid reference name')
diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb
index 041c2287c36595aaf555311e4d7a36686694a026..a735d3f7f20c76e25b80da8caa10781fc5ba218b 100644
--- a/app/services/create_tag_service.rb
+++ b/app/services/create_tag_service.rb
@@ -26,7 +26,7 @@ class CreateTagService < BaseService
         project.gitlab_ci_service.async_execute(push_data)
       end
 
-      Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags')
+      EventCreateService.new.push_ref(project, current_user, new_tag, 'add', 'refs/tags')
       success(new_tag)
     else
       error('Invalid reference name')
diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb
index cae6327fe7296f0486345f8f9edfe0eab2e5f320..c26aee2b0aa4ba06aa8ff27e62caceea1da28a38 100644
--- a/app/services/delete_branch_service.rb
+++ b/app/services/delete_branch_service.rb
@@ -25,7 +25,7 @@ class DeleteBranchService < BaseService
     end
 
     if repository.rm_branch(branch_name)
-      Event.create_ref_event(project, current_user, branch, 'rm')
+      EventCreateService.new.push_ref(project, current_user, branch, 'rm')
       success('Branch was removed')
     else
       return error('Failed to remove branch')
diff --git a/app/services/event_create_service.rb b/app/services/event_create_service.rb
index 8d8a5873e625fdf91ef58509045d56e9f38c45eb..bb3c37023a0be94675713be181286bc7b0293c48 100644
--- a/app/services/event_create_service.rb
+++ b/app/services/event_create_service.rb
@@ -7,58 +7,94 @@
 #
 class EventCreateService
   def open_issue(issue, current_user)
-    create_event(issue, current_user, Event::CREATED)
+    create_record_event(issue, current_user, Event::CREATED)
   end
 
   def close_issue(issue, current_user)
-    create_event(issue, current_user, Event::CLOSED)
+    create_record_event(issue, current_user, Event::CLOSED)
   end
 
   def reopen_issue(issue, current_user)
-    create_event(issue, current_user, Event::REOPENED)
+    create_record_event(issue, current_user, Event::REOPENED)
   end
 
   def open_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::CREATED)
+    create_record_event(merge_request, current_user, Event::CREATED)
   end
 
   def close_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::CLOSED)
+    create_record_event(merge_request, current_user, Event::CLOSED)
   end
 
   def reopen_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::REOPENED)
+    create_record_event(merge_request, current_user, Event::REOPENED)
   end
 
   def merge_mr(merge_request, current_user)
-    create_event(merge_request, current_user, Event::MERGED)
+    create_record_event(merge_request, current_user, Event::MERGED)
   end
 
   def open_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::CREATED)
+    create_record_event(milestone, current_user, Event::CREATED)
   end
 
   def close_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::CLOSED)
+    create_record_event(milestone, current_user, Event::CLOSED)
   end
 
   def reopen_milestone(milestone, current_user)
-    create_event(milestone, current_user, Event::REOPENED)
+    create_record_event(milestone, current_user, Event::REOPENED)
   end
 
   def leave_note(note, current_user)
-    create_event(note, current_user, Event::COMMENTED)
+    create_record_event(note, current_user, Event::COMMENTED)
+  end
+
+  def join_project(project, current_user)
+    create_event(project, current_user, Event::JOINED)
+  end
+
+  def leave_project(project, current_user)
+    create_event(project, current_user, Event::LEFT)
+  end
+
+  def push_ref(project, current_user, ref, action = 'add', prefix = 'refs/heads')
+    commit = project.repository.commit(ref.target)
+
+    if action.to_s == 'add'
+      before = '00000000'
+      after = commit.id
+    else
+      before = commit.id
+      after = '00000000'
+    end
+
+    data = {
+      ref: "#{prefix}/#{ref.name}",
+      before: before,
+      after: after
+    }
+
+    push(project, current_user, data)
+  end
+
+  def push(project, current_user, push_data)
+    create_event(project, current_user, Event::PUSHED, data: push_data)
   end
 
   private
 
-  def create_event(record, current_user, status)
-    Event.create(
-      project: record.project,
-      target_id: record.id,
-      target_type: record.class.name,
+  def create_record_event(record, current_user, status)
+    create_event(record.project, current_user, status, target_id: record.id, target_type: record.class.name)
+  end
+
+  def create_event(project, current_user, status, attributes = {})
+    attributes.reverse_merge!(
+      project: project,
       action: status,
       author_id: current_user.id
     )
+
+    Event.create(attributes)
   end
 end
diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb
index c775f79ec291c88c2a194ab147b0a2078f026425..f21e6ac207dbe3dd05ef758f8f8c0129d121c9c1 100644
--- a/app/services/git_push_service.rb
+++ b/app/services/git_push_service.rb
@@ -52,7 +52,7 @@ class GitPushService
       end
 
       @push_data = post_receive_data(oldrev, newrev, ref)
-      create_push_event(@push_data)
+      EventCreateService.new.push(project, user, @push_data)
       project.execute_hooks(@push_data.dup, :push_hooks)
       project.execute_services(@push_data.dup)
     end
@@ -60,15 +60,6 @@ class GitPushService
 
   protected
 
-  def create_push_event(push_data)
-    Event.create!(
-      project: project,
-      action: Event::PUSHED,
-      data: push_data,
-      author_id: push_data[:user_id]
-    )
-  end
-
   # Extract any GFM references from the pushed commit messages. If the configured issue-closing regex is matched,
   # close the referenced Issue. Create cross-reference Notes corresponding to any other referenced Mentionables.
   def process_commit_messages(ref)
diff --git a/app/services/git_tag_push_service.rb b/app/services/git_tag_push_service.rb
index c24809ad60796ed551d9b4d18339cd71a0803f89..46d8987f12dbe2f2bd28c728af8988e9b0afd651 100644
--- a/app/services/git_tag_push_service.rb
+++ b/app/services/git_tag_push_service.rb
@@ -5,7 +5,7 @@ class GitTagPushService
     @project, @user = project, user
     @push_data = create_push_data(oldrev, newrev, ref)
 
-    create_push_event
+    EventCreateService.new.push(project, user, @push_data)
     project.repository.expire_cache
     project.execute_hooks(@push_data.dup, :tag_push_hooks)
 
@@ -22,13 +22,4 @@ class GitTagPushService
     Gitlab::PushDataBuilder.
       build(project, user, oldrev, newrev, ref, [])
   end
-
-  def create_push_event
-    Event.create!(
-      project: project,
-      action: Event::PUSHED,
-      data: push_data,
-      author_id: push_data[:user_id]
-    )
-  end
 end