diff --git a/.eslintignore b/.eslintignore
index 961edb75337f81ba61a28ebde47772400b7567c6..de133ba4492d4df405bd31fc57d6da26afccee75 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -6,3 +6,4 @@ libraries/**/*
 sites/**/libraries/**/*
 profiles/**/libraries/**/*
 **/js_test_files/**/*
+**/node_modules/**/*
diff --git a/.eslintrc b/.eslintrc
deleted file mode 100644
index 9c0e3e698d0fe5e6fa9ed374ed5bad4c19ae007c..0000000000000000000000000000000000000000
--- a/.eslintrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "extends": "./core/.eslintrc"
-}
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..d4bbc92052201490a83d06dd502318ee600f07f7
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,3 @@
+{
+  "extends": "./core/.eslintrc.json"
+}
diff --git a/core/.eslintignore b/core/.eslintignore
new file mode 100644
index 0000000000000000000000000000000000000000..a15282a9a4a35a9e882ba7da4769c185e350412f
--- /dev/null
+++ b/core/.eslintignore
@@ -0,0 +1,4 @@
+assets/vendor/**/*
+modules/locale/tests/locale_test.js
+node_modules/**/*
+**/js_test_files/**/*
diff --git a/core/.eslintrc b/core/.eslintrc.json
similarity index 98%
rename from core/.eslintrc
rename to core/.eslintrc.json
index 42dda02cd93b6b96e523a5e19a2d7bd1eb178dba..218d84f9372cce5bc2f5176f3442bf274a01e893 100644
--- a/core/.eslintrc
+++ b/core/.eslintrc.json
@@ -82,7 +82,7 @@
     "space-infix-ops": 2,
     "space-unary-ops": [2, { "words": true, "nonwords": false }],
     "spaced-comment": [2, "always"],
-    "strict": 2,
+    "strict": [2, "function"],
     "yoda": [2, "never"],
     // Warnings.
     "max-nested-callbacks": [1, 3],
diff --git a/core/misc/active-link.js b/core/misc/active-link.js
index 9cf55b43444fdb90e45eca6a8868863e742adef1..65037f75b80ee0eba6cf1e8abebfe7b67c370e1a 100644
--- a/core/misc/active-link.js
+++ b/core/misc/active-link.js
@@ -26,7 +26,7 @@
       // Start by finding all potentially active links.
       var path = drupalSettings.path;
       var queryString = JSON.stringify(path.currentQuery);
-      var querySelector = path.currentQuery ? "[data-drupal-link-query='" + queryString + "']" : ':not([data-drupal-link-query])';
+      var querySelector = path.currentQuery ? "[data-eedrupal-link-query='" + queryString + "']" : ':not([data-drupal-link-query])';
       var originalSelectors = ['[data-drupal-link-system-path="' + path.currentPath + '"]'];
       var selectors;
 
diff --git a/core/package.json b/core/package.json
index 8bf4e79c8c535fb0a2bcda9cf88f757257128d4e..0c595be357a13d91a4eca0de4a111763b4e90f32 100644
--- a/core/package.json
+++ b/core/package.json
@@ -5,12 +5,15 @@
   "private": true,
   "scripts": {
     "build:js": "./scripts/js/babel-es6-compile.sh",
-    "watch:js": "node ./scripts/js/babel-es6-watch.js"
+    "watch:js": "node ./scripts/js/babel-es6-watch.js",
+    "lint:js": "eslint . || exit 0"
   },
   "devDependencies": {
     "babel-cli": "6.16.0",
+    "babel-core": "6.17.0",
     "babel-preset-es2015": "6.16.0",
-    "chokidar": "1.6.0"
+    "chokidar": "1.6.0",
+    "eslint": "3.8.1"
   },
   "babel": {
     "presets": [
diff --git a/core/scripts/js/.eslintrc.json b/core/scripts/js/.eslintrc.json
new file mode 100644
index 0000000000000000000000000000000000000000..4152517e276b76994626378623ee9f369e32c945
--- /dev/null
+++ b/core/scripts/js/.eslintrc.json
@@ -0,0 +1,5 @@
+{
+  "rules": {
+    "strict": [2, "global"]
+  }
+}
diff --git a/core/scripts/js/babel-es6-watch.js b/core/scripts/js/babel-es6-watch.js
index 9262e9e671594a3f6e97b77b466c7f4d52e2a36e..2bae2456ef47f2a47d47d1206c0f3f12e0e3f63a 100644
--- a/core/scripts/js/babel-es6-watch.js
+++ b/core/scripts/js/babel-es6-watch.js
@@ -15,13 +15,13 @@ const babel = require('babel-core');
 const chokidar = require('chokidar');
 
 // Logging human-readable timestamp.
-const log = function (message) {
+const log = function log(message) {
   // eslint-disable-next-line no-console
   console.log(`[${new Date().toTimeString().slice(0, 8)}] ${message}`);
 };
 
 function addSourceMappingUrl(code, loc) {
-  return code + '\n\n//# sourceMappingURL=' + path.basename(loc);
+  return `${code}\n\n//# sourceMappingURL=${path.basename(loc)}`;
 }
 
 const fileMatch = './**/*.es6.js';
@@ -36,15 +36,13 @@ const babelOptions = {
 };
 
 const changedOrAdded = (filePath) => {
-  babel.transformFile(filePath, babelOptions, function (err, result) {
+  babel.transformFile(filePath, babelOptions, (err, result) => {
     const fileName = filePath.slice(0, -7);
-
     // we've requested for a sourcemap to be written to disk
-    let mapLoc = `${fileName}.js.map`;
-    result.code = addSourceMappingUrl(result.code, mapLoc);
-    fs.writeFileSync(mapLoc, JSON.stringify(result.map));
+    const mapLoc = `${fileName}.js.map`;
 
-    fs.writeFileSync(`${fileName}.js`, result.code);
+    fs.writeFileSync(mapLoc, JSON.stringify(result.map));
+    fs.writeFileSync(`${fileName}.js`, addSourceMappingUrl(result.code, mapLoc));
 
     log(`'${filePath}' has been changed.`);
   });
@@ -52,19 +50,19 @@ const changedOrAdded = (filePath) => {
 
 const unlinkHandler = (err) => {
   if (err) {
-    return log(err);
+    log(err);
   }
 };
 
 watcher
   .on('add', filePath => changedOrAdded(filePath))
   .on('change', filePath => changedOrAdded(filePath))
-  .on('unlink', filePath => {
+  .on('unlink', (filePath) => {
     const fileName = filePath.slice(0, -7);
-    fs.stat(`${fileName}.js`, function () {
+    fs.stat(`${fileName}.js`, () => {
       fs.unlink(`${fileName}.js`, unlinkHandler);
     });
-    fs.stat(`${fileName}.js.map`, function () {
+    fs.stat(`${fileName}.js.map`, () => {
       fs.unlink(`${fileName}.js.map`, unlinkHandler);
     });
   })