diff --git a/gulpfile.js b/gulpfile.js
index f6dd2d5..55dc4bf 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -1,86 +1,86 @@
-"use strict";
+'use strict';
 
 // dependencies
-var path          = require("path");
-var fs            = require("fs");
-var fse           = require("fs-extra");
-var child_process = require("child_process");
+var path = require('path');
+var fs = require('fs');
+var fse = require('fs-extra');
+var child_process = require('child_process');
 
-var gulp        = require("gulp");
-var gutil       = require("gulp-util");
-var less        = require("gulp-less");
-var sass        = require("gulp-sass");
-var replace     = require("gulp-replace");
-var header      = require("gulp-header");
-var footer      = require("gulp-footer");
-var rename      = require("gulp-rename");
-var browsersync = require("browser-sync");
-var vstream     = require("vinyl-source-stream");
-var buffer      = require("vinyl-buffer");
+var gulp = require('gulp');
+var gutil = require('gulp-util');
+var less = require('gulp-less');
+var sass = require('gulp-sass');
+var replace = require('gulp-replace');
+var header = require('gulp-header');
+var footer = require('gulp-footer');
+var rename = require('gulp-rename');
+var browsersync = require('browser-sync');
+var vstream = require('vinyl-source-stream');
+var buffer = require('vinyl-buffer');
 
-var browserify = require("browserify");
-var babelify   = require("babelify");
-var uglify     = require("gulp-uglify");
-var envify     = require("envify");
-var htmllint   = require("gulp-htmllint");
-var crawler    = require("simplecrawler");
-var ncp        = require("ncp");
+var browserify = require('browserify');
+var babelify = require('babelify');
+var uglify = require('gulp-uglify');
+var envify = require('envify');
+var htmllint = require('gulp-htmllint');
+var crawler = require('simplecrawler');
+var ncp = require('ncp');
 
-var nextversion = require("./tools/bin/nextversion");
-var util        = require("./tools/bin/util");
+var nextversion = require('./tools/bin/nextversion');
+var util = require('./tools/bin/util');
 
 // constants
-var ROOT_DIR   = ".";
-var CONFIG_DIR = "conf";
-var SOURCE_DIR = path.join(ROOT_DIR, "www");
-var DEV_DIR    = path.join(ROOT_DIR, "build-dev");
-var PROD_DIR   = path.join(ROOT_DIR, "build-prod");
+var ROOT_DIR = '.';
+var CONFIG_DIR = 'conf';
+var SOURCE_DIR = path.join(ROOT_DIR, 'www');
+var DEV_DIR = path.join(ROOT_DIR, 'build-dev');
+var PROD_DIR = path.join(ROOT_DIR, 'build-prod');
 
-var DATA_DIR        = path.join(SOURCE_DIR, "_data");
-var TOC_DIR         = path.join(DATA_DIR, "toc");
-var DOCS_DIR        = path.join(SOURCE_DIR, "docs");
-var FETCH_DIR       = path.join(DOCS_DIR, "en", "dev", "reference");
-var CSS_SRC_DIR     = path.join(SOURCE_DIR, "static", "css-src");
-var CSS_OUT_DIR     = path.join(SOURCE_DIR, "static", "css");
-var PLUGINS_SRC_DIR = path.join(SOURCE_DIR, "static", "plugins");
-var JS_DIR          = path.join(SOURCE_DIR, "static", "js");
-var BIN_DIR         = path.join(ROOT_DIR, "tools", "bin");
+var DATA_DIR = path.join(SOURCE_DIR, '_data');
+var TOC_DIR = path.join(DATA_DIR, 'toc');
+var DOCS_DIR = path.join(SOURCE_DIR, 'docs');
+var FETCH_DIR = path.join(DOCS_DIR, 'en', 'dev', 'reference');
+var CSS_SRC_DIR = path.join(SOURCE_DIR, 'static', 'css-src');
+var CSS_OUT_DIR = path.join(SOURCE_DIR, 'static', 'css');
+var PLUGINS_SRC_DIR = path.join(SOURCE_DIR, 'static', 'plugins');
+var JS_DIR = path.join(SOURCE_DIR, 'static', 'js');
+var BIN_DIR = path.join(ROOT_DIR, 'tools', 'bin');
 
-var CONFIG_FILE          = path.join(CONFIG_DIR, "_config.yml");
-var DEFAULTS_CONFIG_FILE = path.join(CONFIG_DIR, "_defaults.yml");
-var VERSION_CONFIG_FILE  = path.join(CONFIG_DIR, "_version.yml");
-var PROD_CONFIG_FILE     = path.join(CONFIG_DIR, "_prod.yml");
-var DEV_CONFIG_FILE      = path.join(CONFIG_DIR, "_dev.yml");
-var NODOCS_CONFIG_FILE   = path.join(CONFIG_DIR, "_nodocs.yml");
+var CONFIG_FILE = path.join(CONFIG_DIR, '_config.yml');
+var DEFAULTS_CONFIG_FILE = path.join(CONFIG_DIR, '_defaults.yml');
+var VERSION_CONFIG_FILE = path.join(CONFIG_DIR, '_version.yml');
+var PROD_CONFIG_FILE = path.join(CONFIG_DIR, '_prod.yml');
+var DEV_CONFIG_FILE = path.join(CONFIG_DIR, '_dev.yml');
+var NODOCS_CONFIG_FILE = path.join(CONFIG_DIR, '_nodocs.yml');
 
-var VERSION_FILE      = "VERSION";
-var DOCS_VERSION_FILE = path.join(DATA_DIR, "docs-versions.yml");
-var ALL_PAGES_FILE    = path.join(DATA_DIR, "all-pages.yml");
-var FETCH_CONFIG      = path.join(DATA_DIR, "fetched-files.yml");
-var REDIRECTS_FILE    = path.join(DATA_DIR, "redirects.yml");
-var PLUGINS_FILE_NAME = "plugins.js";
-var PLUGINS_FILE      = path.join(JS_DIR, PLUGINS_FILE_NAME);
-var PLUGINS_SRC_FILE  = path.join(PLUGINS_SRC_DIR, "app.js");
+var VERSION_FILE = 'VERSION';
+var DOCS_VERSION_FILE = path.join(DATA_DIR, 'docs-versions.yml');
+var ALL_PAGES_FILE = path.join(DATA_DIR, 'all-pages.yml');
+var FETCH_CONFIG = path.join(DATA_DIR, 'fetched-files.yml');
+var REDIRECTS_FILE = path.join(DATA_DIR, 'redirects.yml');
+var PLUGINS_FILE_NAME = 'plugins.js';
+var PLUGINS_FILE = path.join(JS_DIR, PLUGINS_FILE_NAME);
+var PLUGINS_SRC_FILE = path.join(PLUGINS_SRC_DIR, 'app.js');
 
 var BASE_CONFIGS = [CONFIG_FILE, DEFAULTS_CONFIG_FILE, VERSION_CONFIG_FILE];
-var DEV_CONFIGS  = [DEV_CONFIG_FILE];
+var DEV_CONFIGS = [DEV_CONFIG_FILE];
 var PROD_CONFIGS = [PROD_CONFIG_FILE];
-var DEV_FLAGS    = ["--trace"];
-var PROD_FLAGS   = [];
+var DEV_FLAGS = ['--trace'];
+var PROD_FLAGS = [];
 
-var BASE_URL            = "";
-var YAML_FRONT_MATTER   = "---\n---\n";
-var WATCH_INTERVAL      = 1000; // in milliseconds
-var VERSION_VAR_NAME    = "latest_docs_version";
+var BASE_URL = '';
+var YAML_FRONT_MATTER = '---\n---\n';
+var WATCH_INTERVAL = 1000; // in milliseconds
+var VERSION_VAR_NAME = 'latest_docs_version';
 var LATEST_DOCS_VERSION = fs.readFileSync(VERSION_FILE, 'utf-8').trim();
-var NEXT_DOCS_VERSION   = nextversion.getNextVersion(LATEST_DOCS_VERSION);
-var LANGUAGES           = util.listdirsSync(DOCS_DIR);
+var NEXT_DOCS_VERSION = nextversion.getNextVersion(LATEST_DOCS_VERSION);
+var LANGUAGES = util.listdirsSync(DOCS_DIR);
 
 var PROD_BY_DEFAULT = false;
 
 // compute/get/set/adjust passed options
-gutil.env.prod   = gutil.env.prod || PROD_BY_DEFAULT;
-gutil.env.dev    = !gutil.env.prod;
+gutil.env.prod = gutil.env.prod || PROD_BY_DEFAULT;
+gutil.env.dev = !gutil.env.prod;
 gutil.env.outDir = gutil.env.prod ? PROD_DIR : DEV_DIR;
 
 // check for errors
@@ -89,41 +89,41 @@
 }
 
 // helpers
-function fatal(message) {
-    gutil.log(gutil.colors.red("ERROR") + ": " + message);
+function fatal (message) {
+    gutil.log(gutil.colors.red('ERROR') + ': ' + message);
     process.exit(1);
 }
 
-function execPiped(command, args, fileName) {
-    console.log(command + " " + args.join(" "));
+function execPiped (command, args, fileName) {
+    console.log(command + ' ' + args.join(' '));
     var task = child_process.spawn(command, args);
     return task.stdout.pipe(vstream(fileName)).pipe(buffer());
 }
 
-function exec(command, args, cb) {
-    console.log(command + " " + args.join(" "));
-    var task = child_process.spawn(command, args, {stdio: "inherit"});
-    task.on("exit", cb);
+function exec (command, args, cb) {
+    console.log(command + ' ' + args.join(' '));
+    var task = child_process.spawn(command, args, { stdio: 'inherit' });
+    task.on('exit', cb);
 }
 
-function bin(name) {
+function bin (name) {
     return path.join(BIN_DIR, name);
 }
 
-function remove(path) {
-    console.log("removing " + path);
+function remove (path) {
+    console.log('removing ' + path);
     fse.removeSync(path);
 }
 
-function getBundleExecutable() {
-    if (process.platform === "win32") {
-        return "bundle.bat";
+function getBundleExecutable () {
+    if (process.platform === 'win32') {
+        return 'bundle.bat';
     } else {
-        return "bundle";
+        return 'bundle';
     }
 }
 
-function getJekyllConfigs() {
+function getJekyllConfigs () {
     var configs = BASE_CONFIGS;
 
     // add build-specific config files
@@ -141,24 +141,24 @@
     return configs;
 }
 
-function jekyllBuild(done) {
-    var bundle  = getBundleExecutable();
+function jekyllBuild (done) {
+    var bundle = getBundleExecutable();
     var configs = getJekyllConfigs();
-    var flags   = gutil.env.prod ? PROD_FLAGS : DEV_FLAGS;
+    var flags = gutil.env.prod ? PROD_FLAGS : DEV_FLAGS;
 
-    flags = flags.concat(["--config", configs.join(",")]);
+    flags = flags.concat(['--config', configs.join(',')]);
 
-    exec(bundle, ["exec", "jekyll", "build"].concat(flags), done);
+    exec(bundle, ['exec', 'jekyll', 'build'].concat(flags), done);
 }
 
-function copyDocsVersion(oldVersion, newVersion, cb) {
+function copyDocsVersion (oldVersion, newVersion, cb) {
 
     // copying a folder and a ToC file for each language
     var numCopyOperations = LANGUAGES.length * 2;
 
     // pseudo-CV (condition variable)
     var numCopied = 0;
-    function doneCopying(error) {
+    function doneCopying (error) {
 
         if (error) {
             cb(error);
@@ -177,113 +177,113 @@
 
         // get files to copy
         var oldVersionDocs = path.join(DOCS_DIR, languageName, oldVersion);
-        var oldVersionToc  = path.join(TOC_DIR, util.srcTocfileName(languageName, oldVersion));
+        var oldVersionToc = path.join(TOC_DIR, util.srcTocfileName(languageName, oldVersion));
         var newVersionDocs = path.join(DOCS_DIR, languageName, newVersion);
-        var newVersionToc  = path.join(TOC_DIR, util.srcTocfileName(languageName, newVersion));
+        var newVersionToc = path.join(TOC_DIR, util.srcTocfileName(languageName, newVersion));
 
         var copyOptions = {
             stopOnErr: true
         };
 
         // copy docs
-        console.log(oldVersionDocs + " -> " + newVersionDocs);
+        console.log(oldVersionDocs + ' -> ' + newVersionDocs);
         ncp.ncp(oldVersionDocs, newVersionDocs, copyOptions, doneCopying);
 
         // copy ToC
-        console.log(oldVersionToc + " -> " + newVersionToc);
+        console.log(oldVersionToc + ' -> ' + newVersionToc);
         ncp.ncp(oldVersionToc, newVersionToc, copyOptions, doneCopying);
     });
 }
 
 // tasks
-gulp.task("default", ["help"]);
+gulp.task('default', ['help']);
 
-gulp.task("help", function () {
-    gutil.log("");
-    gutil.log("Tasks:");
-    gutil.log("");
-    gutil.log("    build         same as configs + data + styles + plugins + jekyll");
-    gutil.log("    jekyll        build with jekyll");
-    gutil.log("    regen         same as jekyll + reload");
-    gutil.log("    serve         build the site and open it in a browser");
-    gutil.log("    reload        refresh the browser");
-    gutil.log("");
-    gutil.log("    newversion    create " + NEXT_DOCS_VERSION + " docs from dev docs");
-    gutil.log("    snapshot      copy dev docs to " + LATEST_DOCS_VERSION + " docs");
-    gutil.log("");
-    gutil.log("    plugins       build " + PLUGINS_FILE);
-    gutil.log("");
-    gutil.log("    configs       run all the below tasks");
-    gutil.log("    defaults      create " + DEFAULTS_CONFIG_FILE);
-    gutil.log("    version       create " + VERSION_CONFIG_FILE);
-    gutil.log("");
-    gutil.log("    data          run all the below tasks");
-    gutil.log("    docs-versions create " + DOCS_VERSION_FILE);
-    gutil.log("    pages-dict    create " + ALL_PAGES_FILE);
-    gutil.log("    toc           create all generated ToC files in " + TOC_DIR);
-    gutil.log("    fetch         download docs specified in " + FETCH_CONFIG);
-    gutil.log("");
-    gutil.log("    styles        run all the below tasks");
-    gutil.log("    less          compile all .less files");
-    gutil.log("    sass          compile all .scss files");
-    gutil.log("    css           copy over all .css files");
-    gutil.log("");
-    gutil.log("    watch         serve + then watch all source files and regenerate as necessary");
-    gutil.log("    link-bugs     replace CB-XXXX references with nice links");
-    gutil.log("");
-    gutil.log("    help          show this text");
-    gutil.log("    clean         remove all generated files and folders");
-    gutil.log("");
-    gutil.log("Arguments:");
+gulp.task('help', function () {
+    gutil.log('');
+    gutil.log('Tasks:');
+    gutil.log('');
+    gutil.log('    build         same as configs + data + styles + plugins + jekyll');
+    gutil.log('    jekyll        build with jekyll');
+    gutil.log('    regen         same as jekyll + reload');
+    gutil.log('    serve         build the site and open it in a browser');
+    gutil.log('    reload        refresh the browser');
+    gutil.log('');
+    gutil.log('    newversion    create ' + NEXT_DOCS_VERSION + ' docs from dev docs');
+    gutil.log('    snapshot      copy dev docs to ' + LATEST_DOCS_VERSION + ' docs');
+    gutil.log('');
+    gutil.log('    plugins       build ' + PLUGINS_FILE);
+    gutil.log('');
+    gutil.log('    configs       run all the below tasks');
+    gutil.log('    defaults      create ' + DEFAULTS_CONFIG_FILE);
+    gutil.log('    version       create ' + VERSION_CONFIG_FILE);
+    gutil.log('');
+    gutil.log('    data          run all the below tasks');
+    gutil.log('    docs-versions create ' + DOCS_VERSION_FILE);
+    gutil.log('    pages-dict    create ' + ALL_PAGES_FILE);
+    gutil.log('    toc           create all generated ToC files in ' + TOC_DIR);
+    gutil.log('    fetch         download docs specified in ' + FETCH_CONFIG);
+    gutil.log('');
+    gutil.log('    styles        run all the below tasks');
+    gutil.log('    less          compile all .less files');
+    gutil.log('    sass          compile all .scss files');
+    gutil.log('    css           copy over all .css files');
+    gutil.log('');
+    gutil.log('    watch         serve + then watch all source files and regenerate as necessary');
+    gutil.log('    link-bugs     replace CB-XXXX references with nice links');
+    gutil.log('');
+    gutil.log('    help          show this text');
+    gutil.log('    clean         remove all generated files and folders');
+    gutil.log('');
+    gutil.log('Arguments:');
     gutil.log("    --nodocs      don't generate docs");
-    gutil.log("    --prod        build for production; without it, will build dev instead");
-    gutil.log("");
+    gutil.log('    --prod        build for production; without it, will build dev instead');
+    gutil.log('');
 });
 
-gulp.task("data", ["toc", "docs-versions", "pages-dict"])
-gulp.task("configs", ["defaults", "version"]);
-gulp.task("styles", ["less", "css", "sass"]);
+gulp.task('data', ['toc', 'docs-versions', 'pages-dict']);
+gulp.task('configs', ['defaults', 'version']);
+gulp.task('styles', ['less', 'css', 'sass']);
 
-gulp.task("watch", ["serve"], function () {
+gulp.task('watch', ['serve'], function () {
     gulp.watch(
         [
-            path.join(CSS_SRC_DIR, "**", "*"),
+            path.join(CSS_SRC_DIR, '**', '*')
         ],
-        {interval: WATCH_INTERVAL},
-        ["styles"]
+        { interval: WATCH_INTERVAL },
+        ['styles']
     );
     gulp.watch(
         [
-            path.join(PLUGINS_SRC_DIR, "**", "*.js"),
-            path.join(PLUGINS_SRC_DIR, "**", "*.jsx"),
-            path.join(PLUGINS_SRC_DIR, "**", "*.json"),
+            path.join(PLUGINS_SRC_DIR, '**', '*.js'),
+            path.join(PLUGINS_SRC_DIR, '**', '*.jsx'),
+            path.join(PLUGINS_SRC_DIR, '**', '*.json')
         ],
-        {interval: WATCH_INTERVAL},
-        ["plugins"]
+        { interval: WATCH_INTERVAL },
+        ['plugins']
     );
     gulp.watch(
         [
-            path.join(ROOT_DIR, "**", "*.yml"),
-            path.join(JS_DIR, "**", "*.js"),
-            path.join(CSS_OUT_DIR, "**", "*.css"),
+            path.join(ROOT_DIR, '**', '*.yml'),
+            path.join(JS_DIR, '**', '*.js'),
+            path.join(CSS_OUT_DIR, '**', '*.css'),
 
             // NOTE:
             //      watch all non-docs HTML, and only docs/en/dev HTML because
             //      versions other than dev usually don't change much; this is
             //      an optimization
-            path.join(SOURCE_DIR, "_layouts", "*.html"),
-            path.join(SOURCE_DIR, "_includes", "*.html"),
-            path.join(SOURCE_DIR, "**", "*.html") + "!" + path.join(DOCS_DIR, "**"),
-            path.join(SOURCE_DIR, "**", "*.md") + "!" + path.join(DOCS_DIR, "**") ,
-            path.join(DOCS_DIR, "en", "dev", "**", "*.md") ,
-            path.join(DOCS_DIR, "en", "dev", "**", "*.html"),
+            path.join(SOURCE_DIR, '_layouts', '*.html'),
+            path.join(SOURCE_DIR, '_includes', '*.html'),
+            path.join(SOURCE_DIR, '**', '*.html') + '!' + path.join(DOCS_DIR, '**'),
+            path.join(SOURCE_DIR, '**', '*.md') + '!' + path.join(DOCS_DIR, '**'),
+            path.join(DOCS_DIR, 'en', 'dev', '**', '*.md'),
+            path.join(DOCS_DIR, 'en', 'dev', '**', '*.html')
         ],
-        {interval: WATCH_INTERVAL},
-        ["regen"]
+        { interval: WATCH_INTERVAL },
+        ['regen']
     );
 });
 
-gulp.task("serve", ["build"], function () {
+gulp.task('serve', ['build'], function () {
     var route = {};
 
     // set site root for browsersync
@@ -300,130 +300,130 @@
     });
 });
 
-gulp.task("build", ["configs", "data", "styles", "plugins"], function (done) {
+gulp.task('build', ['configs', 'data', 'styles', 'plugins'], function (done) {
     jekyllBuild(done);
 });
 
-gulp.task("jekyll", function (done) {
+gulp.task('jekyll', function (done) {
     jekyllBuild(done);
 });
 
-gulp.task("regen", ["jekyll"], function () {
+gulp.task('regen', ['jekyll'], function () {
     browsersync.reload();
 });
 
-gulp.task("fetch", function (done) {
+gulp.task('fetch', function (done) {
 
     // skip fetching if --nofetch was passed
     if (gutil.env.nofetch) {
         gutil.log(gutil.colors.yellow(
-            "Skipping fetching external docs."));
+            'Skipping fetching external docs.'));
         done();
         return;
     }
 
-    exec("node", [bin("fetch_docs.js"), "--config", FETCH_CONFIG, '--docsRoot', DOCS_DIR], done);
+    exec('node', [bin('fetch_docs.js'), '--config', FETCH_CONFIG, '--docsRoot', DOCS_DIR], done);
 });
 
-gulp.task("reload", function () {
+gulp.task('reload', function () {
     browsersync.reload();
 });
 
-gulp.task("docs-versions", function () {
-    return execPiped("node", [bin("gen_versions.js"), DOCS_DIR], DOCS_VERSION_FILE)
+gulp.task('docs-versions', function () {
+    return execPiped('node', [bin('gen_versions.js'), DOCS_DIR], DOCS_VERSION_FILE)
         .pipe(gulp.dest(ROOT_DIR));
 });
 
-gulp.task("pages-dict", function () {
+gulp.task('pages-dict', function () {
     var args = [
-        bin("gen_pages_dict.js"),
+        bin('gen_pages_dict.js'),
         '--siteRoot', SOURCE_DIR,
         '--redirectsFile', REDIRECTS_FILE,
         '--latestVersion', LATEST_DOCS_VERSION,
-        '--languages', LANGUAGES.join(","),
+        '--languages', LANGUAGES.join(',')
     ];
 
-    return execPiped("node", args, ALL_PAGES_FILE).pipe(gulp.dest(ROOT_DIR));
+    return execPiped('node', args, ALL_PAGES_FILE).pipe(gulp.dest(ROOT_DIR));
 });
 
-gulp.task("version", function () {
+gulp.task('version', function () {
     // this code is stupid; it's basically the line:
     //      cat VERSION | sed -e 's/^/VERSION_VAR_NAME: /' > _version.yml
     // however we're in Gulp, and we need to support Windows...
     // so we contort it into a monster
     return gulp
         .src(VERSION_FILE)
-        .pipe(header(VERSION_VAR_NAME + ": "))
-        .pipe(footer("\n"))
+        .pipe(header(VERSION_VAR_NAME + ': '))
+        .pipe(footer('\n'))
         .pipe(rename(VERSION_CONFIG_FILE))
-        .pipe(gulp.dest("."));
+        .pipe(gulp.dest('.'));
 });
 
-gulp.task("defaults", function () {
-    return execPiped("node", [bin("gen_defaults.js"), DOCS_DIR, LATEST_DOCS_VERSION], DEFAULTS_CONFIG_FILE)
+gulp.task('defaults', function () {
+    return execPiped('node', [bin('gen_defaults.js'), DOCS_DIR, LATEST_DOCS_VERSION], DEFAULTS_CONFIG_FILE)
         .pipe(gulp.dest(ROOT_DIR));
 });
 
-gulp.task("toc", ["fetch"], function (done) {
-    exec("node", [bin("toc.js"), DOCS_DIR, TOC_DIR], done);
+gulp.task('toc', ['fetch'], function (done) {
+    exec('node', [bin('toc.js'), DOCS_DIR, TOC_DIR], done);
 });
 
-gulp.task("less", function () {
+gulp.task('less', function () {
     return gulp
-        .src(path.join(CSS_SRC_DIR, "**", "*.less"))
+        .src(path.join(CSS_SRC_DIR, '**', '*.less'))
         .pipe(less())
         .pipe(header(YAML_FRONT_MATTER))
         .pipe(gulp.dest(CSS_OUT_DIR))
         .pipe(gulp.dest(CSS_OUT_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
-        .pipe(browsersync.reload({stream: true}));
-})
-
-gulp.task("css", function () {
-    return gulp
-        .src(path.join(CSS_SRC_DIR, "**", "*.css"))
-        .pipe(header(YAML_FRONT_MATTER))
-        .pipe(gulp.dest(CSS_OUT_DIR))
-        .pipe(gulp.dest(CSS_OUT_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
-        .pipe(browsersync.reload({stream: true}));
-})
-
-gulp.task("sass", function() {
-    return gulp
-        .src(path.join(CSS_SRC_DIR, "**", "*.scss"))
-        .pipe(sass().on("error", sass.logError))
-        .pipe(header(YAML_FRONT_MATTER))
-        .pipe(gulp.dest(CSS_OUT_DIR))
-        .pipe(gulp.dest(CSS_OUT_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
-        .pipe(browsersync.reload({stream: true}));
+        .pipe(browsersync.reload({ stream: true }));
 });
 
-gulp.task("plugins", function() {
+gulp.task('css', function () {
+    return gulp
+        .src(path.join(CSS_SRC_DIR, '**', '*.css'))
+        .pipe(header(YAML_FRONT_MATTER))
+        .pipe(gulp.dest(CSS_OUT_DIR))
+        .pipe(gulp.dest(CSS_OUT_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
+        .pipe(browsersync.reload({ stream: true }));
+});
+
+gulp.task('sass', function () {
+    return gulp
+        .src(path.join(CSS_SRC_DIR, '**', '*.scss'))
+        .pipe(sass().on('error', sass.logError))
+        .pipe(header(YAML_FRONT_MATTER))
+        .pipe(gulp.dest(CSS_OUT_DIR))
+        .pipe(gulp.dest(CSS_OUT_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
+        .pipe(browsersync.reload({ stream: true }));
+});
+
+gulp.task('plugins', function () {
     if (gutil.env.prod) {
-        process.env.NODE_ENV = "production";
+        process.env.NODE_ENV = 'production';
     }
 
-    var stream = browserify(PLUGINS_SRC_FILE, {debug: !gutil.env.prod})
+    var stream = browserify(PLUGINS_SRC_FILE, { debug: !gutil.env.prod })
         .transform(babelify, {
-            presets: ["react"],
+            presets: ['react'],
             plugins: [
-                ["transform-react-jsx", {"pragma": "h"}]
+                ['transform-react-jsx', { 'pragma': 'h' }]
             ]
         })
         .transform(envify)
         .bundle()
-        .on("error", gutil.log)
+        .on('error', gutil.log)
         .pipe(vstream(PLUGINS_FILE_NAME))
         .pipe(buffer());
 
     if (gutil.env.prod) {
         stream = stream
             .pipe(uglify())
-            .on("error", gutil.log);
+            .on('error', gutil.log);
     }
 
     return stream
         .pipe(gulp.dest(JS_DIR.replace(SOURCE_DIR, gutil.env.outDir)))
-        .pipe(browsersync.reload({stream: true}))
+        .pipe(browsersync.reload({ stream: true }))
 
         // NOTE:
         //      adding YAML front matter after doing everything
@@ -433,23 +433,23 @@
         // WORKAROUND:
         //           minified JS has some things that look like
         //           Liquid tags, so we replace them manually
-        .pipe(replace("){{", "){ {"))
+        .pipe(replace('){{', '){ {'))
         .pipe(gulp.dest(JS_DIR));
 });
 
 // convenience tasks
-gulp.task("link-bugs", function (done) {
-    exec(bin("linkify-bugs.sh"), [path.join(SOURCE_DIR, "_posts")], done);
+gulp.task('link-bugs', function (done) {
+    exec(bin('linkify-bugs.sh'), [path.join(SOURCE_DIR, '_posts')], done);
 });
 
-gulp.task("lint", function() {
-    return gulp.src(path.join("./", "**", "*.html"))
+gulp.task('lint', function () {
+    return gulp.src(path.join('./', '**', '*.html'))
         .pipe(htmllint());
 });
 
-gulp.task("newversion", ["fetch"], function(done) {
+gulp.task('newversion', ['fetch'], function (done) {
 
-    copyDocsVersion("dev", NEXT_DOCS_VERSION, function (error) {
+    copyDocsVersion('dev', NEXT_DOCS_VERSION, function (error) {
 
         if (error) {
             console.error(error);
@@ -458,11 +458,11 @@
         }
 
         // finally update the version file with the new version
-        fs.writeFile(VERSION_FILE, NEXT_DOCS_VERSION + "\n", done);
+        fs.writeFile(VERSION_FILE, NEXT_DOCS_VERSION + '\n', done);
     });
 });
 
-gulp.task("snapshot", ["fetch"], function(done) {
+gulp.task('snapshot', ['fetch'], function (done) {
 
     // remove current version first
     LANGUAGES.forEach(function (languageName) {
@@ -470,29 +470,29 @@
         remove(languageLatestDocs);
     });
 
-    copyDocsVersion("dev", LATEST_DOCS_VERSION, done);
+    copyDocsVersion('dev', LATEST_DOCS_VERSION, done);
 });
 
-gulp.task("checklinks", function(done) {
+gulp.task('checklinks', function (done) {
     crawler
-        .crawl("http://localhost:3000/")
-        .on("fetch404", function(queueItem, response) {
+        .crawl('http://localhost:3000/')
+        .on('fetch404', function (queueItem, response) {
             gutil.log(
-                "Resource not found linked from " +
-                queueItem.referrer + " to", queueItem.url
+                'Resource not found linked from ' +
+                queueItem.referrer + ' to', queueItem.url
             );
-            gutil.log("Status code: " + response.statusCode);
+            gutil.log('Status code: ' + response.statusCode);
         })
-        .on("complete", function(queueItem) {
+        .on('complete', function (queueItem) {
             done();
         });
 });
 
-gulp.task("clean", function () {
+gulp.task('clean', function () {
     remove(DEV_DIR);
     remove(PROD_DIR);
     remove(FETCH_DIR);
-    remove(path.join(DATA_DIR, "toc", "*-gen.yml"));
+    remove(path.join(DATA_DIR, 'toc', '*-gen.yml'));
     remove(CSS_OUT_DIR);
     remove(PLUGINS_FILE);
     remove(DOCS_VERSION_FILE);
diff --git a/package.json b/package.json
index 4a2fddc..420ab9e 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
     "clean": "gulp clean",
     "update-docs": "gulp snapshot",
     "build": "gulp build --prod",
-    "eslint": "eslint tools/lib tools/spec"
+    "eslint": "eslint tools *.js"
   },
   "author": "Apache Software Foundation",
   "license": "Apache-2.0",
@@ -46,13 +46,13 @@
     "babel-plugin-transform-h-jsx": "^1.0.0",
     "babel-preset-react": "^6.24.1",
     "babelify": "^7.3.0",
-    "eslint": "^4.10.0",
-    "eslint-config-semistandard": "^11.0.0",
-    "eslint-config-standard": "^10.2.1",
+    "eslint": "^5.16.0",
+    "eslint-config-semistandard": "^13.0.0",
+    "eslint-config-standard": "^12.0.0",
     "eslint-plugin-import": "^2.8.0",
-    "eslint-plugin-node": "^5.2.1",
-    "eslint-plugin-promise": "^3.6.0",
-    "eslint-plugin-standard": "^3.0.1",
+    "eslint-plugin-node": "^9.0.1",
+    "eslint-plugin-promise": "^4.1.1",
+    "eslint-plugin-standard": "^4.0.0",
     "glob": "^7.0.3",
     "gulp-htmllint": "^0.0.5",
     "simplecrawler": "^0.5.2"
diff --git a/tools/bin/augment_toc.js b/tools/bin/augment_toc.js
index b29f194..15ba236 100644
--- a/tools/bin/augment_toc.js
+++ b/tools/bin/augment_toc.js
@@ -27,7 +27,6 @@
 var util = require('./util');
 
 // constants
-var DEFAULT_PREFIX = '';
 var VERBOSE_BY_DEFAULT = false;
 
 // globals
@@ -121,7 +120,7 @@
 function augmentString (srcTocString, prefix) {
     var srcToc = yaml.load(srcTocString);
     var augmentedToc = augmentToc(srcToc, prefix);
-    var augmentedTocString = yaml.dump(augmentedToc, {indent: 4});
+    var augmentedTocString = yaml.dump(augmentedToc, { indent: 4 });
 
     return augmentedTocString;
 }
diff --git a/tools/bin/fetch_docs.js b/tools/bin/fetch_docs.js
index 418f203..0d43d55 100644
--- a/tools/bin/fetch_docs.js
+++ b/tools/bin/fetch_docs.js
@@ -54,10 +54,7 @@
 }
 
 function packageNameFromRepoName (repoName) {
-    var repoSplit = repoName.split('/');
-    var repoOwner = repoSplit[0];
-    var actualRepoName = repoSplit[1];
-    return actualRepoName;
+    return repoName.split('/')[1];
 }
 
 function getFetchedFileConfig (entry) {
@@ -192,7 +189,7 @@
         var outFile = fs.createWriteStream(outFilePath);
 
         // open an HTTP request for the file
-        var request = https.get(fetchURI, function (response) {
+        https.get(fetchURI, function (response) {
 
             if (response.statusCode !== 200) {
                 console.error('Failed to download ' + fetchURI + ': got ' + response.statusCode);
diff --git a/tools/bin/gen_defaults.js b/tools/bin/gen_defaults.js
index 2847237..eb15388 100644
--- a/tools/bin/gen_defaults.js
+++ b/tools/bin/gen_defaults.js
@@ -56,7 +56,7 @@
     }
 
     // create defaults config
-    var config = {'defaults': []};
+    var config = { 'defaults': [] };
 
     // set defaults for each language
     util.listdirsSync(rootDir).forEach(function (langName) {
@@ -114,7 +114,7 @@
     });
 
     console.log(util.generatedBy(__filename));
-    console.log(yaml.dump(config, {indent: 4}));
+    console.log(yaml.dump(config, { indent: 4 }));
 }
 
 main();
diff --git a/tools/bin/gen_pages_dict.js b/tools/bin/gen_pages_dict.js
index 17151bd..c5fbf3f 100644
--- a/tools/bin/gen_pages_dict.js
+++ b/tools/bin/gen_pages_dict.js
@@ -92,6 +92,8 @@
     // add entries for all Markdown files in the site root
     var allMarkdownFiles = path.join(siteRootPath, '**/*.md');
     glob(allMarkdownFiles, function (error, filePaths) {
+        if (error) throw error;
+
         for (var i = 0; i < filePaths.length; i++) {
             var filePath = filePaths[i];
             var fileURI = pathToURI(filePath, siteRootPath);
diff --git a/tools/bin/gen_versions.js b/tools/bin/gen_versions.js
index aa0fa1f..9b51259 100644
--- a/tools/bin/gen_versions.js
+++ b/tools/bin/gen_versions.js
@@ -56,23 +56,21 @@
         var versionNames = util.listdirsSync(langPath);
 
         // get language ID
-        var langName;
-        if (langId in LANGUAGE_MAP) {
-            langName = LANGUAGE_MAP[langId];
-        } else {
+        var langName = LANGUAGE_MAP[langId];
+        if (!langName) {
             console.error("Language identifier '" + langId + "' doesn't have an associated name. Please fix that by changing " + scriptName + '.');
             process.exit(1);
         }
 
         // set the language name and the versions it has
         config[langId] = {
-            'name': LANGUAGE_MAP[langId],
+            'name': langName,
             'versions': versionNames
         };
     });
 
     console.log(util.generatedBy(__filename));
-    console.log(yaml.dump(config, {indent: 4}));
+    console.log(yaml.dump(config, { indent: 4 }));
 }
 
 main();
diff --git a/tools/bin/toc.js b/tools/bin/toc.js
index 6ef9693..a26fae8 100644
--- a/tools/bin/toc.js
+++ b/tools/bin/toc.js
@@ -54,6 +54,7 @@
 
             // read the input
             fs.readFile(srcTocPath, function (error, data) {
+                if (error) throw error;
 
                 // augment the ToC
                 var originalTocString = data.toString();
@@ -63,6 +64,7 @@
 
                 // write the output
                 fs.writeFile(destTocPath, output, function (error, data) {
+                    if (error) throw error;
                     console.log(srcTocPath + ' -> ' + destTocPath);
                 });
             });
