diff --git a/src/models/note.ts b/src/models/note.ts
index 6d315db4c..1dcc70c17 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -5,13 +5,13 @@ import db from '../db/mongodb';
 import { IUser, pack as packUser } from './user';
 import { pack as packApp } from './app';
 import { pack as packChannel } from './channel';
-import Vote, { deletePollVote } from './poll-vote';
+import PollVote, { deletePollVote } from './poll-vote';
 import Reaction, { deleteNoteReaction } from './note-reaction';
 import { pack as packFile } from './drive-file';
 import NoteWatching, { deleteNoteWatching } from './note-watching';
 import NoteReaction from './note-reaction';
 import Favorite, { deleteFavorite } from './favorite';
-import PollVote from './poll-vote';
+import Notification, { deleteNotification } from './notification';
 
 const Note = db.get<INote>('notes');
 
@@ -123,6 +123,11 @@ export async function deleteNote(note: string | mongo.ObjectID | INote) {
 		await Favorite.find({ noteId: n._id })
 	).map(x => deleteFavorite(x)));
 
+	// この投稿に対するNotificationをすべて削除
+	await Promise.all((
+		await Notification.find({ noteId: n._id })
+	).map(x => deleteNotification(x)));
+
 	// このNoteを削除
 	await Note.remove({
 		_id: n._id
@@ -258,7 +263,7 @@ export const pack = async (
 		// Poll
 		if (meId && _note.poll) {
 			_note.poll = (async (poll) => {
-				const vote = await Vote
+				const vote = await PollVote
 					.findOne({
 						userId: meId,
 						noteId: id
diff --git a/src/models/notification.ts b/src/models/notification.ts
index d5ca7135b..76871166a 100644
--- a/src/models/notification.ts
+++ b/src/models/notification.ts
@@ -49,6 +49,33 @@ export interface INotification {
 	isRead: Boolean;
 }
 
+/**
+ * Notificationを物理削除します
+ */
+export async function deleteNotification(notification: string | mongo.ObjectID | INotification) {
+	let n: INotification;
+
+	// Populate
+	if (mongo.ObjectID.prototype.isPrototypeOf(notification)) {
+		n = await Notification.findOne({
+			_id: notification
+		});
+	} else if (typeof notification === 'string') {
+		n = await Notification.findOne({
+			_id: new mongo.ObjectID(notification)
+		});
+	} else {
+		n = notification as INotification;
+	}
+
+	if (n == null) return;
+
+	// このNotificationを削除
+	await Notification.remove({
+		_id: n._id
+	});
+}
+
 /**
  * Pack a notification for API response
  */
diff --git a/src/models/user.ts b/src/models/user.ts
index 686bcc5ec..56ca0c625 100644
--- a/src/models/user.ts
+++ b/src/models/user.ts
@@ -19,6 +19,7 @@ import PollVote, { deletePollVote } from './poll-vote';
 import FollowingLog, { deleteFollowingLog } from './following-log';
 import FollowedLog, { deleteFollowedLog } from './followed-log';
 import SwSubscription, { deleteSwSubscription } from './sw-subscription';
+import Notification, { deleteNotification } from './notification';
 
 const User = db.get<IUser>('users');
 
@@ -246,6 +247,16 @@ export async function deleteUser(user: string | mongo.ObjectID | IUser) {
 		await SwSubscription.find({ userId: u._id })
 	).map(x => deleteSwSubscription(x)));
 
+	// このユーザーのNotificationをすべて削除
+	await Promise.all((
+		await Notification.find({ notifieeId: u._id })
+	).map(x => deleteNotification(x)));
+
+	// このユーザーが原因となったNotificationをすべて削除
+	await Promise.all((
+		await Notification.find({ notifierId: u._id })
+	).map(x => deleteNotification(x)));
+
 	// このユーザーを削除
 }