diff --git a/src/models/note.ts b/src/models/note.ts
index 717960bb23..e76fc88a41 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -18,6 +18,7 @@ Note.createIndex('uri', { sparse: true, unique: true });
 Note.createIndex('userId');
 Note.createIndex('mentions');
 Note.createIndex('visibleUserIds');
+Note.createIndex('replyId');
 Note.createIndex('tagsLower');
 Note.createIndex('_user.host');
 Note.createIndex('_files._id');
@@ -99,7 +100,6 @@ export type INote = {
 		host: string;
 		inbox?: string;
 	};
-	_replyIds?: mongo.ObjectID[];
 	_files?: IDriveFile[];
 };
 
@@ -258,6 +258,8 @@ export const pack = async (
 	delete _note._reply;
 	delete _note._renote;
 	delete _note._files;
+	delete _note._replyIds;
+
 	if (_note.geo) delete _note.geo.type;
 
 	// Populate user
diff --git a/src/server/api/endpoints/notes/replies.ts b/src/server/api/endpoints/notes/replies.ts
index 6046b9b310..6c2b690ab2 100644
--- a/src/server/api/endpoints/notes/replies.ts
+++ b/src/server/api/endpoints/notes/replies.ts
@@ -33,16 +33,13 @@ export const meta = {
 };
 
 export default define(meta, (ps, user) => new Promise(async (res, rej) => {
-	// Lookup note
-	const note = await Note.findOne({
-		_id: ps.noteId
-	});
 
-	if (note === null) {
-		return rej('note not found');
-	}
+	const notes = await Note.find({
+			replyId: ps.noteId
+		}, {
+			limit: ps.limit,
+			skip: ps.offset
+		});
 
-	const ids = (note._replyIds || []).slice(ps.offset, ps.offset + ps.limit);
-
-	res(await packMany(ids, user));
+	res(await packMany(notes, user));
 }));
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index eac0185e7a..5e4dfd22ea 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -622,9 +622,6 @@ function saveQuote(renote: INote, note: INote) {
 
 function saveReply(reply: INote, note: INote) {
 	Note.update({ _id: reply._id }, {
-		$push: {
-			_replyIds: note._id
-		},
 		$inc: {
 			repliesCount: 1
 		}