diff --git a/src/models/note.ts b/src/models/note.ts
index 466d1837c5..369a009162 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -41,6 +41,7 @@ export type INote = {
 	replyId: mongo.ObjectID;
 	renoteId: mongo.ObjectID;
 	poll: IPoll;
+	name?: string;
 	text: string;
 	tags: string[];
 	tagsLower: string[];
@@ -391,6 +392,10 @@ export const pack = async (
 	}
 	//#endregion
 
+	if (_note.name) {
+		_note.text = `【${_note.name}】\n${_note.text}`;
+	}
+
 	if (_note.user.isCat && _note.text) {
 		_note.text = (_note.text
 			// ja-JP
diff --git a/src/remote/activitypub/kernel/announce/index.ts b/src/remote/activitypub/kernel/announce/index.ts
index 3b2eeb7aa2..5f738da6c7 100644
--- a/src/remote/activitypub/kernel/announce/index.ts
+++ b/src/remote/activitypub/kernel/announce/index.ts
@@ -24,10 +24,8 @@ export default async (actor: IRemoteUser, activity: IAnnounce): Promise<void> =>
 
 	switch (object.type) {
 	case 'Note':
-		announceNote(resolver, actor, activity, object as INote);
-		break;
-
 	case 'Question':
+	case 'Article':
 		announceNote(resolver, actor, activity, object as INote);
 		break;
 
diff --git a/src/remote/activitypub/kernel/create/index.ts b/src/remote/activitypub/kernel/create/index.ts
index 2afdc01377..6e314d0b82 100644
--- a/src/remote/activitypub/kernel/create/index.ts
+++ b/src/remote/activitypub/kernel/create/index.ts
@@ -29,10 +29,8 @@ export default async (actor: IRemoteUser, activity: ICreate): Promise<void> => {
 		break;
 
 	case 'Note':
-		createNote(resolver, actor, object);
-		break;
-
 	case 'Question':
+	case 'Article':
 		createNote(resolver, actor, object);
 		break;
 
diff --git a/src/remote/activitypub/kernel/delete/index.ts b/src/remote/activitypub/kernel/delete/index.ts
index 864c9f5f7d..c9c385b1fa 100644
--- a/src/remote/activitypub/kernel/delete/index.ts
+++ b/src/remote/activitypub/kernel/delete/index.ts
@@ -21,10 +21,8 @@ export default async (actor: IRemoteUser, activity: IDelete): Promise<void> => {
 
 	switch (object.type) {
 	case 'Note':
-		deleteNote(actor, uri);
-		break;
-
 	case 'Question':
+	case 'Article':
 		deleteNote(actor, uri);
 		break;
 
diff --git a/src/remote/activitypub/models/note.ts b/src/remote/activitypub/models/note.ts
index c8939279eb..6251621527 100644
--- a/src/remote/activitypub/models/note.ts
+++ b/src/remote/activitypub/models/note.ts
@@ -57,7 +57,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 
 	const object: any = await resolver.resolve(value);
 
-	if (!object || !['Note', 'Question'].includes(object.type)) {
+	if (!object || !['Note', 'Question', 'Article'].includes(object.type)) {
 		logger.error(`invalid note: ${value}`, {
 			resolver: {
 				history: resolver.getHistory()
@@ -199,6 +199,7 @@ export async function createNote(value: any, resolver?: Resolver, silent = false
 		files,
 		reply,
 		renote: quote,
+		name: note.name,
 		cw,
 		text,
 		viaMobile: false,
diff --git a/src/server/api/endpoints/ap/show.ts b/src/server/api/endpoints/ap/show.ts
index 861c8bce2e..7f4afa1f6e 100644
--- a/src/server/api/endpoints/ap/show.ts
+++ b/src/server/api/endpoints/ap/show.ts
@@ -103,7 +103,7 @@ async function fetchAny(uri: string) {
 		};
 	}
 
-	if (['Note', 'Question'].includes(object.type)) {
+	if (['Note', 'Question', 'Article'].includes(object.type)) {
 		const note = await createNote(object.id);
 		return {
 			type: 'Note',
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 88598e1db5..5f69329a4e 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -91,6 +91,7 @@ class NotificationManager {
 
 type Option = {
 	createdAt?: Date;
+	name?: string;
 	text?: string;
 	reply?: INote;
 	renote?: INote;
@@ -437,6 +438,7 @@ async function insertNote(user: IUser, data: Option, tags: string[], emojis: str
 		fileIds: data.files ? data.files.map(file => file._id) : [],
 		replyId: data.reply ? data.reply._id : null,
 		renoteId: data.renote ? data.renote._id : null,
+		name: data.name,
 		text: data.text,
 		poll: data.poll,
 		cw: data.cw == null ? null : data.cw,