diff --git a/README.md b/README.md
index a05fbe657b..8b89c01ac3 100644
--- a/README.md
+++ b/README.md
@@ -85,7 +85,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
 	</tr>
 </table>
 
-:heart: Backers & Sponsors
+:heart: Backers
 ----------------------------------------------------------------
 <!-- PATREON_START -->
 <table><tr>
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 4b3bb98611..f94e6b4785 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -360,8 +360,8 @@ common/views/components/user-menu.vue:
   report-abuse: "Report abuse"
   report-abuse-detail: "What kind of nuisance did you encounter?"
   report-abuse-reported: "The issue has been reported to the administrator. Your cooperation is much appreciated."
-  silence: "Make Silence"
-  unsilence: "Unsilence"
+  silence: "Mute"
+  unsilence: "Unmute"
   suspend: "Suspend"
   unsuspend: "Unsuspend"
 common/views/components/poll.vue:
@@ -1147,8 +1147,8 @@ admin/views/users.vue:
   unsuspend: "Unsuspend"
   unsuspend-confirm: "Are you sure you want to unsuspend this account?"
   unsuspended: "The user has successfully unsuspended."
-  make-silence: "Make Silence"
-  unmake-silence: "Unmake Silence"
+  make-silence: "Mute"
+  unmake-silence: "Unmute"
   verify: "Verify account"
   verify-confirm: "Do you want this to be a verified account?"
   verified: "The account is now being verified"
diff --git a/locales/index.d.ts b/locales/index.d.ts
new file mode 100644
index 0000000000..4a9672c63f
--- /dev/null
+++ b/locales/index.d.ts
@@ -0,0 +1,5 @@
+type Locale = { [key: string]: string };
+
+declare const locales: { [lang: string]: Locale };
+
+export default locales;
diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml
index ea549dfd67..d32d2ea59c 100644
--- a/locales/pl-PL.yml
+++ b/locales/pl-PL.yml
@@ -356,7 +356,7 @@ common/views/components/user-menu.vue:
   block: "Zablokuj"
   unblock: "Odblokuj"
   push-to-list: "Dodaj do listy"
-  select-list: "リストを選択してください"
+  select-list: "Wybierz listę"
   report-abuse: "Zgłoś nadużycie"
   report-abuse-detail: "どのような迷惑行為を行っていますか?"
   report-abuse-reported: "管理者に報告されました。ご協力ありがとうございました。"
@@ -395,11 +395,11 @@ common/views/components/signin.vue:
   token: "Token"
   signing-in: "Logowanie…"
   signin: "Zaloguj"
-  or: "または"
+  or: "lub"
   signin-with-twitter: "Zaloguj się za pomocą Twittera"
   signin-with-github: "Zaloguj się za pomocą GitHuba"
   signin-with-discord: "Zaloguj się za pomocą Discorda"
-  login-failed: "ログインできませんでした。ユーザー名とパスワードを確認してください。"
+  login-failed: "Logowanie nie powiodło się. Upewnij się, że podałeś prawidłową nazwę użytkownika i hasło."
 common/views/components/signup.vue:
   invitation-code: "Kod zaproszenia"
   invitation-info: "招待コードをお持ちでない方は、<a href=\"{}\">管理者</a>までご連絡ください。"
@@ -472,13 +472,13 @@ common/views/components/visibility-chooser.vue:
   local-followers: "Dla śledzących (tylko lokalnie)"
 common/views/components/trends.vue:
   count: "{}人が投稿"
-  empty: "トレンドなし"
+  empty: "Brak popularnych hashtagów"
 common/views/components/language-settings.vue:
   title: "Język"
   pick-language: "Wybierz język"
   recommended: "Zalecane"
   auto: "Automatyczny"
-  specify-language: "言語を指定"
+  specify-language: "Wybierz język"
   info: "Musisz odświeżyć stronę, aby zmiany zostały uwzględnione."
 common/views/components/profile-editor.vue:
   title: "Twój profil"
@@ -504,15 +504,15 @@ common/views/components/profile-editor.vue:
   upload-failed: "Wysyłanie nie powiodło się"
   email: "Ustawienia e-mail"
   email-address: "Adres e-mail"
-  email-verified: "メールアドレスが確認されました"
+  email-verified: "Twój adres e-mail został zweryfikowany."
   email-not-verified: "メールアドレスが確認されていません。メールボックスをご確認ください。"
 common/views/components/user-list-editor.vue:
   users: "Użytkownicy"
   rename: "Zmień nazwę listy"
   delete: "Usuń listę"
   remove-user: "Usuń z tej listy"
-  delete-are-you-sure: "リスト「$1」を削除しますか?"
-  deleted: "削除しました"
+  delete-are-you-sure: "Usunąć listę \"$1\"?"
+  deleted: "Usunięto"
 common/views/widgets/broadcast.vue:
   fetching: "Sprawdzanie"
   no-broadcasts: "Brak transmisji"
@@ -595,7 +595,7 @@ desktop/views/components/activity.vue:
   title: "Aktywność"
   toggle: "Przełącz widok"
 desktop/views/components/calendar.vue:
-  title: "{year}年 {month}月"
+  title: "{year} / {month}"
   prev: "Poprzedni miesiąc"
   next: "Następny miesiąc"
   go: "Naciśnij, aby przejść"
@@ -706,7 +706,7 @@ desktop/views/components/note.vue:
   add-reaction: "Dodaj reakcję"
   undo-reaction: "リアクション解除"
   detail: "Szczegóły"
-  private: "この投稿は非公開です"
+  private: "Ten wpis jest prywatny"
   deleted: "この投稿は削除されました"
 desktop/views/components/notes.vue:
   error: "Ładowanie nie powiodło się."
@@ -1011,7 +1011,7 @@ admin/views/abuse.vue:
   target: "対象"
   reporter: "報告者"
   details: "詳細"
-  remove-report: "削除"
+  remove-report: "Usuń"
 admin/views/instance.vue:
   instance: "インスタンス"
   instance-name: "インスタンス名"
diff --git a/package.json b/package.json
index e4969ade31..53cdbdb433 100644
--- a/package.json
+++ b/package.json
@@ -48,6 +48,7 @@
 		"@types/is-svg": "3.0.0",
 		"@types/is-url": "1.2.28",
 		"@types/js-yaml": "3.12.0",
+		"@types/jsdom": "12.2.1",
 		"@types/katex": "0.5.0",
 		"@types/koa": "2.0.48",
 		"@types/koa-bodyparser": "5.0.2",
@@ -220,7 +221,7 @@
 		"ts-loader": "5.3.3",
 		"ts-node": "7.0.1",
 		"tslint": "5.12.0",
-		"tslint-sonarts": "1.8.0",
+		"tslint-sonarts": "1.9.0",
 		"typescript": "3.2.4",
 		"typescript-eslint-parser": "21.0.2",
 		"uglify-es": "3.3.9",
diff --git a/src/@types/const.json.d.ts b/src/@types/const.json.d.ts
new file mode 100644
index 0000000000..40a96f2a2a
--- /dev/null
+++ b/src/@types/const.json.d.ts
@@ -0,0 +1,3 @@
+declare module '*/const.json' {
+	const copyright: string;
+}
diff --git a/src/@types/deepcopy.d.ts b/src/@types/deepcopy.d.ts
index afeee51913..3eb08d5772 100644
--- a/src/@types/deepcopy.d.ts
+++ b/src/@types/deepcopy.d.ts
@@ -8,7 +8,7 @@ declare namespace deepcopy {
 		valueType: DeepcopyCustomizerValueType) => T;
 
 	interface DeepcopyOptions<T> {
-		customizer: DeepcopyCustomizer<T>
+		customizer: DeepcopyCustomizer<T>;
 	}
 
 	export function deepcopy<T>(
diff --git a/src/@types/escape-regexp.d.ts b/src/@types/escape-regexp.d.ts
new file mode 100644
index 0000000000..d68e6048a1
--- /dev/null
+++ b/src/@types/escape-regexp.d.ts
@@ -0,0 +1,7 @@
+declare module 'escape-regexp' {
+	function escapeRegExp(str: string): string;
+
+	namespace escapeRegExp {} // Hack
+
+	export = escapeRegExp;
+}
diff --git a/src/@types/koa-slow.d.ts b/src/@types/koa-slow.d.ts
new file mode 100644
index 0000000000..a7908d8607
--- /dev/null
+++ b/src/@types/koa-slow.d.ts
@@ -0,0 +1,14 @@
+declare module 'koa-slow' {
+	import { Middleware } from 'koa';
+
+	interface ISlowOptions {
+		url?: RegExp;
+		delay?: number;
+	}
+
+	function slow(options?: ISlowOptions): Middleware;
+
+	namespace slow { } // Hack
+
+	export = slow;
+}
diff --git a/src/@types/langmap.d.ts b/src/@types/langmap.d.ts
new file mode 100644
index 0000000000..a0f99028ab
--- /dev/null
+++ b/src/@types/langmap.d.ts
@@ -0,0 +1,10 @@
+declare module 'langmap' {
+	type Lang = {
+		nativeName: string;
+		englishName: string;
+	};
+
+	const langmap: { [lang: string]: Lang };
+
+	export = langmap;
+}
diff --git a/src/@types/os-utils.d.ts b/src/@types/os-utils.d.ts
new file mode 100644
index 0000000000..390df17d39
--- /dev/null
+++ b/src/@types/os-utils.d.ts
@@ -0,0 +1,30 @@
+declare module 'os-utils' {
+	type FreeCommandCallback = (usedmem: number) => void;
+
+	type HarddriveCallback = (total: number, free: number, used: number) => void;
+
+	type GetProcessesCallback = (result: string) => void;
+
+	type CPUCallback = (perc: number) => void;
+
+	export function platform(): NodeJS.Platform;
+	export function cpuCount(): number;
+	export function sysUptime(): number;
+	export function processUptime(): number;
+
+	export function freemem(): number;
+	export function totalmem(): number;
+	export function freememPercentage(): number;
+	export function freeCommand(callback: FreeCommandCallback): void;
+
+	export function harddrive(callback: HarddriveCallback): void;
+
+	export function getProcesses(callback: GetProcessesCallback): void;
+	export function getProcesses(nProcess: number, callback: GetProcessesCallback): void;
+
+	export function allLoadavg(): string;
+	export function loadavg(_time?: number): number;
+
+	export function cpuFree(callback: CPUCallback): void;
+	export function cpuUsage(callback: CPUCallback): void;
+}
diff --git a/src/@types/recaptcha-promise.d.ts b/src/@types/recaptcha-promise.d.ts
new file mode 100644
index 0000000000..cfbd5eebf2
--- /dev/null
+++ b/src/@types/recaptcha-promise.d.ts
@@ -0,0 +1,16 @@
+declare module 'recaptcha-promise' {
+	interface IVerifyOptions {
+		secret_key?: string;
+	}
+
+	interface IVerify {
+		(response: string, remoteAddress?: string): Promise<boolean>;
+		init(options: IVerifyOptions): IVerify;
+	}
+
+	namespace recaptchaPromise {} // Hack
+
+	const verify: IVerify;
+
+	export = verify;
+}
diff --git a/src/daemons/server-stats.ts b/src/daemons/server-stats.ts
index 6028277b25..b82f421779 100644
--- a/src/daemons/server-stats.ts
+++ b/src/daemons/server-stats.ts
@@ -3,7 +3,7 @@ import * as sysUtils from 'systeminformation';
 import * as diskusage from 'diskusage';
 import * as Deque from 'double-ended-queue';
 import Xev from 'xev';
-const osUtils = require('os-utils');
+import * as osUtils from 'os-utils';
 
 const ev = new Xev();
 
diff --git a/src/mfm/toHtml.ts b/src/mfm/toHtml.ts
index 85e8c8a7fe..e67ccc5035 100644
--- a/src/mfm/toHtml.ts
+++ b/src/mfm/toHtml.ts
@@ -1,5 +1,4 @@
-const jsdom = require('jsdom');
-const { JSDOM } = jsdom;
+import { JSDOM } from 'jsdom';
 import config from '../config';
 import { INote } from '../models/note';
 import { intersperse } from '../prelude/array';
@@ -158,9 +157,9 @@ export function toHtml(tokens: MfmForest, mentionedRemoteUsers: INote['mentioned
 
 		text(token) {
 			const el = doc.createElement('span');
-			const nodes = (token.node.props.text as string).split(/\r\n|\r|\n/).map(x => doc.createTextNode(x));
+			const nodes = (token.node.props.text as string).split(/\r\n|\r|\n/).map(x => doc.createTextNode(x) as Node);
 
-			for (const x of intersperse('br', nodes)) {
+			for (const x of intersperse<Node | 'br'>('br', nodes)) {
 				el.appendChild(x === 'br' ? doc.createElement('br') : x);
 			}
 
diff --git a/src/server/api/endpoints/hashtags/search.ts b/src/server/api/endpoints/hashtags/search.ts
index 4d753808d4..d8a2156357 100644
--- a/src/server/api/endpoints/hashtags/search.ts
+++ b/src/server/api/endpoints/hashtags/search.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import Hashtag from '../../../../models/hashtag';
 import define from '../../define';
-const escapeRegexp = require('escape-regexp');
+import * as escapeRegexp from 'escape-regexp';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 4b02e393bf..d087687a51 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -9,7 +9,7 @@ import getDriveFileUrl from '../../../../misc/get-drive-file-url';
 import { parse, parsePlain } from '../../../../mfm/parse';
 import extractEmojis from '../../../../misc/extract-emojis';
 import extractHashtags from '../../../../misc/extract-hashtags';
-const langmap = require('langmap');
+import * as langmap from 'langmap';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index 86b16dcbb1..b0a789c7d5 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -1,5 +1,5 @@
 import $ from 'cafy';
-const escapeRegexp = require('escape-regexp');
+import * as escapeRegexp from 'escape-regexp';
 import User, { pack, validateUsername, IUser } from '../../../../models/user';
 import define from '../../define';
 
diff --git a/src/server/api/private/signup.ts b/src/server/api/private/signup.ts
index b89629bcd1..6318eabdb8 100644
--- a/src/server/api/private/signup.ts
+++ b/src/server/api/private/signup.ts
@@ -8,14 +8,13 @@ import Meta from '../../../models/meta';
 import RegistrationTicket from '../../../models/registration-tickets';
 import usersChart from '../../../chart/users';
 import fetchMeta from '../../../misc/fetch-meta';
+import * as recaptcha from 'recaptcha-promise';
 
 export default async (ctx: Koa.BaseContext) => {
 	const body = ctx.request.body as any;
 
 	const instance = await fetchMeta();
 
-	const recaptcha = require('recaptcha-promise');
-
 	// Verify recaptcha
 	// ただしテスト時はこの機構は障害となるため無効にする
 	if (process.env.NODE_ENV !== 'test' && instance.enableRecaptcha) {
diff --git a/src/server/index.ts b/src/server/index.ts
index 57f1326f2f..be0a6f5c77 100644
--- a/src/server/index.ts
+++ b/src/server/index.ts
@@ -13,7 +13,7 @@ import * as mount from 'koa-mount';
 import * as compress from 'koa-compress';
 import * as koaLogger from 'koa-logger';
 import * as requestStats from 'request-stats';
-//const slow = require('koa-slow');
+//import * as slow from 'koa-slow';
 
 import activityPub from './activitypub';
 import webFinger from './webfinger';
diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts
index f823c308c2..0597f50a9c 100644
--- a/src/server/web/docs.ts
+++ b/src/server/web/docs.ts
@@ -14,9 +14,9 @@ import * as glob from 'glob';
 import * as yaml from 'js-yaml';
 import config from '../../config';
 import { licenseHtml } from '../../misc/license';
-const constants = require('../../const.json');
+import { copyright } from '../../const.json';
 import endpoints from '../api/endpoints';
-const locales = require('../../../locales');
+import locales from '../../../locales';
 import * as nestedProperty from 'nested-property';
 
 function getLang(lang: string): string {
@@ -59,7 +59,7 @@ async function genVars(lang: string): Promise<{ [key: string]: any }> {
 
 	vars['config'] = config;
 
-	vars['copyright'] = constants.copyright;
+	vars['copyright'] = copyright;
 
 	vars['license'] = licenseHtml;