diff --git a/package.json b/package.json
index ca6db98ca..27af69a4c 100644
--- a/package.json
+++ b/package.json
@@ -13,8 +13,8 @@
 		"start": "node ./built",
 		"debug": "DEBUG=misskey:* node ./built",
 		"swagger": "node ./swagger.js",
-		"build": "./node_modules/.bin/webpack --config ./webpack/webpack.config.ts && gulp build",
-		"webpack": "./node_modules/.bin/webpack --config ./webpack/webpack.config.ts",
+		"build": "./node_modules/.bin/webpack && gulp build",
+		"webpack": "./node_modules/.bin/webpack",
 		"gulp": "gulp build",
 		"rebuild": "gulp rebuild",
 		"clean": "gulp clean",
diff --git a/webpack/webpack.config.ts b/webpack.config.ts
similarity index 60%
rename from webpack/webpack.config.ts
rename to webpack.config.ts
index c4ef4b90f..f24160c55 100644
--- a/webpack/webpack.config.ts
+++ b/webpack.config.ts
@@ -3,18 +3,26 @@
  */
 
 import * as fs from 'fs';
+import * as webpack from 'webpack';
+import chalk from 'chalk';
 import jsonImporter from 'node-sass-json-importer';
 const minify = require('html-minifier').minify;
-import I18nReplacer from '../src/common/build/i18n';
-import { pattern as faPattern, replacement as faReplacement } from '../src/common/build/fa';
-const constants = require('../src/const.json');
+const WebpackOnBuildPlugin = require('on-build-webpack');
+const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
+const ProgressBarPlugin = require('progress-bar-webpack-plugin');
+import I18nReplacer from './src/common/build/i18n';
+import { pattern as faPattern, replacement as faReplacement } from './src/common/build/fa';
+const constants = require('./src/const.json');
+import config from './src/conf';
+import { licenseHtml } from './src/common/build/license';
 
-import plugins from './plugins';
-
-import langs from '../locales';
-const meta = require('../package.json');
+import langs from './locales';
+const meta = require('./package.json');
 const version = meta.version;
 
+const env = process.env.NODE_ENV;
+const isProduction = env === 'production';
+
 global['faReplacement'] = faReplacement;
 
 global['collapseSpacesReplacement'] = html => {
@@ -26,7 +34,7 @@ global['collapseSpacesReplacement'] = html => {
 };
 
 global['base64replacement'] = (_, key) => {
-	return fs.readFileSync(__dirname + '/../src/web/' + key, 'base64');
+	return fs.readFileSync(__dirname + '/src/web/' + key, 'base64');
 };
 
 module.exports = Object.keys(langs).map(lang => {
@@ -46,13 +54,64 @@ module.exports = Object.keys(langs).map(lang => {
 	};
 
 	const output = {
-		path: __dirname + '/../built/web/assets',
+		path: __dirname + '/built/web/assets',
 		filename: `[name].${version}.${lang}.js`
 	};
 
 	const i18nReplacer = new I18nReplacer(lang);
 	global['i18nReplacement'] = i18nReplacer.replacement;
 
+	//#region Define consts
+	const consts = {
+		_RECAPTCHA_SITEKEY_: config.recaptcha.site_key,
+		_SW_PUBLICKEY_: config.sw ? config.sw.public_key : null,
+		_THEME_COLOR_: constants.themeColor,
+		_COPYRIGHT_: constants.copyright,
+		_VERSION_: version,
+		_STATUS_URL_: config.status_url,
+		_STATS_URL_: config.stats_url,
+		_DOCS_URL_: config.docs_url,
+		_API_URL_: config.api_url,
+		_DEV_URL_: config.dev_url,
+		_CH_URL_: config.ch_url,
+		_LANG_: lang,
+		_HOST_: config.host,
+		_URL_: config.url,
+		_LICENSE_: licenseHtml,
+		_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key
+	};
+
+	const _consts = {};
+
+	Object.keys(consts).forEach(key => {
+		_consts[key] = JSON.stringify(consts[key]);
+	});
+	//#endregion
+
+	const plugins = [
+		new HardSourceWebpackPlugin(),
+		new ProgressBarPlugin({
+			format: chalk`  {cyan.bold yes we can} {bold [}:bar{bold ]} {green.bold :percent} {gray (:current/:total)} :elapseds`,
+			clear: false
+		}),
+		new webpack.DefinePlugin(_consts),
+		new webpack.DefinePlugin({
+			'process.env': {
+				NODE_ENV: JSON.stringify(process.env.NODE_ENV)
+			}
+		}),
+		new WebpackOnBuildPlugin(stats => {
+			fs.writeFileSync('./version.json', JSON.stringify({
+				version
+			}), 'utf-8');
+		})
+	];
+
+	if (isProduction) {
+		plugins.push(new webpack.optimize.ModuleConcatenationPlugin());
+		plugins.push(minify());
+	}
+
 	return {
 		name,
 		entry,
@@ -159,19 +218,20 @@ module.exports = Object.keys(langs).map(lang => {
 				}]
 			}]
 		},
-		plugins: plugins(version, lang),
+		plugins,
 		output,
 		resolve: {
 			extensions: [
 				'.js', '.ts', '.json'
 			],
 			alias: {
-				'const.styl': __dirname + '/../src/web/const.styl'
+				'const.styl': __dirname + '/src/web/const.styl'
 			}
 		},
 		resolveLoader: {
 			modules: ['node_modules', './webpack/loaders']
 		},
-		cache: true
+		cache: true,
+		devtool: 'source-map'
 	};
 });
diff --git a/webpack/module/rules/collapse-spaces.ts b/webpack/module/rules/collapse-spaces.ts
deleted file mode 100644
index 734c73592..000000000
--- a/webpack/module/rules/collapse-spaces.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as fs from 'fs';
-const minify = require('html-minifier').minify;
-
-export default () => ({
-	enforce: 'pre',
-	test: /\.vue$/,
-	exclude: /node_modules/,
-	loader: 'string-replace-loader',
-	query: {
-		search: /^<template>([\s\S]+?)\r?\n<\/template>/,
-		replace: html => {
-			return minify(html, {
-				collapseWhitespace: true,
-				collapseInlineTagWhitespace: true,
-				keepClosingSlash: true
-			});
-		}
-	}
-});
diff --git a/webpack/plugins/consts.ts b/webpack/plugins/consts.ts
deleted file mode 100644
index 643589323..000000000
--- a/webpack/plugins/consts.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-/**
- * Constant Replacer
- */
-
-import * as webpack from 'webpack';
-
-const meta = require('../../package.json');
-const version = meta.version;
-
-const constants = require('../../src/const.json');
-import config from '../../src/conf';
-import { licenseHtml } from '../../src/common/build/license';
-
-export default lang => {
-	const consts = {
-		_RECAPTCHA_SITEKEY_: config.recaptcha.site_key,
-		_SW_PUBLICKEY_: config.sw ? config.sw.public_key : null,
-		_THEME_COLOR_: constants.themeColor,
-		_COPYRIGHT_: constants.copyright,
-		_VERSION_: version,
-		_STATUS_URL_: config.status_url,
-		_STATS_URL_: config.stats_url,
-		_DOCS_URL_: config.docs_url,
-		_API_URL_: config.api_url,
-		_DEV_URL_: config.dev_url,
-		_CH_URL_: config.ch_url,
-		_LANG_: lang,
-		_HOST_: config.host,
-		_URL_: config.url,
-		_LICENSE_: licenseHtml,
-		_GOOGLE_MAPS_API_KEY_: config.google_maps_api_key
-	};
-
-	const _consts = {};
-
-	Object.keys(consts).forEach(key => {
-		_consts[key] = JSON.stringify(consts[key]);
-	});
-
-	return new webpack.DefinePlugin(_consts);
-};
diff --git a/webpack/plugins/hoist.ts b/webpack/plugins/hoist.ts
deleted file mode 100644
index f61133f8d..000000000
--- a/webpack/plugins/hoist.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import * as webpack from 'webpack';
-
-export default () => new webpack.optimize.ModuleConcatenationPlugin();
diff --git a/webpack/plugins/index.ts b/webpack/plugins/index.ts
deleted file mode 100644
index 4023cd6cb..000000000
--- a/webpack/plugins/index.ts
+++ /dev/null
@@ -1,41 +0,0 @@
-import * as fs from 'fs';
-import * as webpack from 'webpack';
-const WebpackOnBuildPlugin = require('on-build-webpack');
-const HardSourceWebpackPlugin = require('hard-source-webpack-plugin');
-const ProgressBarPlugin = require('progress-bar-webpack-plugin');
-import chalk from 'chalk';
-
-import consts from './consts';
-import hoist from './hoist';
-import minify from './minify';
-
-const env = process.env.NODE_ENV;
-const isProduction = env === 'production';
-
-export default (version, lang) => {
-	const plugins = [
-		new HardSourceWebpackPlugin(),
-		new ProgressBarPlugin({
-			format: chalk`  {cyan.bold yes we can} {bold [}:bar{bold ]} {green.bold :percent} {gray (:current/:total)} :elapseds`,
-			clear: false
-		}),
-		consts(lang),
-		new webpack.DefinePlugin({
-			'process.env': {
-				NODE_ENV: JSON.stringify(process.env.NODE_ENV)
-			}
-		}),
-		new WebpackOnBuildPlugin(stats => {
-			fs.writeFileSync('./version.json', JSON.stringify({
-				version
-			}), 'utf-8');
-		})
-	];
-
-	if (isProduction) {
-		plugins.push(hoist());
-		plugins.push(minify());
-	}
-
-	return plugins;
-};
diff --git a/webpack/plugins/minify.ts b/webpack/plugins/minify.ts
deleted file mode 100644
index e46d4c5a1..000000000
--- a/webpack/plugins/minify.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
-
-export default () => new UglifyJsPlugin();