diff --git a/src/processor/db/delete-post-dependents.ts b/src/processor/db/delete-post-dependents.ts
new file mode 100644
index 000000000..879c41ec9
--- /dev/null
+++ b/src/processor/db/delete-post-dependents.ts
@@ -0,0 +1,22 @@
+import Favorite from '../../models/favorite';
+import Notification from '../../models/notification';
+import PollVote from '../../models/poll-vote';
+import PostReaction from '../../models/post-reaction';
+import PostWatching from '../../models/post-watching';
+import Post from '../../models/post';
+
+export default async ({ data }) => Promise.all([
+	Favorite.remove({ postId: data._id }),
+	Notification.remove({ postId: data._id }),
+	PollVote.remove({ postId: data._id }),
+	PostReaction.remove({ postId: data._id }),
+	PostWatching.remove({ postId: data._id }),
+	Post.find({ repostId: data._id }).then(reposts => Promise.all([
+		Notification.remove({
+			postId: {
+				$in: reposts.map(({ _id }) => _id)
+			}
+		}),
+		Post.remove({ repostId: data._id })
+	]))
+]);
diff --git a/src/processor/db/index.ts b/src/processor/db/index.ts
new file mode 100644
index 000000000..75838c099
--- /dev/null
+++ b/src/processor/db/index.ts
@@ -0,0 +1,7 @@
+import deletePostDependents from './delete-post-dependents';
+
+const handlers = {
+  deletePostDependents
+};
+
+export default (job, done) => handlers[job.data.type](job).then(() => done(), done);
diff --git a/src/processor/index.ts b/src/processor/index.ts
index cd271d372..172048dda 100644
--- a/src/processor/index.ts
+++ b/src/processor/index.ts
@@ -1,13 +1,18 @@
 import queue from '../queue';
+import db from './db';
 import http from './http';
 
-/*
-	256 is the default concurrency limit of Mozilla Firefox and Google
-	Chromium.
+export default () => {
+	queue.process('db', db);
 
-	a8af215e691f3a2205a3758d2d96e9d328e100ff - chromium/src.git - Git at Google
-	https://chromium.googlesource.com/chromium/src.git/+/a8af215e691f3a2205a3758d2d96e9d328e100ff
-	Network.http.max-connections - MozillaZine Knowledge Base
-	http://kb.mozillazine.org/Network.http.max-connections
-*/
-export default () => queue.process('http', 256, http);
+	/*
+		256 is the default concurrency limit of Mozilla Firefox and Google
+		Chromium.
+
+		a8af215e691f3a2205a3758d2d96e9d328e100ff - chromium/src.git - Git at Google
+		https://chromium.googlesource.com/chromium/src.git/+/a8af215e691f3a2205a3758d2d96e9d328e100ff
+		Network.http.max-connections - MozillaZine Knowledge Base
+		http://kb.mozillazine.org/Network.http.max-connections
+	*/
+	queue.process('http', 256, http);
+};
diff --git a/src/remote/activitypub/act/delete/index.ts b/src/remote/activitypub/act/delete/index.ts
new file mode 100644
index 000000000..eabf9a043
--- /dev/null
+++ b/src/remote/activitypub/act/delete/index.ts
@@ -0,0 +1,24 @@
+import create from '../../create';
+import deletePost from './post';
+
+export default async (resolver, actor, activity) => {
+	if ('actor' in activity && actor.account.uri !== activity.actor) {
+		throw new Error();
+	}
+
+	const results = await create(resolver, actor, activity.object);
+
+	await Promise.all(results.map(async promisedResult => {
+		const result = await promisedResult;
+		if (result === null) {
+			return;
+		}
+
+		switch (result.object.$ref) {
+		case 'posts':
+			await deletePost(result.object);
+		}
+	}));
+
+	return null;
+};
diff --git a/src/remote/activitypub/act/delete/post.ts b/src/remote/activitypub/act/delete/post.ts
new file mode 100644
index 000000000..1b748afe8
--- /dev/null
+++ b/src/remote/activitypub/act/delete/post.ts
@@ -0,0 +1,10 @@
+import Post from '../../../../models/post';
+import queue from '../../../../queue';
+
+export default ({ $id }) => Promise.all([
+	Post.findOneAndDelete({ _id: $id }),
+	new Promise((resolve, reject) => queue.create('db', {
+		type: 'deletePostDependents',
+		id: $id
+	}).delay(65536).save(error => error ? reject(error) : resolve()))
+]);
diff --git a/src/remote/activitypub/act/index.ts b/src/remote/activitypub/act/index.ts
index 030f1cf25..d282e1288 100644
--- a/src/remote/activitypub/act/index.ts
+++ b/src/remote/activitypub/act/index.ts
@@ -1,4 +1,5 @@
 import create from './create';
+import performDeleteActivity from './delete';
 import follow from './follow';
 import undo from './undo';
 import createObject from '../create';
@@ -19,6 +20,9 @@ export default async (parentResolver: Resolver, actor, value, distribute?: boole
 		case 'Create':
 			return create(resolver, actor, object, distribute);
 
+		case 'Delete':
+			return performDeleteActivity(resolver, actor, object);
+
 		case 'Follow':
 			return follow(resolver, actor, object, distribute);