diff --git a/gulpfile.js b/gulpfile.js
deleted file mode 100644
index 5bd947f72d1e4a4b7a43ae5147abff8fb783ed5b..0000000000000000000000000000000000000000
--- a/gulpfile.js
+++ /dev/null
@@ -1 +0,0 @@
-eval(require('typescript').transpile(require('fs').readFileSync('./gulpfile.ts').toString()));
diff --git a/gulpfile.ts b/gulpfile.ts
index f7503912ceff3fccc190a31946fffb4e1d4c640b..8e36b56646598cc03cd84831289792e647c920fd 100644
--- a/gulpfile.ts
+++ b/gulpfile.ts
@@ -8,7 +8,7 @@ import * as gulp from 'gulp';
 import * as gutil from 'gulp-util';
 import * as babel from 'gulp-babel';
 import * as ts from 'gulp-typescript';
-import * as tslint from 'gulp-tslint';
+import tslint from 'gulp-tslint';
 import * as glob from 'glob';
 import * as es from 'event-stream';
 import * as webpack from 'webpack-stream';
@@ -32,7 +32,7 @@ if (isDebug) {
 
 const constants = require('./src/const.json');
 
-const tsProject = ts.createProject('tsconfig.json');
+const tsProject = ts.createProject('./src/tsconfig.json');
 
 gulp.task('build', [
 	'build:js',
@@ -92,11 +92,11 @@ gulp.task('build:copy', () =>
 		gulp.src([
 			'./src/**/resources/**/*',
 			'!./src/web/app/**/resources/**/*'
-		]).pipe(gulp.dest('./built/')),
+		]).pipe(gulp.dest('./built/')) as any,
 		gulp.src([
 			'./src/web/about/**/*',
 			'!./src/web/about/**/*.pug'
-		]).pipe(gulp.dest('./built/web/about/'))
+		]).pipe(gulp.dest('./built/web/about/')) as any
 	)
 );
 
@@ -155,8 +155,8 @@ gulp.task('build:client:scripts', () => new Promise(async (ok) => {
 	}
 
 	es.merge(
-		stream.pipe(gulp.dest('./built/web/resources/')),
-		entryPointStream.pipe(gulp.dest('./built/web/resources/client/'))
+		stream.pipe(gulp.dest('./built/web/resources/')) as any,
+		entryPointStream.pipe(gulp.dest('./built/web/resources/client/')) as any
 	);
 
 	ok();
@@ -165,7 +165,7 @@ gulp.task('build:client:scripts', () => new Promise(async (ok) => {
 gulp.task('build:client:styles', () =>
 	gulp.src('./src/web/app/init.css')
 		.pipe(isProduction
-			? cssnano()
+			? (cssnano as any)()
 			: gutil.noop())
 		.pipe(gulp.dest('./built/web/resources/'))
 );
@@ -173,16 +173,16 @@ gulp.task('build:client:styles', () =>
 gulp.task('copy:client', [
 	'build:client:scripts'
 ], () =>
-	gulp.src([
-		'./resources/**/*',
-		'./src/web/resources/**/*',
-		'./src/web/app/*/resources/**/*'
-	])
-	.pipe(isProduction ? imagemin() : gutil.noop())
-	.pipe(rename(path => {
-		path.dirname = path.dirname.replace('resources', '.');
-	}))
-	.pipe(gulp.dest('./built/web/resources/'))
+		gulp.src([
+			'./resources/**/*',
+			'./src/web/resources/**/*',
+			'./src/web/app/*/resources/**/*'
+		])
+			.pipe(isProduction ? (imagemin as any)() : gutil.noop())
+			.pipe(rename(path => {
+				path.dirname = path.dirname.replace('resources', '.');
+			}))
+			.pipe(gulp.dest('./built/web/resources/'))
 );
 
 gulp.task('build:client:pug', [
@@ -190,11 +190,11 @@ gulp.task('build:client:pug', [
 	'build:client:scripts',
 	'build:client:styles'
 ], () =>
-	gulp.src('./src/web/app/*/view.pug')
-		.pipe(pug({
-			locals: {
-				themeColor: constants.themeColor
-			}
-		}))
-		.pipe(gulp.dest('./built/web/app/'))
+		gulp.src('./src/web/app/*/view.pug')
+			.pipe(pug({
+				locals: {
+					themeColor: constants.themeColor
+				}
+			}))
+			.pipe(gulp.dest('./built/web/app/'))
 );
diff --git a/package.json b/package.json
index ae4c8176430021697c1b305716171ec7d73fe76a..2eb26f6e948dfa3447800e49ec09af265e2075f0 100644
--- a/package.json
+++ b/package.json
@@ -137,6 +137,7 @@
     "syuilo-password-strength": "0.0.1",
     "tcp-port-used": "0.1.2",
     "textarea-caret": "3.0.2",
+    "ts-node": "2.1.0",
     "tslint": "4.4.2",
     "typescript": "2.1.6",
     "uuid": "3.0.1",
diff --git a/src/tsconfig.json b/src/tsconfig.json
new file mode 100644
index 0000000000000000000000000000000000000000..2909810da0eed14c8e194f8cf4febeaced1a01bd
--- /dev/null
+++ b/src/tsconfig.json
@@ -0,0 +1,23 @@
+{
+  "compilerOptions": {
+    "noEmitOnError": false,
+    "noImplicitAny": false,
+    "noImplicitReturns": true,
+    "noUnusedParameters": false,
+    "noUnusedLocals": true,
+    "noFallthroughCasesInSwitch": true,
+    "declaration": false,
+    "sourceMap": false,
+    "target": "es6",
+    "module": "commonjs",
+    "removeComments": false,
+    "noLib": false
+  },
+  "compileOnSave": false,
+  "include": [
+    "./**/*.ts"
+  ],
+  "exclude": [
+    "./web/app/**/*.ts"
+  ]
+}
diff --git a/tsconfig.json b/tsconfig.json
index 24925687a639717cbc31f98f3f3a4ecc34952ee5..515d1847b030f08d3d2428a74b1b7a0f4710aeef 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,26 +1,20 @@
 {
-	"compilerOptions": {
-		"noEmitOnError": false,
-		"noImplicitAny": false,
-		"noImplicitReturns": true,
-		"noUnusedParameters": false,
-		"noUnusedLocals": true,
-		"noFallthroughCasesInSwitch": true,
-		"declaration": false,
-		"sourceMap": false,
-		"target": "es6",
-		"module": "commonjs",
-		"removeComments": false,
-		"noLib": false,
-		"outDir": "built",
-		"rootDir": "src"
-	},
-	"compileOnSave": false,
-	"include": [
-		"./node_modules/typescript/lib/lib.es6.d.ts",
-		"./src/**/*.ts"
-	],
-	"exclude": [
-		"./src/web/app/**/*.ts"
-	]
+  "compilerOptions": {
+    "noEmitOnError": false,
+    "noImplicitAny": false,
+    "noImplicitReturns": true,
+    "noUnusedParameters": false,
+    "noUnusedLocals": true,
+    "noFallthroughCasesInSwitch": true,
+    "declaration": false,
+    "sourceMap": false,
+    "target": "es6",
+    "module": "commonjs",
+    "removeComments": false,
+    "noLib": false
+  },
+  "compileOnSave": false,
+  "include": [
+    "./gulpfile.ts"
+  ]
 }