diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index d091b63235..f90f906509 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -363,6 +363,7 @@ common/views/components/note-menu.vue:
   detail: "詳細"
   copy-link: "リンクをコピー"
   favorite: "お気に入り"
+  unfavorite: "お気に入り解除"
   pin: "ピン留め"
   unpin: "ピン留め解除"
   delete: "削除"
diff --git a/src/client/app/common/views/components/note-menu.vue b/src/client/app/common/views/components/note-menu.vue
index 6030e4fd30..21713e56a0 100644
--- a/src/client/app/common/views/components/note-menu.vue
+++ b/src/client/app/common/views/components/note-menu.vue
@@ -22,11 +22,21 @@ export default Vue.extend({
 				icon: '%fa:link%',
 				text: '%i18n:@copy-link%',
 				action: this.copyLink
-			}, null, {
-				icon: '%fa:star%',
-				text: '%i18n:@favorite%',
-				action: this.favorite
-			}];
+			}, null];
+
+			if (this.note.isFavorited) {
+				items.push({
+					icon: '%fa:star%',
+					text: '%i18n:@unfavorite%',
+					action: this.unfavorite
+				});
+			} else {
+				items.push({
+					icon: '%fa:star%',
+					text: '%i18n:@favorite%',
+					action: this.favorite
+				});
+			}
 
 			if (this.note.userId == this.$store.state.i.id) {
 				if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
@@ -45,6 +55,7 @@ export default Vue.extend({
 			}
 
 			if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
+				items.push(null);
 				items.push({
 					icon: '%fa:trash-alt R%',
 					text: '%i18n:@delete%',
@@ -110,6 +121,15 @@ export default Vue.extend({
 			});
 		},
 
+		unfavorite() {
+			(this as any).api('notes/favorites/delete', {
+				noteId: this.note.id
+			}).then(() => {
+				(this as any).os.new(Ok);
+				this.destroyDom();
+			});
+		},
+
 		closed() {
 			this.$nextTick(() => {
 				this.destroyDom();
diff --git a/src/models/favorite.ts b/src/models/favorite.ts
index 4824a6dbaa..9acaec5c59 100644
--- a/src/models/favorite.ts
+++ b/src/models/favorite.ts
@@ -75,7 +75,9 @@ export const pack = (
 	delete _favorite._id;
 
 	// Populate note
-	_favorite.note = await packNote(_favorite.noteId, me);
+	_favorite.note = await packNote(_favorite.noteId, me, {
+		detail: true
+	});
 
 	// (データベースの不具合などで)投稿が見つからなかったら
 	if (_favorite.note == null) {
diff --git a/src/models/note.ts b/src/models/note.ts
index a47fd098c7..e6bdbe0b8b 100644
--- a/src/models/note.ts
+++ b/src/models/note.ts
@@ -358,8 +358,8 @@ export const pack = async (
 			})(_note.poll);
 		}
 
-		// Fetch my reaction
 		if (meId) {
+			// Fetch my reaction
 			_note.myReaction = (async () => {
 				const reaction = await Reaction
 					.findOne({
@@ -374,6 +374,19 @@ export const pack = async (
 
 				return null;
 			})();
+
+			// isFavorited
+			_note.isFavorited = (async () => {
+				const favorite = await Favorite
+					.count({
+						userId: meId,
+						noteId: id
+					}, {
+						limit: 1
+					});
+
+				return favorite === 1;
+			})();
 		}
 	}