diff --git a/changelogs/unreleased/fix-orphan-notification-settings.yml b/changelogs/unreleased/fix-orphan-notification-settings.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7595b033336669f4c8a3e932312988be727ac465
--- /dev/null
+++ b/changelogs/unreleased/fix-orphan-notification-settings.yml
@@ -0,0 +1,4 @@
+---
+title: Removed orphaned notification settings without a namespace
+merge_request:
+author:
diff --git a/db/migrate/20170418103908_delete_orphan_notification_settings.rb b/db/migrate/20170418103908_delete_orphan_notification_settings.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e4b9cf659364699b35da5528c03e1f17c907f92f
--- /dev/null
+++ b/db/migrate/20170418103908_delete_orphan_notification_settings.rb
@@ -0,0 +1,24 @@
+class DeleteOrphanNotificationSettings < ActiveRecord::Migration
+  DOWNTIME = false
+
+  def up
+    execute("DELETE FROM notification_settings WHERE EXISTS (SELECT true FROM (#{orphan_notification_settings}) AS ns WHERE ns.id = notification_settings.id)")
+  end
+
+  def down
+    # This is a no-op method to make the migration reversible.
+    # If someone is trying to rollback for other reasons, we should not throw an Exception.
+    # raise ActiveRecord::IrreversibleMigration
+  end
+
+  def orphan_notification_settings
+    <<-SQL
+      SELECT notification_settings.id
+      FROM   notification_settings
+             LEFT OUTER JOIN namespaces
+                          ON namespaces.id = notification_settings.source_id
+      WHERE  notification_settings.source_type = 'Namespace'
+             AND namespaces.id IS NULL
+    SQL
+  end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 5689f7331dcfd2c8d4679bbe27718c14a116096b..26ec6367bd094fe5492b2025bc3f2b4b355d6862 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20170408033905) do
+ActiveRecord::Schema.define(version: 20170418103908) do
 
   # These are extensions that must be enabled in order to support this database
   enable_extension "plpgsql"
diff --git a/spec/services/groups/destroy_service_spec.rb b/spec/services/groups/destroy_service_spec.rb
index 2ee11fc8b4cbc98f534821eb879c3fabf2df0e4b..a37257d1bf4846abe08f7eeb055ff31b353c3c31 100644
--- a/spec/services/groups/destroy_service_spec.rb
+++ b/spec/services/groups/destroy_service_spec.rb
@@ -7,6 +7,7 @@ describe Groups::DestroyService, services: true do
   let!(:group)        { create(:group) }
   let!(:nested_group) { create(:group, parent: group) }
   let!(:project)      { create(:empty_project, namespace: group) }
+  let!(:notification_setting) { create(:notification_setting, source: group)}
   let!(:gitlab_shell) { Gitlab::Shell.new }
   let!(:remove_path)  { group.path + "+#{group.id}+deleted" }
 
@@ -23,6 +24,7 @@ describe Groups::DestroyService, services: true do
       it { expect(Group.unscoped.all).not_to include(group) }
       it { expect(Group.unscoped.all).not_to include(nested_group) }
       it { expect(Project.unscoped.all).not_to include(project) }
+      it { expect(NotificationSetting.unscoped.all).not_to include(notification_setting) }
     end
 
     context 'file system' do