diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index ed0da44d68..91edb82e0d 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -1187,7 +1187,6 @@ admin/views/index.vue:
   users: "ユーザー"
   federation: "連合"
   announcements: "お知らせ"
-  hashtags: "ハッシュタグ"
   abuse: "スパム報告"
   queue: "ジョブキュー"
   logs: "ログ"
@@ -1230,6 +1229,8 @@ admin/views/instance.vue:
   maintainer-config: "管理者情報"
   maintainer-name: "管理者名"
   maintainer-email: "管理者の連絡先"
+  advanced-config: "その他の設定"
+  note-and-tl: "投稿とタイムライン"
   drive-config: "ドライブの設定"
   cache-remote-files: "リモートのファイルをキャッシュする"
   cache-remote-files-desc: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。そのためサーバーのストレージを節約できますが、プライバシー設定で直リンクを無効にしているユーザーにはファイルが見えなくなったり、サムネイルが生成されないので通信量が増加します。通常はこの設定をオンにしておくことをおすすめします。"
@@ -1241,6 +1242,9 @@ admin/views/instance.vue:
   enable-recaptcha: "reCAPTCHAを有効にする"
   recaptcha-site-key: "reCAPTCHA site key"
   recaptcha-secret-key: "reCAPTCHA secret key"
+  hidden-tags: "非表示ハッシュタグ"
+  hidden-tags-info: "集計から除外するハッシュタグを改行で区切って記述します。"
+  external-service-integration-config: "外部サービス連携"
   twitter-integration-config: "Twitter連携の設定"
   twitter-integration-info: "コールバックURLは {url} に設定します。"
   enable-twitter-integration: "Twitter連携を有効にする"
diff --git a/src/client/app/admin/views/hashtags.vue b/src/client/app/admin/views/hashtags.vue
deleted file mode 100644
index e1cc4b494d..0000000000
--- a/src/client/app/admin/views/hashtags.vue
+++ /dev/null
@@ -1,41 +0,0 @@
-<template>
-<div>
-	<ui-card>
-		<template #title>{{ $t('hided-tags') }}</template>
-		<section>
-			<textarea class="jdnqwkzlnxcfftthoybjxrebyolvoucw" v-model="hiddenTags"></textarea>
-			<ui-button @click="save">{{ $t('save') }}</ui-button>
-		</section>
-	</ui-card>
-</div>
-</template>
-
-<script lang="ts">
-import Vue from 'vue';
-import i18n from '../../i18n';
-
-export default Vue.extend({
-	i18n: i18n('admin/views/hashtags.vue'),
-	data() {
-		return {
-			hiddenTags: '',
-		};
-	},
-	created() {
-		this.$root.getMeta().then(meta => {
-			this.hiddenTags = meta.hiddenTags.join('\n');
-		});
-	},
-	methods: {
-		save() {
-			this.$root.api('admin/update-meta', {
-				hiddenTags: this.hiddenTags.split('\n')
-			}).then(() => {
-				//this.$root.os.apis.dialog({ text: `Saved` });
-			}).catch(e => {
-				//this.$root.os.apis.dialog({ text: `Failed ${e}` });
-			});
-		}
-	}
-});
-</script>
diff --git a/src/client/app/admin/views/index.vue b/src/client/app/admin/views/index.vue
index 4bce197edb..43e47038f3 100644
--- a/src/client/app/admin/views/index.vue
+++ b/src/client/app/admin/views/index.vue
@@ -28,7 +28,6 @@
 			<li @click="nav('federation')" :class="{ active: page == 'federation' }"><fa :icon="faGlobe" fixed-width/>{{ $t('federation') }}</li>
 			<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="faGrin" fixed-width/>{{ $t('emoji') }}</li>
 			<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>{{ $t('announcements') }}</li>
-			<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>{{ $t('hashtags') }}</li>
 			<li @click="nav('abuse')" :class="{ active: page == 'abuse' }"><fa :icon="faExclamationCircle" fixed-width/>{{ $t('abuse') }}</li>
 		</ul>
 		<div class="back-to-misskey">
@@ -48,7 +47,6 @@
 			<div v-if="page == 'users'"><x-users/></div>
 			<div v-if="page == 'emoji'"><x-emoji/></div>
 			<div v-if="page == 'announcements'"><x-announcements/></div>
-			<div v-if="page == 'hashtags'"><x-hashtags/></div>
 			<div v-if="page == 'drive'"><x-drive/></div>
 			<div v-if="page == 'federation'"><x-federation/></div>
 			<div v-if="page == 'abuse'"><x-abuse/></div>
@@ -68,7 +66,6 @@ import XLogs from "./logs.vue";
 import XModerators from "./moderators.vue";
 import XEmoji from "./emoji.vue";
 import XAnnouncements from "./announcements.vue";
-import XHashtags from "./hashtags.vue";
 import XUsers from "./users.vue";
 import XDrive from "./drive.vue";
 import XAbuse from "./abuse.vue";
@@ -91,7 +88,6 @@ export default Vue.extend({
 		XModerators,
 		XEmoji,
 		XAnnouncements,
-		XHashtags,
 		XUsers,
 		XDrive,
 		XAbuse,
diff --git a/src/client/app/admin/views/instance.vue b/src/client/app/admin/views/instance.vue
index 5cdd22296f..be9e56131e 100644
--- a/src/client/app/admin/views/instance.vue
+++ b/src/client/app/admin/views/instance.vue
@@ -2,7 +2,7 @@
 <div>
 	<ui-card>
 		<template #title><fa icon="cog"/> {{ $t('instance') }}</template>
-		<section class="fit-top fit-bottom">
+		<section class="fit-top">
 			<ui-input :value="host" readonly>{{ $t('host') }}</ui-input>
 			<ui-input v-model="name">{{ $t('instance-name') }}</ui-input>
 			<ui-textarea v-model="description">{{ $t('instance-description') }}</ui-textarea>
@@ -11,49 +11,63 @@
 			<ui-input v-model="bannerUrl"><template #icon><fa icon="link"/></template>{{ $t('banner-url') }}</ui-input>
 			<ui-input v-model="errorImageUrl"><template #icon><fa icon="link"/></template>{{ $t('error-image-url') }}</ui-input>
 			<ui-input v-model="ToSUrl"><template #icon><fa icon="link"/></template>{{ $t('tos-url') }}</ui-input>
-			<ui-input v-model="repositoryUrl"><template #icon><fa icon="link"/></template>{{ $t('repository-url') }}</ui-input>
-			<ui-input v-model="feedbackUrl"><template #icon><fa icon="link"/></template>{{ $t('feedback-url') }}</ui-input>
 			<ui-input v-model="languages"><template #icon><fa icon="language"/></template>{{ $t('languages') }}<template #desc>{{ $t('languages-desc') }}</template></ui-input>
+			<details>
+				<summary>{{ $t('advanced-config') }}</summary>
+				<ui-input v-model="repositoryUrl"><template #icon><fa icon="link"/></template>{{ $t('repository-url') }}</ui-input>
+				<ui-input v-model="feedbackUrl"><template #icon><fa icon="link"/></template>{{ $t('feedback-url') }}</ui-input>
+			</details>
 		</section>
 		<section class="fit-bottom">
 			<header><fa :icon="faHeadset"/> {{ $t('maintainer-config') }}</header>
 			<ui-input v-model="maintainerName">{{ $t('maintainer-name') }}</ui-input>
 			<ui-input v-model="maintainerEmail" type="email"><template #icon><fa :icon="farEnvelope"/></template>{{ $t('maintainer-email') }}</ui-input>
 		</section>
+		<section>
+			<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
+			<ui-button v-if="disableRegistration" @click="invite">{{ $t('invite') }}</ui-button>
+		</section>
+		<section>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa :icon="faPencilAlt"/> {{ $t('note-and-tl') }}</template>
 		<section class="fit-top fit-bottom">
 			<ui-input v-model="maxNoteTextLength">{{ $t('max-note-text-length') }}</ui-input>
 		</section>
 		<section>
-			<ui-switch v-model="disableRegistration">{{ $t('disable-registration') }}</ui-switch>
 			<ui-switch v-model="disableLocalTimeline">{{ $t('disable-local-timeline') }}</ui-switch>
 			<ui-switch v-model="disableGlobalTimeline">{{ $t('disable-global-timeline') }}</ui-switch>
 			<ui-info>{{ $t('disabling-timelines-info') }}</ui-info>
+		</section>
+		<section>
 			<ui-switch v-model="enableEmojiReaction">{{ $t('enable-emoji-reaction') }}</ui-switch>
 			<ui-switch v-model="useStarForReactionFallback">{{ $t('use-star-for-reaction-fallback') }}</ui-switch>
 		</section>
-		<section class="fit-bottom">
-			<header><fa icon="cloud"/> {{ $t('drive-config') }}</header>
+		<section>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa icon="cloud"/> {{ $t('drive-config') }}</template>
+		<section>
 			<ui-switch v-model="cacheRemoteFiles">{{ $t('cache-remote-files') }}<template #desc>{{ $t('cache-remote-files-desc') }}</template></ui-switch>
+		</section>
+		<section class="fit-top fit-bottom">
 			<ui-input v-model="localDriveCapacityMb" type="number">{{ $t('local-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
 			<ui-input v-model="remoteDriveCapacityMb" type="number" :disabled="!cacheRemoteFiles">{{ $t('remote-drive-capacity-mb') }}<template #suffix>MB</template><template #desc>{{ $t('mb') }}</template></ui-input>
 		</section>
-		<section class="fit-bottom">
-			<header><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</header>
-			<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
-			<ui-info>{{ $t('recaptcha-info') }}</ui-info>
-			<ui-horizon-group inputs>
-				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
-				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
-			</ui-horizon-group>
-		</section>
 		<section>
-			<header><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</header>
-			<ui-info>{{ $t('proxy-account-info') }}</ui-info>
-			<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
-			<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
 		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa :icon="farEnvelope"/> {{ $t('email-config') }}</template>
 		<section>
-			<header><fa :icon="farEnvelope"/> {{ $t('email-config') }}</header>
 			<ui-switch v-model="enableEmail">{{ $t('enable-email') }}<template #desc>{{ $t('email-config-info') }}</template></ui-switch>
 			<ui-input v-model="email" type="email" :disabled="!enableEmail">{{ $t('email') }}</ui-input>
 			<ui-horizon-group inputs>
@@ -63,12 +77,30 @@
 			<ui-switch v-model="smtpAuth">{{ $t('smtp-auth') }}</ui-switch>
 			<ui-horizon-group inputs>
 				<ui-input v-model="smtpUser" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-user') }}</ui-input>
-				<ui-input v-model="smtpPass" type="password" :withPasswordToggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
+				<ui-input v-model="smtpPass" type="password" :with-password-toggle="true" :disabled="!enableEmail || !smtpAuth">{{ $t('smtp-pass') }}</ui-input>
 			</ui-horizon-group>
 			<ui-switch v-model="smtpSecure" :disabled="!enableEmail">{{ $t('smtp-secure') }}<template #desc>{{ $t('smtp-secure-info') }}</template></ui-switch>
 		</section>
 		<section>
-			<header><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</header>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa :icon="faGhost"/> {{ $t('proxy-account-config') }}</template>
+		<section>
+			<ui-info>{{ $t('proxy-account-info') }}</ui-info>
+			<ui-input v-model="proxyAccount"><template #prefix>@</template>{{ $t('proxy-account-username') }}<template #desc>{{ $t('proxy-account-username-desc') }}</template></ui-input>
+			<ui-info warn>{{ $t('proxy-account-warn') }}</ui-info>
+		</section>
+		<section>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa :icon="faBolt"/> {{ $t('serviceworker-config') }}</template>
+		<section>
 			<ui-switch v-model="enableServiceWorker">{{ $t('enable-serviceworker') }}<template #desc>{{ $t('serviceworker-info') }}</template></ui-switch>
 			<ui-info>{{ $t('vapid-info') }}<br><code>npm i web-push -g<br>web-push generate-vapid-keys</code></ui-info>
 			<ui-horizon-group inputs class="fit-bottom">
@@ -77,11 +109,22 @@
 			</ui-horizon-group>
 		</section>
 		<section>
-			<header>summaly Proxy</header>
-			<ui-input v-model="summalyProxy">URL</ui-input>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+		</section>
+	</ui-card>
+
+	<ui-card>
+		<template #title><fa :icon="faShieldAlt"/> {{ $t('recaptcha-config') }}</template>
+		<section class="fit-bottom">
+			<ui-switch v-model="enableRecaptcha">{{ $t('enable-recaptcha') }}</ui-switch>
+			<ui-info>{{ $t('recaptcha-info') }}</ui-info>
+			<ui-horizon-group inputs>
+				<ui-input v-model="recaptchaSiteKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-site-key') }}</ui-input>
+				<ui-input v-model="recaptchaSecretKey" :disabled="!enableRecaptcha"><template #icon><fa icon="key"/></template>{{ $t('recaptcha-secret-key') }}</ui-input>
+			</ui-horizon-group>
 		</section>
 		<section>
-			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
 		</section>
 	</ui-card>
 
@@ -91,56 +134,67 @@
 			<ui-textarea v-model="pinnedUsers">
 				<template #desc>{{ $t('pinned-users-info') }}</template>
 			</ui-textarea>
-			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
 		</section>
 	</ui-card>
 
 	<ui-card>
-		<template #title>{{ $t('invite') }}</template>
-		<section>
-			<ui-button @click="invite">{{ $t('invite') }}</ui-button>
-			<p v-if="inviteCode">Code: <code>{{ inviteCode }}</code></p>
-		</section>
-	</ui-card>
-
-	<ui-card>
-		<template #title><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</template>
+		<template #title><fa :icon="faShieldAlt"/> {{ $t('external-service-integration-config') }}</template>
 		<section>
+			<header><fa :icon="['fab', 'twitter']"/> {{ $t('twitter-integration-config') }}</header>
 			<ui-switch v-model="enableTwitterIntegration">{{ $t('enable-twitter-integration') }}</ui-switch>
 			<ui-horizon-group>
 				<ui-input v-model="twitterConsumerKey" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-key') }}</ui-input>
 				<ui-input v-model="twitterConsumerSecret" :disabled="!enableTwitterIntegration"><template #icon><fa icon="key"/></template>{{ $t('twitter-integration-consumer-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('twitter-integration-info', { url: `${url}/api/tw/cb` }) }}</ui-info>
-			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
 		</section>
-	</ui-card>
-
-	<ui-card>
-		<template #title><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</template>
 		<section>
+			<header><fa :icon="['fab', 'github']"/> {{ $t('github-integration-config') }}</header>
 			<ui-switch v-model="enableGithubIntegration">{{ $t('enable-github-integration') }}</ui-switch>
 			<ui-horizon-group>
 				<ui-input v-model="githubClientId" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-id') }}</ui-input>
 				<ui-input v-model="githubClientSecret" :disabled="!enableGithubIntegration"><template #icon><fa icon="key"/></template>{{ $t('github-integration-client-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('github-integration-info', { url: `${url}/api/gh/cb` }) }}</ui-info>
-			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
 		</section>
-	</ui-card>
-
-	<ui-card>
-		<template #title><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</template>
 		<section>
+			<header><fa :icon="['fab', 'discord']"/> {{ $t('discord-integration-config') }}</header>
 			<ui-switch v-model="enableDiscordIntegration">{{ $t('enable-discord-integration') }}</ui-switch>
 			<ui-horizon-group>
 				<ui-input v-model="discordClientId" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-id') }}</ui-input>
 				<ui-input v-model="discordClientSecret" :disabled="!enableDiscordIntegration"><template #icon><fa icon="key"/></template>{{ $t('discord-integration-client-secret') }}</ui-input>
 			</ui-horizon-group>
 			<ui-info>{{ $t('discord-integration-info', { url: `${url}/api/dc/cb` }) }}</ui-info>
-			<ui-button @click="updateMeta">{{ $t('save') }}</ui-button>
+		</section>
+		<section>
+			<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
 		</section>
 	</ui-card>
+
+	<details>
+		<summary style="color:var(--text);">{{ $t('advanced-config') }}</summary>
+
+		<ui-card>
+			<template #title><fa :icon="faHashtag"/> {{ $t('hidden-tags') }}</template>
+			<section class="fit-top">
+				<ui-textarea v-model="hiddenTags">
+					<template #desc>{{ $t('hidden-tags-info') }}</template>
+				</ui-textarea>
+				<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+			</section>
+		</ui-card>
+
+		<ui-card>
+			<template #title>summaly Proxy</template>
+			<section class="fit-top fit-bottom">
+				<ui-input v-model="summalyProxy">URL</ui-input>
+			</section>
+			<section>
+				<ui-button @click="updateMeta"><fa :icon="faSave"/> {{ $t('save') }}</ui-button>
+			</section>
+		</ui-card>
+	</details>
 </div>
 </template>
 
@@ -149,8 +203,8 @@ import Vue from 'vue';
 import i18n from '../../i18n';
 import { url, host } from '../../config';
 import { toUnicode } from 'punycode';
-import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt, faThumbtack } from '@fortawesome/free-solid-svg-icons';
-import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons';
+import { faHeadset, faShieldAlt, faGhost, faUserPlus, faBolt, faThumbtack, faPencilAlt, faHashtag } from '@fortawesome/free-solid-svg-icons';
+import { faEnvelope as farEnvelope, faSave } from '@fortawesome/free-regular-svg-icons';
 
 export default Vue.extend({
 	i18n: i18n('admin/views/instance.vue'),
@@ -193,7 +247,6 @@ export default Vue.extend({
 			discordClientId: null,
 			discordClientSecret: null,
 			proxyAccount: null,
-			inviteCode: null,
 			summalyProxy: null,
 			enableEmail: false,
 			email: null,
@@ -207,7 +260,8 @@ export default Vue.extend({
 			swPublicKey: null,
 			swPrivateKey: null,
 			pinnedUsers: '',
-			faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt, faThumbtack
+			hiddenTags: '',
+			faHeadset, faShieldAlt, faGhost, faUserPlus, farEnvelope, faBolt, faThumbtack, faPencilAlt, faSave, faHashtag
 		};
 	},
 
@@ -260,13 +314,17 @@ export default Vue.extend({
 			this.swPublicKey = meta.swPublickey;
 			this.swPrivateKey = meta.swPrivateKey;
 			this.pinnedUsers = meta.pinnedUsers.join('\n');
+			this.hiddenTags = meta.hiddenTags.join('\n');
 		});
 	},
 
 	methods: {
 		invite() {
 			this.$root.api('admin/invite').then(x => {
-				this.inviteCode = x.code;
+				this.$root.dialog({
+					type: 'info',
+					text: x.code
+				});
 			}).catch(e => {
 				this.$root.dialog({
 					type: 'error',
@@ -322,7 +380,8 @@ export default Vue.extend({
 				enableServiceWorker: this.enableServiceWorker,
 				swPublicKey: this.swPublicKey,
 				swPrivateKey: this.swPrivateKey,
-				pinnedUsers: this.pinnedUsers.split('\n')
+				pinnedUsers: this.pinnedUsers.split('\n'),
+				hiddenTags: this.hiddenTags.split('\n'),
 			}).then(() => {
 				this.$root.dialog({
 					type: 'success',