diff --git a/app/services/notification_service.rb b/app/services/notification_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..f20f3a44df60897d28061aea9cbb2f9397926b97
--- /dev/null
+++ b/app/services/notification_service.rb
@@ -0,0 +1,51 @@
+# NotificationService class
+#
+# Used for notifing users with emails about different events
+#
+# Ex.
+#   NotificationService.new.new_issue(issue, current_user)
+#
+class NotificationService
+  # Always notify user about ssh key added
+  # only if ssh key is not deploy key
+  def new_key(key)
+    if key.user
+      Notify.delay.new_ssh_key_email(key.id)
+    end
+  end
+
+  # TODO: When we close an issue we should send next emails:
+  #
+  #  * issue author if his notification level is not Disabled
+  #  * issue assignee if his notification level is not Disabled
+  #  * project team members with notification level higher then Participating
+  #
+  def close_issue(issue, current_user)
+    [issue.author, issue.assignee].compact.uniq.each do |recipient|
+      Notify.delay.issue_status_changed_email(recipient.id, issue.id, issue.state, current_user.id)
+    end
+  end
+
+  # When we reassign an issue we should send next emails:
+  #
+  #  * issue author if his notification level is not Disabled
+  #  * issue assignee if his notification level is not Disabled
+  #
+  def reassigned_issue(issue, current_user)
+    recipient_ids = [issue.assignee_id, issue.assignee_id_was].keep_if {|id| id && id != current_user.id }
+
+    recipient_ids.each do |recipient_id|
+      Notify.delay.reassigned_issue_email(recipient_id, issue.id, issue.assignee_id_was)
+    end
+  end
+
+  # When we reassign an issue we should send next emails:
+  #
+  #  * issue assignee if his notification level is not Disabled
+  #
+  def new_issue(issue, current_user)
+    if issue.assignee && issue.assignee != current_user
+      Notify.delay.new_issue_email(issue.id)
+    end
+  end
+end
diff --git a/spec/services/notification_service_spec.rb b/spec/services/notification_service_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..3869db71ab315151f9597e59cb5fac48a19c2f51
--- /dev/null
+++ b/spec/services/notification_service_spec.rb
@@ -0,0 +1,47 @@
+require 'spec_helper'
+
+describe NotificationService do
+  # Disable observers to prevent factory trigger notification service
+  before { ActiveRecord::Base.observers.disable :all }
+
+  let(:notification) { NotificationService.new }
+
+  describe 'Keys' do
+    describe :new_key do
+      let(:key) { create(:personal_key) }
+
+      it { notification.new_key(key).should be_true }
+
+      it 'should sent email to key owner' do
+        Notify.should_receive(:new_ssh_key_email).with(key.id)
+        notification.new_key(key)
+      end
+    end
+  end
+
+  describe 'Issues' do
+    let(:issue) { create :issue, assignee: create(:user) }
+
+    describe :new_issue do
+      it 'should sent email to issue assignee' do
+        Notify.should_receive(:new_issue_email).with(issue.id)
+        notification.new_issue(issue, nil)
+      end
+    end
+
+    describe :reassigned_issue do
+      it 'should sent email to issue old assignee and new issue assignee' do
+        Notify.should_receive(:reassigned_issue_email).twice
+        notification.reassigned_issue(issue, issue.author)
+      end
+    end
+
+    describe :close_issue do
+      it 'should sent email to issue assignee and issue author' do
+        Notify.should_receive(:issue_status_changed_email).twice
+        notification.close_issue(issue, issue.author)
+      end
+    end
+  end
+end
+