diff --git a/.eslintignore b/.eslintignore
index de133ba..9c13487 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -1,5 +1,4 @@
-core/assets/vendor/**/*
-core/modules/locale/tests/locale_test.js
+core/**/*
 vendor/**/*
 sites/**/files/**/*
 libraries/**/*
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index d4bbc92..0000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-  "extends": "./core/.eslintrc.json"
-}
diff --git a/.eslintrc.legacy.yml b/.eslintrc.legacy.yml
new file mode 100644
index 0000000..49ac40c
--- /dev/null
+++ b/.eslintrc.legacy.yml
@@ -0,0 +1,165 @@
+---
+extends: 'eslint:recommended'
+root: true
+env:
+  browser: true
+globals:
+  Drupal: true
+  drupalSettings: true
+  drupalTranslations: true
+  domready: true
+  jQuery: true
+  '_': true
+  matchMedia: true
+  Backbone: true
+  Modernizr: true
+  CKEDITOR: true
+rules:
+  allow-bracket-spacing:
+    - 2
+    - never
+  block-scoped-var: 2
+  brarce-style:
+    - 2
+    - stroustrup
+    -
+      allowSingleLine: true
+  comma-dangle:
+    - 2
+    - never
+  comma-spacing: 2
+  comma-style:
+    - 2
+    - last
+  computed-property-spacing:
+    - 2
+    - never
+  curly:
+    - 2
+    - all
+  eol-last: 2
+  eqeqeq:
+    - 2
+    - smart
+  guard-for-in: 2
+  indent:
+    - 2
+    - 2
+    -
+      SwitchCase: 1
+  key-spacing:
+    - 2
+    -
+      beforeColon: false
+      afterColon: true
+  keyword-spacing:
+    - 2
+    -
+      before: true
+      after: true
+  linebreak-style:
+    - 2
+    - unix
+  lines-around-comment:
+    - 2
+    -
+      beforeBlockComment: true
+      afterBlockComment: false
+  new-parens: 2
+  no-array-constructor: 2
+  no-caller: 2
+  no-catch-shadow: 2
+  no-eval: 2
+  no-extend-native: 2
+  no-extra-bind: 2
+  no-extra-parens:
+    - 2
+    - functions
+  no-implied-eval: 2
+  no-iterator: 2
+  no-label-var: 2
+  no-labels: 2
+  no-lone-blocks: 2
+  no-loop-func: 2
+  no-multi-spaces: 2
+  no-multi-str: 2
+  no-native-reassign: 2
+  no-nested-ternary: 2
+  no-new-func: 2
+  no-new-object: 2
+  no-new-wrappers: 2
+  no-octal-escape: 2
+  no-process-exit: 2
+  no-proto: 2
+  no-return-assign: 2
+  no-script-url: 2
+  no-sequences: 2
+  no-shadow-restricted-names: 2
+  no-spaced-func: 2
+  no-trailing-spaces: 2
+  no-undef-init: 2
+  no-undefined: 2
+  no-unused-expressions: 2
+  no-unused-vars:
+    - 2
+    -
+      vars: all
+      args: none
+  no-with: 2
+  object-curly-spacing:
+    - 2
+    - never
+  one-var:
+    - 2
+    - never
+  quote-props:
+    - 2
+    - 'consistent-as-needed'
+  quotes:
+    - 2
+    - single
+    - 'avoid-escape'
+  semi:
+    - 2
+    - always
+  semi-spacing:
+    - 2
+    -
+      before: false
+      after: true
+  space-before-blocks:
+    - 2
+    - always
+  space-before-function-parens:
+    - 2
+    -
+      anonymous: always
+      named: never
+  space-in-parens:
+    - 2
+    - never
+  space-infix-ops: 2
+  space-unary-ops:
+    - 2
+    -
+      words: true
+      nowords: false
+  space-comment:
+    - 2
+    - always
+  strict:
+    - 2
+    - function
+  yoda:
+    - 2
+    - never
+  max-nested-callbacks:
+    - 1
+    - 3
+  valid-jsdoc:
+    - 1
+    -
+      prefer:
+        returns: return
+        property: prop
+      requireReturn: false
diff --git a/.eslintrc.yml b/.eslintrc.yml
new file mode 100644
index 0000000..b061d34
--- /dev/null
+++ b/.eslintrc.yml
@@ -0,0 +1,3 @@
+---
+extends: './core/.eslintrc.yml'
+root: true
diff --git a/core/.eslintignore b/core/.eslintignore
index a15282a..ac3272e 100644
--- a/core/.eslintignore
+++ b/core/.eslintignore
@@ -2,3 +2,5 @@ assets/vendor/**/*
 modules/locale/tests/locale_test.js
 node_modules/**/*
 **/js_test_files/**/*
+*.js
+!*.es6.js
diff --git a/core/.eslintrc.json b/core/.eslintrc.json
deleted file mode 100644
index 218d84f..0000000
--- a/core/.eslintrc.json
+++ /dev/null
@@ -1,97 +0,0 @@
-{
-  "extends": "eslint:recommended",
-  "env": {
-    "browser": true,
-    "es6": true,
-    "node": true
-  },
-  "globals": {
-    "Drupal": true,
-    "drupalSettings": true,
-    "drupalTranslations": true,
-    "domready": true,
-    "jQuery": true,
-    "_": true,
-    "matchMedia": true,
-    "Backbone": true,
-    "Modernizr": true,
-    "CKEDITOR": true
-  },
-  "rules": {
-    // Errors.
-    "array-bracket-spacing": [2, "never"],
-    "block-scoped-var": 2,
-    "brace-style": [2, "stroustrup", {"allowSingleLine": true}],
-    "comma-dangle": [2, "never"],
-    "comma-spacing": 2,
-    "comma-style": [2, "last"],
-    "computed-property-spacing": [2, "never"],
-    "curly": [2, "all"],
-    "eol-last": 2,
-    "eqeqeq": [2, "smart"],
-    "guard-for-in": 2,
-    "indent": [2, 2, {"SwitchCase": 1}],
-    "key-spacing": [2, {"beforeColon": false, "afterColon": true}],
-    "keyword-spacing": [2, {"before": true, "after": true}],
-    "linebreak-style": [2, "unix"],
-    "lines-around-comment": [2, {"beforeBlockComment": true, "afterBlockComment": false}],
-    "new-parens": 2,
-    "no-array-constructor": 2,
-    "no-caller": 2,
-    "no-catch-shadow": 2,
-    "no-eval": 2,
-    "no-extend-native": 2,
-    "no-extra-bind": 2,
-    "no-extra-parens": [2, "functions"],
-    "no-implied-eval": 2,
-    "no-iterator": 2,
-    "no-label-var": 2,
-    "no-labels": 2,
-    "no-lone-blocks": 2,
-    "no-loop-func": 2,
-    "no-multi-spaces": 2,
-    "no-multi-str": 2,
-    "no-native-reassign": 2,
-    "no-nested-ternary": 2,
-    "no-new-func": 2,
-    "no-new-object": 2,
-    "no-new-wrappers": 2,
-    "no-octal-escape": 2,
-    "no-process-exit": 2,
-    "no-proto": 2,
-    "no-return-assign": 2,
-    "no-script-url": 2,
-    "no-sequences": 2,
-    "no-shadow-restricted-names": 2,
-    "no-spaced-func": 2,
-    "no-trailing-spaces": 2,
-    "no-undef-init": 2,
-    "no-undefined": 2,
-    "no-unused-expressions": 2,
-    "no-unused-vars": [2, {"vars": "all", "args": "none"}],
-    "no-with": 2,
-    "object-curly-spacing": [2, "never"],
-    "one-var": [2, "never"],
-    "quote-props": [2, "consistent-as-needed"],
-    "quotes": [2, "single", "avoid-escape"],
-    "semi": [2, "always"],
-    "semi-spacing": [2, {"before": false, "after": true}],
-    "space-before-blocks": [2, "always"],
-    "space-before-function-paren": [2, {"anonymous": "always", "named": "never"}],
-    "space-in-parens": [2, "never"],
-    "space-infix-ops": 2,
-    "space-unary-ops": [2, { "words": true, "nonwords": false }],
-    "spaced-comment": [2, "always"],
-    "strict": [2, "function"],
-    "yoda": [2, "never"],
-    // Warnings.
-    "max-nested-callbacks": [1, 3],
-    "valid-jsdoc": [1, {
-      "prefer": {
-        "returns": "return",
-        "property": "prop"
-      },
-      "requireReturn": false
-    }]
-  }
-}
diff --git a/core/.eslintrc.yml b/core/.eslintrc.yml
new file mode 100644
index 0000000..066a5cc
--- /dev/null
+++ b/core/.eslintrc.yml
@@ -0,0 +1,51 @@
+---
+extends: 'eslint-config-airbnb'
+root: true
+env:
+  browser: true
+  es6: true
+  node: true
+globals:
+  Drupal: true
+  drupalSettings: true
+  drupalTranslations: true
+  domready: true
+  jQuery: true
+  '_': true
+  matchMedia: true
+  Backbone: true
+  Modernizr: true
+  CKEDITOR: true
+rules:
+  # Allow the use of early return.
+  consistent-return: 0
+  # Allow representing pseudo-private methods or variables using underscores.
+  no-underscore-dangle: 0
+  # Suggest breaking down long, nested functions in order to reduce complexity.
+  max-nested-callbacks:
+    - 1
+    - 3
+  # Suggest to avoid singleton pattern in modules.
+  no-mutable-exports: 1
+  # Suggest to avoid shorthand code other than in for loop blocks.
+  no-plusplus:
+    - 1
+    -
+      allowForLoopAfterthoughts: true
+  # Allow pass by reference.
+  no-param-reassign: 0
+  # Allow calling Object.prototype methods directly instead of with call.
+  no-prototype-builtins: 0
+  valid-jsdoc:
+    - 1
+    -
+      prefer:
+        returns: return
+        property: prop
+      requireReturn: false
+  # Use brace style per Drupal PHP standards.
+  brace-style:
+    - error
+    - stroustrup
+  # Suggest to clean up variables that are not used to avoid confusion.
+  no-unused-vars: 1
diff --git a/core/package.json b/core/package.json
index b168cb3..b20516d 100644
--- a/core/package.json
+++ b/core/package.json
@@ -6,14 +6,18 @@
   "scripts": {
     "build:js": "node ./scripts/js/babel-es6-build.js",
     "watch:js": "node ./scripts/js/babel-es6-watch.js",
-    "lint:js": "eslint . || exit 0"
+    "lint:core-js": "node ./node_modules/eslint/bin/eslint.js --ext=.es6.js . --fix || exit 0"
   },
   "devDependencies": {
-    "babel-core": "6.17.0",
+    "babel-core": "6.24.0",
     "babel-preset-es2015": "6.16.0",
-    "chokidar": "1.6.0",
-    "eslint": "3.8.1",
-    "glob": "^7.1.1"
+    "chokidar": "1.6.1",
+    "eslint": "3.18.0",
+    "eslint-config-airbnb": "14.1.0",
+    "eslint-plugin-import": "2.2.0",
+    "eslint-plugin-jsx-a11y": "4.0.0",
+    "eslint-plugin-react": "6.10.3",
+    "glob": "7.1.1"
   },
   "babel": {
     "presets": [
