diff --git a/.eslintrc.json b/.eslintrc.json
index f858880c0f85da3651fc1fff9f2bfe3d25c82253..36d4a7a6261a7c8117d689a8066e566df774dad4 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -1,3 +1,23 @@
 {
-  "extends": "eslint-config-edx"
+  "extends": "eslint-config-edx",
+  "globals": {  // Try to avoid adding any new globals.
+    // Old compatibility things and hacks
+    "edx": true,
+    "XBlock": true,
+
+    // added by Django i18n tools
+    "gettext": true,
+    "ngettext": true,
+
+    // added by jasmine-jquery
+    "loadFixtures": true,
+    "appendLoadFixtures": true,
+    "readFixtures": true,
+    "setFixtures": true,
+    "appendSetFixtures": true,
+    "spyOnEvent": true,
+
+    // used by our requirejs implementation
+    "RequireJS": true
+  }
 }
diff --git a/cms/static/cms/js/main.js b/cms/static/cms/js/main.js
index 0cae898de31627abd773956ae1d4a358f8078fa3..219f362a7f341c7a2274226c736ee2e21baacf53 100644
--- a/cms/static/cms/js/main.js
+++ b/cms/static/cms/js/main.js
@@ -1,3 +1,5 @@
+/* globals AjaxPrefix */
+
 (function(AjaxPrefix) {
     'use strict';
     define(['domReady', 'jquery', 'underscore.string', 'backbone', 'gettext',
@@ -34,7 +36,7 @@
                         message = str.truncate(jqXHR.responseText, 300);
                     }
                 } else {
-                    message = gettext('This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.');  //jshint ignore:line
+                    message = gettext('This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.');  // eslint-disable-line max-len
                 }
                 msg = new NotificationView.Error({
                     'title': gettext("Studio's having trouble saving your work"),
@@ -65,5 +67,4 @@
         main();
         return main;
     });
-
-}).call(this, AjaxPrefix);  //jshint ignore:line
+}).call(this, AjaxPrefix);
diff --git a/cms/static/cms/js/require-config.js b/cms/static/cms/js/require-config.js
index 7f9e526e51f672e4ae0dd1ae3ce182363617b6a0..ebce5dc0f1a0c29bd388feb0ef48a24184f4e444 100644
--- a/cms/static/cms/js/require-config.js
+++ b/cms/static/cms/js/require-config.js
@@ -94,7 +94,7 @@
             // end of Annotation tool files
 
             // externally hosted files
-            'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured', // jshint ignore:line
+            mathjax: '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',  // eslint-disable-line max-len
             'youtube': [
                 // youtube URL does not end in '.js'. We add '?noext' to the path so
                 // that require.js adds the '.js' to the query component of the URL,
diff --git a/cms/static/cms/js/spec/main.js b/cms/static/cms/js/spec/main.js
index 223a25b564a9044547f137970238232e311a6f3e..a74bf1cb9f6ec48a58cd65dd28c19b2d7ab18e11 100644
--- a/cms/static/cms/js/spec/main.js
+++ b/cms/static/cms/js/spec/main.js
@@ -1,3 +1,5 @@
+/* globals requirejs, requireSerial */
+
 (function(requirejs, requireSerial) {
     'use strict';
 
@@ -22,9 +24,9 @@
             'jquery.cookie': 'xmodule_js/common_static/js/vendor/jquery.cookie',
             'jquery.qtip': 'xmodule_js/common_static/js/vendor/jquery.qtip.min',
             'jquery.fileupload': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload',
-            'jquery.fileupload-process': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-process',  // jshint ignore:line
-            'jquery.fileupload-validate': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate',  // jshint ignore:line
-            'jquery.iframe-transport': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.iframe-transport',  // jshint ignore:line
+            'jquery.fileupload-process': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-process',   // eslint-disable-line max-len
+            'jquery.fileupload-validate': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate',   // eslint-disable-line max-len
+            'jquery.iframe-transport': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.iframe-transport',   // eslint-disable-line max-len
             'jquery.inputnumber': 'xmodule_js/common_static/js/vendor/html5-input-polyfills/number-polyfill',
             'jquery.immediateDescendents': 'xmodule_js/common_static/coffee/src/jquery.immediateDescendents',
             'jquery.simulate': 'xmodule_js/common_static/js/vendor/jquery.simulate',
@@ -54,7 +56,7 @@
             'domReady': 'xmodule_js/common_static/js/vendor/domReady',
             'URI': 'xmodule_js/common_static/js/vendor/URI.min',
             'mock-ajax': 'xmodule_js/common_static/js/vendor/mock-ajax',
-            'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',  // jshint ignore:line
+            mathjax: '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',   // eslint-disable-line max-len
             'youtube': '//www.youtube.com/player_api?noext',
             'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix',
             'js/spec/test_utils': 'js/spec/test_utils'
@@ -290,5 +292,4 @@
     requireSerial(specHelpers.concat(testFiles), function() {
         return window.__karma__.start();
     });
-
-}).call(this, requirejs, requireSerial);  // jshint ignore:line
+}).call(this, requirejs, requireSerial);
diff --git a/cms/static/cms/js/spec/main_spec.js b/cms/static/cms/js/spec/main_spec.js
index 235ce31e96e4c72963eedf22185f1b0d07bfa964..e61d25d444d1eac4003b3cd3cc01c53c72f70920 100644
--- a/cms/static/cms/js/spec/main_spec.js
+++ b/cms/static/cms/js/spec/main_spec.js
@@ -1,3 +1,5 @@
+/* globals sandbox */
+
 (function(sandbox) {
     'use strict';
     require(["jquery", "backbone", "cms/js/main", "edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers", "jquery.cookie"],
@@ -77,5 +79,4 @@
             });
         });
     });
-
-}).call(this, sandbox);  //jshint ignore:line
+}).call(this, sandbox);
diff --git a/cms/static/cms/js/spec/main_squire.js b/cms/static/cms/js/spec/main_squire.js
index 867047263dcdbbaa481c17a58a39ca8ef6747729..b4eb462775b477716307ceeb8ceb780f25875542 100644
--- a/cms/static/cms/js/spec/main_squire.js
+++ b/cms/static/cms/js/spec/main_squire.js
@@ -1,3 +1,5 @@
+/* globals requirejs, requireSerial */
+
 (function(requirejs, requireSerial) {
     'use strict';
 
@@ -21,9 +23,9 @@
             'jquery.cookie': 'xmodule_js/common_static/js/vendor/jquery.cookie',
             'jquery.qtip': 'xmodule_js/common_static/js/vendor/jquery.qtip.min',
             'jquery.fileupload': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload',
-            'jquery.fileupload-process': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-process',  // jshint ignore:line
-            'jquery.fileupload-validate': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate',  // jshint ignore:line
-            'jquery.iframe-transport': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.iframe-transport',  // jshint ignore:line
+            'jquery.fileupload-process': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-process',   // eslint-disable-line max-len
+            'jquery.fileupload-validate': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate',   // eslint-disable-line max-len
+            'jquery.iframe-transport': 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.iframe-transport',   // eslint-disable-line max-len
             'jquery.inputnumber': 'xmodule_js/common_static/js/vendor/html5-input-polyfills/number-polyfill',
             'jquery.immediateDescendents': 'xmodule_js/common_static/coffee/src/jquery.immediateDescendents',
             'datepair': 'xmodule_js/common_static/js/vendor/timepicker/datepair',
@@ -46,7 +48,7 @@
             'draggabilly': 'xmodule_js/common_static/js/vendor/draggabilly',
             'domReady': 'xmodule_js/common_static/js/vendor/domReady',
             'URI': 'xmodule_js/common_static/js/vendor/URI.min',
-            'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',  // jshint ignore:line
+            mathjax: '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',   // eslint-disable-line max-len
             'youtube': '//www.youtube.com/player_api?noext',
             'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix'
         },
@@ -206,5 +208,4 @@
     requireSerial(specHelpers.concat(testFiles), function() {
         return window.__karma__.start();
     });
-
-}).call(this, requirejs, requireSerial);  // jshint ignore:line
+}).call(this, requirejs, requireSerial);
diff --git a/cms/static/js/certificates/collections/certificates.js b/cms/static/js/certificates/collections/certificates.js
index 234dd0098bb992c69d1740a2d8d1dc3ea9e8551f..778a43f7ed739693ce45c545d3601b1b68d34abb 100644
--- a/cms/static/js/certificates/collections/certificates.js
+++ b/cms/static/js/certificates/collections/certificates.js
@@ -1,6 +1,6 @@
 // Backbone.js Application Collection: Certificates
 
-define([ // jshint ignore:line
+define([
     'backbone',
     'gettext',
     'js/certificates/models/certificate'
diff --git a/cms/static/js/certificates/collections/signatories.js b/cms/static/js/certificates/collections/signatories.js
index 3205fab41fde4ed718fcdb9ac0d6b408d9292967..cd76e1c5020181888d9328904ac7a8c7b8390004 100644
--- a/cms/static/js/certificates/collections/signatories.js
+++ b/cms/static/js/certificates/collections/signatories.js
@@ -1,6 +1,6 @@
 // Backbone.js Application Collection: Certificate Signatories
 
-define([ // jshint ignore:line
+define([
     'backbone',
     'js/certificates/models/signatory'
 ],
diff --git a/cms/static/js/certificates/factories/certificates_page_factory.js b/cms/static/js/certificates/factories/certificates_page_factory.js
index a3943dfe786b5e303dcb00d737e0db5a43280101..39d7941f42beecf2a85fc198955b628375778d31 100644
--- a/cms/static/js/certificates/factories/certificates_page_factory.js
+++ b/cms/static/js/certificates/factories/certificates_page_factory.js
@@ -11,7 +11,7 @@ The RequireJS Optimizer is only enabled in Studio at present, so the page factor
 We do intend to enable page factories on the LMS too.
 */
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'js/certificates/collections/certificates',
     'js/certificates/models/certificate',
diff --git a/cms/static/js/certificates/models/signatory.js b/cms/static/js/certificates/models/signatory.js
index 445743cfc5c6c771462bdc01d36609c75a02ebdd..499ff3467a7c022dcfe507f99c0df56f51bcc802 100644
--- a/cms/static/js/certificates/models/signatory.js
+++ b/cms/static/js/certificates/models/signatory.js
@@ -1,6 +1,6 @@
 // Backbone.js Application Model: Certificate Signatory
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'backbone',
     'backbone-relational'
diff --git a/cms/static/js/certificates/spec/custom_matchers.js b/cms/static/js/certificates/spec/custom_matchers.js
index 43b11bff378d77667b086a50f645bf49cfe3b6a8..38e21459e085af2dc0cd9788e6b9ecc669aca312 100644
--- a/cms/static/js/certificates/spec/custom_matchers.js
+++ b/cms/static/js/certificates/spec/custom_matchers.js
@@ -1,7 +1,7 @@
 // Custom matcher library for Jasmine test assertions
 // http://tobyho.com/2012/01/30/write-a-jasmine-matcher/
 
-define(['jquery'], function($) { // jshint ignore:line
+define(['jquery'], function($) {  // eslint-disable-line no-unused-vars
     'use strict';
     return function () {
         jasmine.addMatchers({
diff --git a/cms/static/js/certificates/spec/models/certificate_spec.js b/cms/static/js/certificates/spec/models/certificate_spec.js
index 5197209e2aa2220e2e9f86fcb514f59500114158..bfd229feab6dca72989594f2b06e8693a07f37f7 100644
--- a/cms/static/js/certificates/spec/models/certificate_spec.js
+++ b/cms/static/js/certificates/spec/models/certificate_spec.js
@@ -1,6 +1,6 @@
 // Jasmine Test Suite: Certifiate Model
 
-define([ // jshint ignore:line
+define([
     'js/certificates/models/certificate',
     'js/certificates/collections/certificates'
 ],
diff --git a/cms/static/js/certificates/spec/views/certificate_details_spec.js b/cms/static/js/certificates/spec/views/certificate_details_spec.js
index 7c02d4ef141b7b5e1f42929aee125141ed46155b..863fac166f1c9eeda6c8b6f29c0792827a14e93f 100644
--- a/cms/static/js/certificates/spec/views/certificate_details_spec.js
+++ b/cms/static/js/certificates/spec/views/certificate_details_spec.js
@@ -1,6 +1,6 @@
 // Jasmine Test Suite: Certifiate Details View
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'js/models/course',
     'js/certificates/collections/certificates',
@@ -104,7 +104,7 @@ function(_, Course, CertificatesCollection, CertificateModel, CertificateDetails
                 model: this.model
             });
             appendSetFixtures(this.view.render().el);
-            CustomMatchers(); // jshint ignore:line
+            CustomMatchers();
         });
 
         afterEach(function() {
@@ -141,7 +141,7 @@ function(_, Course, CertificatesCollection, CertificateModel, CertificateDetails
             });
 
             it('should have empty certificate collection if there is an error parsing certifcate JSON', function () {
-                var CERTIFICATE_INVALID_JSON = '[{"course_title": Test certificate course title override, "signatories":"[]"}]'; // jshint ignore:line
+                var CERTIFICATE_INVALID_JSON = '[{"course_title": Test certificate course title override, "signatories":"[]"}]';  // eslint-disable-line max-len
                 var collection_length = this.collection.length;
                 this.collection.parse(CERTIFICATE_INVALID_JSON);
                 //collection length should remain the same since we have error parsing JSON
diff --git a/cms/static/js/certificates/spec/views/certificate_editor_spec.js b/cms/static/js/certificates/spec/views/certificate_editor_spec.js
index 0cee81f0f7a83f7a552361b4fa1d2844e7d59166..f674a9d56b36de40226077907beee128c6a47c1a 100644
--- a/cms/static/js/certificates/spec/views/certificate_editor_spec.js
+++ b/cms/static/js/certificates/spec/views/certificate_editor_spec.js
@@ -1,6 +1,6 @@
 // Jasmine Test Suite: Certifiate Editor View
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'js/models/course',
     'js/certificates/models/certificate',
@@ -119,7 +119,7 @@ function(_, Course, CertificateModel, SignatoryModel, CertificatesCollection, Ce
                 max_signatories_limit: MAX_SIGNATORIES_LIMIT
             });
             appendSetFixtures(this.view.render().el);
-            CustomMatchers(); // jshint ignore:line
+            CustomMatchers();
         });
 
         afterEach(function() {
diff --git a/cms/static/js/certificates/spec/views/certificate_preview_spec.js b/cms/static/js/certificates/spec/views/certificate_preview_spec.js
index ae2d40009d7489f738fd65e69859581758820085..f0d8e3e99071df1e500e7997c230afb91a30e621 100644
--- a/cms/static/js/certificates/spec/views/certificate_preview_spec.js
+++ b/cms/static/js/certificates/spec/views/certificate_preview_spec.js
@@ -1,6 +1,6 @@
 // Jasmine Test Suite: Certificate Web Preview
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'jquery',
     'js/models/course',
diff --git a/cms/static/js/certificates/spec/views/certificates_list_spec.js b/cms/static/js/certificates/spec/views/certificates_list_spec.js
index 3deb6a1cb9c7dfcf1f8c40a8ce4e06351a21ce1b..1f39ebb512c8cae0e8df5db7346ca51324165ec1 100644
--- a/cms/static/js/certificates/spec/views/certificates_list_spec.js
+++ b/cms/static/js/certificates/spec/views/certificates_list_spec.js
@@ -1,6 +1,6 @@
 // Jasmine Test Suite: Certificate List View
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'js/models/course',
     'js/certificates/collections/certificates',
@@ -61,7 +61,7 @@ function(_, Course, CertificatesCollection, CertificateModel, CertificateDetails
                 collection: this.collection
             });
             appendSetFixtures(this.view.render().el);
-            CustomMatchers(); // jshint ignore:line
+            CustomMatchers();
         });
 
         afterEach(function() {
diff --git a/cms/static/js/certificates/views/certificate_details.js b/cms/static/js/certificates/views/certificate_details.js
index 44823c59f6ed897f097e392f0998cd8913feb5eb..04c1da58c9c0f6461a883709002fabad551c807a 100644
--- a/cms/static/js/certificates/views/certificate_details.js
+++ b/cms/static/js/certificates/views/certificate_details.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Certificate Details
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'underscore.string',
diff --git a/cms/static/js/certificates/views/certificate_editor.js b/cms/static/js/certificates/views/certificate_editor.js
index cff8eb14c45e83a4ea8062bb67e8f4f27181d885..9105ebc21161b475ae49b95b24ed0d6a8a501b9b 100644
--- a/cms/static/js/certificates/views/certificate_editor.js
+++ b/cms/static/js/certificates/views/certificate_editor.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Certificate Editor
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'backbone',
@@ -83,7 +83,7 @@ function($, _, Backbone, gettext,
 
         addSignatory: function() {
             // Append a new signatory to the certificate model's signatories collection
-            var signatory = new SignatoryModel({certificate: this.getSaveableModel()}); // jshint ignore:line
+            var signatory = new SignatoryModel({certificate: this.getSaveableModel()});  // eslint-disable-line max-len, no-unused-vars
             this.render();
         },
 
diff --git a/cms/static/js/certificates/views/certificate_item.js b/cms/static/js/certificates/views/certificate_item.js
index 9398d53ed76331db120500af39d1103862e8036b..9ba1e3b8b3ecdcff4b1ceb7cd1173b3d94534601 100644
--- a/cms/static/js/certificates/views/certificate_item.js
+++ b/cms/static/js/certificates/views/certificate_item.js
@@ -1,7 +1,7 @@
 // Backbone Application View: Certificate Item
 // Renders an editor view or a details view depending on the state of the underlying model.
 
-define([ // jshint ignore:line
+define([
     'gettext',
     'js/views/list_item',
     'js/certificates/views/certificate_details',
diff --git a/cms/static/js/certificates/views/certificate_preview.js b/cms/static/js/certificates/views/certificate_preview.js
index 70bf9977ee32bb5a0fb4827cb1058ae545a4f201..410501f9c35f7590381a6eb77caf4404a776f07e 100644
--- a/cms/static/js/certificates/views/certificate_preview.js
+++ b/cms/static/js/certificates/views/certificate_preview.js
@@ -2,7 +2,7 @@
 // User can preview the certificate web layout/styles. 'Preview Certificate' button will open a new tab in LMS for
 // the selected course mode from the drop down.
 
-define([ // jshint ignore:line
+define([
     'underscore',
     'gettext',
     'js/views/baseview',
diff --git a/cms/static/js/certificates/views/certificates_list.js b/cms/static/js/certificates/views/certificates_list.js
index c6871ac00f3911993c55ed81648660f70d2ac5e5..fe4e1d9d6a546a369613556a7f9b949067767a8e 100644
--- a/cms/static/js/certificates/views/certificates_list.js
+++ b/cms/static/js/certificates/views/certificates_list.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Certificates List
 
-define([ // jshint ignore:line
+define([
     'gettext',
     'js/views/list',
     'js/certificates/views/certificate_item'
diff --git a/cms/static/js/certificates/views/certificates_page.js b/cms/static/js/certificates/views/certificates_page.js
index 0fc7401a05e6db8905a50b1f736a15727beff2ee..8105d4fc3860840865db5211bad6e6eae540e432 100644
--- a/cms/static/js/certificates/views/certificates_page.js
+++ b/cms/static/js/certificates/views/certificates_page.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Certificates Page
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'gettext',
diff --git a/cms/static/js/certificates/views/signatory_details.js b/cms/static/js/certificates/views/signatory_details.js
index 1f2385a2769871e15571ad37a815ff506174c919..d9a0fc3b27f42138e9225f4d08ccd0450b64337c 100644
--- a/cms/static/js/certificates/views/signatory_details.js
+++ b/cms/static/js/certificates/views/signatory_details.js
@@ -1,6 +1,6 @@
 // Backbone Application View:  Signatory Details
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'underscore.string',
diff --git a/cms/static/js/certificates/views/signatory_editor.js b/cms/static/js/certificates/views/signatory_editor.js
index e1166adc3de053c8bdb423350b68951933fb6ea8..7548fe9c50bd9f982eb6b694d0559f3beba517c4 100644
--- a/cms/static/js/certificates/views/signatory_editor.js
+++ b/cms/static/js/certificates/views/signatory_editor.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Signatory Editor
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'backbone',
diff --git a/cms/static/js/collections/asset.js b/cms/static/js/collections/asset.js
index 7e31a3c4f7c957c0942e4dbde7a417dcb4b4d2c2..db32082608950b2a3e97253a3949fbf290b2213a 100644
--- a/cms/static/js/collections/asset.js
+++ b/cms/static/js/collections/asset.js
@@ -37,8 +37,7 @@ define([
             return PagingCollection.prototype.parse.call(this, response, options);
         },
 
-        /* jshint unused:false */
-        parseState: function (response, queryParams, state, options) {
+        parseState: function(response) {
             return {
                 totalRecords: response[0].totalCount,
                 totalPages: Math.ceil(response[0].totalCount / response[0].pageSize)
diff --git a/cms/static/js/models/uploads.js b/cms/static/js/models/uploads.js
index 6eaf020f60791bb4fc97aac66ccb2dd1bccc0c4e..4ffb4177ee9d751a52236d9f3b0d9cefe92f1c6b 100644
--- a/cms/static/js/models/uploads.js
+++ b/cms/static/js/models/uploads.js
@@ -15,7 +15,7 @@ var FileUpload = Backbone.Model.extend({
     validate: function(attrs, options) {
         if(attrs.selectedFile && !this.checkTypeValidity(attrs.selectedFile)) {
             return {
-                message: _.template(gettext("Only <%= fileTypes %> files can be uploaded. Please select a file ending in <%= fileExtensions %> to upload."))( // jshint ignore:line
+                message: _.template(gettext('Only <%= fileTypes %> files can be uploaded. Please select a file ending in <%= fileExtensions %> to upload.'))(  // eslint-disable-line max-len
                     this.formatValidTypes()
                 ),
                 attributes: {selectedFile: true}
diff --git a/cms/static/js/programs/views/program_details_view.js b/cms/static/js/programs/views/program_details_view.js
index 2fb9fafc6a19c5000f5f98e143ab846e3cd9e6a7..3d0f72ae5f242584bc499408a3f547b70c08ff2b 100644
--- a/cms/static/js/programs/views/program_details_view.js
+++ b/cms/static/js/programs/views/program_details_view.js
@@ -135,7 +135,6 @@ define([
             },
 
             getModalContent: function() {
-                /* jshint maxlen: 300 */
                 return {
                     name: gettext('confirm'),
                     title: gettext('Publish this program?'),
diff --git a/cms/static/js/spec/views/login_studio_spec.js b/cms/static/js/spec/views/login_studio_spec.js
index c3cb2aa3dd55c03cd1b75b899c509f8c3135ca8e..ad5ed53352f01df469a09c99cf434982a1754167 100644
--- a/cms/static/js/spec/views/login_studio_spec.js
+++ b/cms/static/js/spec/views/login_studio_spec.js
@@ -7,7 +7,6 @@ function($, LoginFactory, AjaxHelpers, ViewUtils) {
 
         beforeEach(function() {
             loadFixtures('mock/login.underscore');
-            /*jshint unused: false*/
             var login_factory = new LoginFactory("/home/");
             submitButton = $('#submit');
         });
diff --git a/cms/static/js/spec/views/programs/program_details_spec.js b/cms/static/js/spec/views/programs/program_details_spec.js
index 1aacbfb5d458be4f58895e8a81ff8312793e31ff..0c083a949de137b643e10ac0624b47105b20d06d 100644
--- a/cms/static/js/spec/views/programs/program_details_spec.js
+++ b/cms/static/js/spec/views/programs/program_details_spec.js
@@ -10,7 +10,6 @@ define([
               ProgramDetailsView, constants ) {
         'use strict';
 
-        /* jshint maxlen: 300 */
         describe('ProgramDetailsView', function () {
             var view = {},
                 model = {},
@@ -36,7 +35,7 @@ define([
                         end: null,
                         enrollment_start: null,
                         enrollment_end: null,
-                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3AedX%2BDemoX%2BDemo_Course'
+                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3AedX%2BDemoX%2BDemo_Course'  // eslint-disable-line max-len
                     },
                     {
                         id: 'course-v1:edx+Krampus25+2015_12_05',
@@ -59,7 +58,7 @@ define([
                         end: null,
                         enrollment_start: null,
                         enrollment_end: null,
-                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3Aedx%2BKrampus25%2B2015_12_05'
+                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3Aedx%2BKrampus25%2B2015_12_05'  // eslint-disable-line max-len
                     },
                     {
                         id: 'course-v1:edx+shiaLB101+2016_01',
@@ -82,7 +81,7 @@ define([
                         end: null,
                         enrollment_start: null,
                         enrollment_end: null,
-                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3Aedx%2BshiaLB101%2B2016_01'
+                        blocks_url: 'http://127.0.0.1:8000/api/courses/v1/blocks/?course_id=course-v1%3Aedx%2BshiaLB101%2B2016_01'  // eslint-disable-line max-len
                     }
                 ],
                 programData = {
@@ -381,7 +380,7 @@ define([
                     addCourse();
                     expect( view.$(runSelect).length ).toEqual(0);
                     view.$('.js-add-course-run').first().click();
-                    
+
                     $runSelect = view.$(runSelect);
                     expect( $runSelect.length ).toEqual(1);
                     expect( view.$('.js-remove-run').length ).toEqual(savedRunCount);
@@ -402,7 +401,7 @@ define([
                     $courseView = view.$('.course-container').last();
                     $addRunBtn = $courseView.find('.js-add-course-run');
                     $addRunBtn.click();
-                    
+
                     expect( view.$(runSelect).length ).toEqual(1);
                     expect( view.$(runSelect).find('option').length ).toEqual(courseRunOptionsCount);
 
diff --git a/cms/static/js/views/course_rerun.js b/cms/static/js/views/course_rerun.js
index b256e158e51882a49d3365e7983bf817218ae631..3cde2c09b5827c08fc632fa59190daa99d9a1947 100644
--- a/cms/static/js/views/course_rerun.js
+++ b/cms/static/js/views/course_rerun.js
@@ -50,7 +50,7 @@ define(["domReady", "jquery", "underscore", "js/views/utils/create_course_utils"
 
             // Go into creating re-run state
             $('.rerun-course-save').addClass('is-disabled').attr('aria-disabled', true).addClass('is-processing').html(
-               '<span class="icon fa fa-refresh fa-spin" aria-hidden="true"></span>' + gettext('Processing Re-run Request') //jshint ignore:line
+               '<span class="icon fa fa-refresh fa-spin" aria-hidden="true"></span>' + gettext('Processing Re-run Request')  // eslint-disable-line max-len
             );
             $('.action-cancel').addClass('is-hidden');
         };
diff --git a/cms/static/js/views/instructor_info.js b/cms/static/js/views/instructor_info.js
index 7501deb17a3b3c1ae86f8af2ceaf685ef08067e3..2ef9127b1acf9d0a62b31c09323b249e8d18dde4 100644
--- a/cms/static/js/views/instructor_info.js
+++ b/cms/static/js/views/instructor_info.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Instructor Information
 
-define([  // jshint ignore:line
+define([
         'jquery',
         'underscore',
         'backbone',
diff --git a/cms/static/js/views/learning_info.js b/cms/static/js/views/learning_info.js
index f39478a408b8a05084457124b5df949d6f81f53f..a3c8cbabd2a23afc9f88e82257b88a811a7e9e55 100644
--- a/cms/static/js/views/learning_info.js
+++ b/cms/static/js/views/learning_info.js
@@ -1,6 +1,6 @@
 // Backbone Application View: Course Learning Information
 
-define([ // jshint ignore:line
+define([
     'jquery',
     'underscore',
     'backbone',
diff --git a/cms/static/js/views/metadata.js b/cms/static/js/views/metadata.js
index f9148b3f7e2605347975a8bcf7caac3442c8fcf5..1c805171b98fd4bae28268d84097506ee1adf900 100644
--- a/cms/static/js/views/metadata.js
+++ b/cms/static/js/views/metadata.js
@@ -288,7 +288,7 @@ function(BaseView, _, MetadataModel, AbstractEditor, FileUpload, UploadDialog,
                 var template = _.template(
                     '<li class="list-settings-item">' +
                         '<input type="text" class="input" value="<%- ele %>">' +
-                        '<a href="#" class="remove-action remove-setting" data-index="<%- index %>"><span class="icon fa fa-times-circle" aria-hidden="true"></span><span class="sr">' + gettext('Remove') + '</span></a>' + //jshint ignore:line
+                        '<a href="#" class="remove-action remove-setting" data-index="<%- index %>"><span class="icon fa fa-times-circle" aria-hidden="true"></span><span class="sr">' + gettext('Remove') + '</span></a>' +   // eslint-disable-line max-len
                     '</li>'
                 );
                 list.append($(template({'ele': ele, 'index': index})));
@@ -455,7 +455,7 @@ function(BaseView, _, MetadataModel, AbstractEditor, FileUpload, UploadDialog,
                     '<li class="list-settings-item">' +
                         '<input type="text" class="input input-key" value="<%= key %>">' +
                         '<input type="text" class="input input-value" value="<%= value %>">' +
-                        '<a href="#" class="remove-action remove-setting" data-value="<%= value %>"><span class="icon fa fa-times-circle" aria-hidden="true"></span><span class="sr">Remove</span></a>' + //jshint ignore:line
+                        '<a href="#" class="remove-action remove-setting" data-value="<%= value %>"><span class="icon fa fa-times-circle" aria-hidden="true"></span><span class="sr">Remove</span></a>' +  // eslint-disable-line max-len
                     '</li>'
                 );
 
diff --git a/cms/static/js/views/paging_header.js b/cms/static/js/views/paging_header.js
index 0a544e73a8928d545d87604940f28657b9718471..57d657dd80f162632e94a864717e73c0860cb065 100644
--- a/cms/static/js/views/paging_header.js
+++ b/cms/static/js/views/paging_header.js
@@ -7,7 +7,6 @@ define([
     'text!templates/paging-header.underscore'
 ], function(_, Backbone, gettext, HtmlUtils, StringUtils, pagingHeaderTemplate) {
         'use strict';
-        /* jshint maxlen:false */
         var PagingHeader = Backbone.View.extend({
             events : {
                 'click .next-page-link': 'nextPage',
@@ -30,7 +29,7 @@ define([
                     lastPage = collection.getTotalPages(),
                     messageHtml = this.messageHtml(),
                     isNextDisabled = lastPage === 0 || currentPage === lastPage;
-                
+
                 HtmlUtils.setHtml(this.$el, HtmlUtils.template(pagingHeaderTemplate)({messageHtml: messageHtml}));
                 this.$('.previous-page-link')
                     .toggleClass('is-disabled', currentPage === 1)
@@ -50,22 +49,22 @@ define([
                     if (this.view.collection.sortDirection === 'asc') {
                         // Translators: sample result:
                         // "Showing 0-9 out of 25 total, filtered by Images, sorted by Date Added ascending"
-                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, filtered by {assetType}, sorted by {sortName} ascending');
+                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, filtered by {assetType}, sorted by {sortName} ascending');  // eslint-disable-line max-len
                     } else {
                         // Translators: sample result:
                         // "Showing 0-9 out of 25 total, filtered by Images, sorted by Date Added descending"
-                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, filtered by {assetType}, sorted by {sortName} descending');
+                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, filtered by {assetType}, sorted by {sortName} descending');  // eslint-disable-line max-len
                     }
                     assetType = this.filterNameLabel();
                 } else {
                     if (this.view.collection.sortDirection === 'asc') {
                         // Translators: sample result:
                         // "Showing 0-9 out of 25 total, sorted by Date Added ascending"
-                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, sorted by {sortName} ascending');
+                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, sorted by {sortName} ascending');  // eslint-disable-line max-len
                     } else {
                         // Translators: sample result:
                         // "Showing 0-9 out of 25 total, sorted by Date Added descending"
-                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, sorted by {sortName} descending');
+                        message = gettext('Showing {currentItemRange} out of {totalItemsCount}, sorted by {sortName} descending');  // eslint-disable-line max-len
                     }
                 }
 
diff --git a/cms/static/js/views/settings/advanced.js b/cms/static/js/views/settings/advanced.js
index 3c1eba2fb245891fcd289950ce2b00590510fbdf..6ac1beb4f17b1ffdf3466a03e75358cefe6ca0ea 100644
--- a/cms/static/js/views/settings/advanced.js
+++ b/cms/static/js/views/settings/advanced.js
@@ -115,9 +115,9 @@ var AdvancedView = ValidatingView.extend({
         var self = this;
         this.model.save({}, {
             success : function() {
-                self.render();
                 var title = gettext("Your policy changes have been saved.");
-                var message = gettext("No validation is performed on policy keys or value pairs. If you are having difficulties, check your formatting.");  // jshint ignore:line
+                var message = gettext('No validation is performed on policy keys or value pairs. If you are having difficulties, check your formatting.');  // eslint-disable-line max-len
+                self.render();
                 self.showSavedBar(title, message);
                 analytics.track('Saved Advanced Settings', {
                     'course': course_location_analytics
diff --git a/cms/static/js/views/tabs.js b/cms/static/js/views/tabs.js
index 04ace25d7e6bfc5c77ba2749b96b12bf68b8e8d5..2c60b28b760f967006f1abb1bb85a9ee663963d2 100644
--- a/cms/static/js/views/tabs.js
+++ b/cms/static/js/views/tabs.js
@@ -1,3 +1,5 @@
+/* globals analytics, course_location_analytics */
+
 (function(analytics, course_location_analytics) {
     'use strict';
 
@@ -199,5 +201,4 @@
             })(Backbone.View);
             return TabsEdit;
         });
-
-}).call(this, analytics, course_location_analytics); //jshint ignore:line
+}).call(this, analytics, course_location_analytics);
diff --git a/cms/static/js/views/utils/xblock_utils.js b/cms/static/js/views/utils/xblock_utils.js
index c99ab1ad44770dcbde120d4438b18fe3af66b672..2623698467de6046aafd208cda54f19ba7307026 100644
--- a/cms/static/js/views/utils/xblock_utils.js
+++ b/cms/static/js/views/utils/xblock_utils.js
@@ -95,7 +95,7 @@ define(["jquery", "underscore", "gettext", "common/js/components/utils/view_util
                 );
 
             if (xblockInfo.get('is_prereq')) {
-                messageBody += ' ' + gettext('Any content that has listed this content as a prerequisite will also have access limitations removed.'); // jshint ignore:line
+                messageBody += ' ' + gettext('Any content that has listed this content as a prerequisite will also have access limitations removed.');   // eslint-disable-line max-len
                 ViewUtils.confirmThenRunOperation(
                     interpolate(
                         gettext('Delete this %(xblock_type)s (and prerequisite)?'),
diff --git a/cms/static/js/views/xblock.js b/cms/static/js/views/xblock.js
index 6456f9b34786ba9fdb06739405ea783e5e091fda..83eea1a5a0051483c8d7db6424c34fb9ef97dff5 100644
--- a/cms/static/js/views/xblock.js
+++ b/cms/static/js/views/xblock.js
@@ -106,7 +106,7 @@ define(["jquery", "underscore", "common/js/components/utils/view_utils", "js/vie
              * may have thrown JavaScript errors after rendering in which case the xblock parameter
              * will be null.
              */
-            xblockReady: function(xblock) {  // jshint ignore:line
+            xblockReady: function(xblock) {  // eslint-disable-line no-unused-vars
                 // Do nothing
             },
 
diff --git a/cms/static/karma_cms.conf.js b/cms/static/karma_cms.conf.js
index f2ef478cd36b8c39d449be6c9e66fc1bca8ed598..fefda5da2948dc5529599703e4c6929e0528c97c 100644
--- a/cms/static/karma_cms.conf.js
+++ b/cms/static/karma_cms.conf.js
@@ -1,8 +1,8 @@
+/* eslint-env node */
+
 // Karma config for cms suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, '../../common/static/common/js/karma.common.conf.js'));
diff --git a/cms/static/karma_cms_squire.conf.js b/cms/static/karma_cms_squire.conf.js
index a5c81fceae65ffee8a0ba34c6398696fec85dced..97361e1a710b6b9b8022e49a64405bbf501779a8 100644
--- a/cms/static/karma_cms_squire.conf.js
+++ b/cms/static/karma_cms_squire.conf.js
@@ -1,8 +1,8 @@
+/* eslint-env node */
+
 // Karma config for cms-squire suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, '../../common/static/common/js/karma.common.conf.js'));
diff --git a/common/lib/xmodule/xmodule/js/karma_runner.js b/common/lib/xmodule/xmodule/js/karma_runner.js
index 8d416281b70f0448350e4e6221d1aad4feab2db0..d6c84a85760bfd34618f0d9d185ab37ad5c5daca 100644
--- a/common/lib/xmodule/xmodule/js/karma_runner.js
+++ b/common/lib/xmodule/xmodule/js/karma_runner.js
@@ -1,7 +1,8 @@
+/* eslint-env node */
+
 // overwrite the loaded method and manually start the karma after a delay
 // Somehow the code initialized in jQuery's onready doesn't get called before karma auto starts
 
-/* jshint node: true */
 'use strict';
 window.__karma__.loaded = function () {
     setTimeout(function () {
diff --git a/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js b/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
index 3f72dcb7b0e75dd63e8ddad10eb5c715eb80ae9d..a4cf459b23a22b17ab3c9a43c2e4d3eb148d1385 100644
--- a/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
+++ b/common/lib/xmodule/xmodule/js/karma_xmodule.conf.js
@@ -1,9 +1,8 @@
+/* eslint-env node */
+
 // Karma config for xmodule suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
-
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, 'common_static/common/js/karma.common.conf.js'));
diff --git a/common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js b/common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js
index a1932138df67e343f76f3d580843c8829199138a..58c4958d11aac1a2da52c2ba4b9e72eec524caa0 100644
--- a/common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js
+++ b/common/lib/xmodule/xmodule/js/src/video/07_video_volume_control.js
@@ -64,7 +64,7 @@ function (HtmlUtils) {
                 '</div>',
             '</div>'].join('')),
             {
-                volumeInstructions: gettext('Click on this button to mute or unmute this video or press UP or DOWN buttons to increase or decrease volume level.'), // jshint ignore: line
+                volumeInstructions: gettext('Click on this button to mute or unmute this video or press UP or DOWN buttons to increase or decrease volume level.'),  // eslint-disable-line max-len
                 adjustVideoVolume: gettext('Adjust video volume'),
                 volumeText: gettext('Volume')
             }
@@ -130,7 +130,7 @@ function (HtmlUtils) {
          */
         render: function() {
             var container = this.el.find('.volume-slider');
-            
+
             HtmlUtils.append(container, HtmlUtils.HTML('<div class="ui-slider-handle volume-handle"></div>'));
 
             this.volumeSlider = container.slider({
diff --git a/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js b/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
index 0dc653c122e0797bd71678b5f0e52ba110845b97..914896293bc13aceed431dc61b59e8c9bb423525 100644
--- a/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
+++ b/common/lib/xmodule/xmodule/js/src/video/08_video_speed_control.js
@@ -32,7 +32,7 @@ define(
         template: [
             '<div class="speeds menu-container" role="application">',
                 '<p class="sr instructions" id="speed-instructions">',
-                    gettext('Press UP to enter the speed menu then use the UP and DOWN arrow keys to navigate the different speeds, then press ENTER to change to the selected speed.'), // jshint ignore: line
+                    gettext('Press UP to enter the speed menu then use the UP and DOWN arrow keys to navigate the different speeds, then press ENTER to change to the selected speed.'),  // eslint-disable-line max-len, indent
                 '</p>',
                 '<button class="control speed-button" aria-disabled="false" aria-expanded="false"',
                     'title="',
@@ -242,20 +242,20 @@ define(
             this.resetActiveSpeed();
             this.setActiveSpeed(speed);
         },
-        
+
         resetActiveSpeed: function() {
             var speedOptions = this.speedsContainer.find('li');
-            
+
             $(speedOptions).each(function(index, el) {
                 $(el).removeClass('is-active')
                     .find('.speed-option')
                     .attr('aria-pressed', 'false');
             });
         },
-        
+
         setActiveSpeed: function(speed) {
             var speedOption = this.speedsContainer.find('li[data-speed="' + speed + '"]');
-            
+
             speedOption.addClass('is-active')
                 .find('.speed-option')
                 .attr('aria-pressed', 'true');
@@ -280,7 +280,7 @@ define(
         clickLinkHandler: function (event) {
             var el = $(event.currentTarget).parent(),
                 speed = $(el).data('speed');
-                
+
             this.resetActiveSpeed();
             this.setActiveSpeed(speed);
             this.state.videoCommands.execute('speed', speed);
diff --git a/common/lib/xmodule/xmodule/js/src/video/095_video_context_menu.js b/common/lib/xmodule/xmodule/js/src/video/095_video_context_menu.js
index 951f2a639e966a89e6f388fff166ec0f8b66e5d0..80e0e9a1d1e78820069f3c346a342d8e93a62058 100644
--- a/common/lib/xmodule/xmodule/js/src/video/095_video_context_menu.js
+++ b/common/lib/xmodule/xmodule/js/src/video/095_video_context_menu.js
@@ -580,22 +580,22 @@ function (Component) {
             },
             options = {
                 items: [{
-                    label: i18n['Play'], // jshint ignore:line
+                    label: i18n.Play,
                     callback: function () {
                         state.videoCommands.execute('togglePlayback');
                     },
                     initialize: function (menuitem) {
                         state.el.on({
                             'play': function () {
-                                menuitem.setLabel(i18n['Pause']); // jshint ignore:line
+                                menuitem.setLabel(i18n.Pause);
                             },
                             'pause': function () {
-                                menuitem.setLabel(i18n['Play']); // jshint ignore:line
+                                menuitem.setLabel(i18n.Play);
                             }
                         });
                     }
                 }, {
-                    label: state.videoVolumeControl.getMuteStatus() ? i18n['Unmute'] : i18n['Mute'], // jshint ignore:line
+                    label: state.videoVolumeControl.getMuteStatus() ? i18n.Unmute : i18n.Mute,
                     callback: function () {
                         state.videoCommands.execute('toggleMute');
                     },
@@ -603,9 +603,9 @@ function (Component) {
                         state.el.on({
                             'volumechange': function () {
                                 if (state.videoVolumeControl.getMuteStatus()) {
-                                    menuitem.setLabel(i18n['Unmute']); // jshint ignore:line
+                                    menuitem.setLabel(i18n.Unmute);
                                 } else {
-                                    menuitem.setLabel(i18n['Mute']); // jshint ignore:line
+                                    menuitem.setLabel(i18n.Mute);
                                 }
                             }
                         });
@@ -627,7 +627,7 @@ function (Component) {
                         });
                     }
                 }, {
-                    label: i18n['Speed'], // jshint ignore:line
+                    label: i18n.Speed,
                     items: _.map(state.speeds, function (speed) {
                         var isSelected = speed === state.speed;
                         return {label: speed + 'x', callback: speedCallback, speed: speed, isSelected: isSelected};
diff --git a/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js b/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js
index d5d895530a7512b603a93a9583db57796418bdaa..68337c05ed77d287fdfeb612dc4f6d38c0b0543b 100644
--- a/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js
+++ b/common/lib/xmodule/xmodule/js/src/video/09_video_caption.js
@@ -102,7 +102,7 @@
                             langTitle: gettext('Open language menu')
                         }
                     )
-                    
+
                 );
 
                 var subtitlesHtml = HtmlUtils.interpolateHtml(
@@ -693,7 +693,7 @@
                     $li.append($link);
                     $menu.append($li);
                 });
-                
+
                 HtmlUtils.append(
                     this.languageChooserEl,
                     HtmlUtils.HTML($menu)
@@ -711,15 +711,15 @@
                             .removeClass('is-active')
                             .find('.control-lang')
                             .attr('aria-pressed', 'false');
-                            
+
                         $(e.currentTarget).attr('aria-pressed', 'true');
 
                         state.el.trigger('language_menu:change', [langCode]);
                         self.fetchCaption();
-                        
+
                         // update the closed-captions lang attribute
                         self.captionDisplayEl.attr('lang', langCode);
-                        
+
                         // update the transcript lang attribute
                         self.subtitlesMenuEl.attr('lang', langCode);
                         self.closeLanguageMenu(e);
@@ -794,7 +794,7 @@
                     self.state.el.addClass('is-captions-rendered');
 
                     self.subtitlesEl
-                        .attr('aria-label', gettext('Activating a link in this group will skip to the corresponding point in the video.')); // jshint ignore:line
+                        .attr('aria-label', gettext('Activating a link in this group will skip to the corresponding point in the video.'));  // eslint-disable-line max-len
 
                     self.subtitlesEl.find('.transcript-title')
                         .text(gettext('Video transcript'));
@@ -808,7 +808,7 @@
                         .attr('lang', $('html').attr('lang'));
 
                     self.container.find('.menu-container .instructions')
-                        .text(gettext('Press the UP arrow key to enter the language menu then use UP and DOWN arrow keys to navigate language options. Press ENTER to change to the selected language.')); // jshint ignore:line
+                        .text(gettext('Press the UP arrow key to enter the language menu then use UP and DOWN arrow keys to navigate language options. Press ENTER to change to the selected language.'));  // eslint-disable-line max-len
 
                 };
 
@@ -827,7 +827,7 @@
                 var topSpacer = HtmlUtils.interpolateHtml(
                         HtmlUtils.HTML([
                             '<li class="spacing" style="height: {height}px">',
-                                '<a href="#transcript-end-{id}" id="transcript-start-{id}" class="transcript-start"></a>', // jshint ignore:line
+                                '<a href="#transcript-end-{id}" id="transcript-start-{id}" class="transcript-start"></a>',  // eslint-disable-line max-len, indent
                             '</li>'
                         ].join('')),
                         {
@@ -839,7 +839,7 @@
                 var bottomSpacer = HtmlUtils.interpolateHtml(
                         HtmlUtils.HTML([
                             '<li class="spacing" style="height: {height}px">',
-                                '<a href="#transcript-start-{id}" id="transcript-end-{id}" class="transcript-end"></a>', // jshint ignore:line
+                                '<a href="#transcript-start-{id}" id="transcript-end-{id}" class="transcript-end"></a>',  // eslint-disable-line max-len, indent
                             '</li>'
                         ].join('')),
                         {
@@ -852,7 +852,7 @@
                     this.subtitlesMenuEl,
                     topSpacer
                 );
-                
+
                 HtmlUtils.append(
                     this.subtitlesMenuEl,
                     bottomSpacer
@@ -1194,7 +1194,7 @@
                     this.captionDisplayEl
                         .text(gettext('(Caption will be displayed when you start playing the video.)'));
                 }
-                
+
                 this.state.el.trigger('captions:show');
             },
 
diff --git a/common/static/common/js/components/views/paginated_view.js b/common/static/common/js/components/views/paginated_view.js
index e635b9d331da2818cb2f12d3d6cd52fe771a790a..81e18cf844652d881c90c894b23f162596dfd99b 100644
--- a/common/static/common/js/components/views/paginated_view.js
+++ b/common/static/common/js/components/views/paginated_view.js
@@ -72,7 +72,7 @@
 
             renderError: function () {
                 this.$el.text(
-                    gettext('Your request could not be completed. Reload the page and try again. If the issue persists, click the Help tab to report the problem.') // jshint ignore: line
+                    gettext('Your request could not be completed. Reload the page and try again. If the issue persists, click the Help tab to report the problem.')  // eslint-disable-line max-len
                 );
             },
 
diff --git a/common/static/common/js/discussion/content.js b/common/static/common/js/discussion/content.js
index 111e4fd8210ce8fb5defac79794c63659d6092e6..52bfab2a8674362ab876675feb01fa8ae705a7e3 100644
--- a/common/static/common/js/discussion/content.js
+++ b/common/static/common/js/discussion/content.js
@@ -1,4 +1,4 @@
-/* globals DiscussionUtil */
+/* globals DiscussionUtil, Comments */
 (function() {
     'use strict';
 
@@ -105,7 +105,7 @@
             Content.prototype.resetComments = function(children) {
                 var comment, _i, _len, _ref, _results;
                 this.set('children', []);
-                this.set('comments', new Comments());  // jshint ignore:line
+                this.set('comments', new Comments());
                 _ref = children || [];
                 _results = [];
                 for (_i = 0, _len = _ref.length; _i < _len; _i++) {
diff --git a/common/static/common/js/discussion/main.js b/common/static/common/js/discussion/main.js
index 5f34c6af9d0c20a3165028714a3472cc4f3fb6f5..c3bee8188ff99cab32bb63de587f2d64c98e0b2a 100644
--- a/common/static/common/js/discussion/main.js
+++ b/common/static/common/js/discussion/main.js
@@ -27,13 +27,10 @@
                     sort: sort_preference
                 });
                 course_settings = new DiscussionCourseSettings(element.data("course-settings"));
-                // suppressing Do not use 'new' for side effects.
-                /* jshint -W031*/
-                new DiscussionRouter({
+                new DiscussionRouter({  // eslint-disable-line no-new
                     discussion: discussion,
                     course_settings: course_settings
                 });
-                /* jshint +W031*/
                 if (!Backbone.History.started) {
                     Backbone.history.start({pushState: true, root: "/courses/" + $$course_id + "/discussion/forum/"});
                 } else {
diff --git a/common/static/common/js/discussion/utils.js b/common/static/common/js/discussion/utils.js
index e4f7b1cb8a62f39d0c867fc134f03910e8b781a7..437f6c41c56a0c687e3337d615985df9cfc16001 100644
--- a/common/static/common/js/discussion/utils.js
+++ b/common/static/common/js/discussion/utils.js
@@ -378,8 +378,7 @@
             });
             htmlString = $div.html();
             htmlString = htmlString.replace(/\\\$/g, ESCAPED_DOLLAR);
-            // suppressing Don't make functions within a loop.
-            /* jshint -W083 */
+            /* eslint-disable no-loop-func */
             while (true) {
                 if (RE_INLINEMATH.test(htmlString)) {
                     htmlString = htmlString.replace(RE_INLINEMATH, function($0, $1, $2, $3) {
@@ -400,7 +399,7 @@
                     break;
                 }
             }
-            /* jshint +W083 */
+            /* eslint-enable no-loop-func */
             htmlString = processedHtmlString;
             htmlString = htmlString.replace(new RegExp(ESCAPED_DOLLAR, 'g'), '\\$');
             htmlString = htmlString.replace(/\\\\\\\\/g, ESCAPED_BACKSLASH);
diff --git a/common/static/common/js/discussion/views/discussion_thread_edit_view.js b/common/static/common/js/discussion/views/discussion_thread_edit_view.js
index 8b4d6d9569867359e74d4ebf639039fac61ac09b..c69376809164fade551efad207963c6bc8643df8 100644
--- a/common/static/common/js/discussion/views/discussion_thread_edit_view.js
+++ b/common/static/common/js/discussion/views/discussion_thread_edit_view.js
@@ -111,4 +111,4 @@
             }
         });
     }
-}).call(window); // jshint ignore:line
+}).call(window);
diff --git a/common/static/common/js/jasmine.common.conf.js b/common/static/common/js/jasmine.common.conf.js
index 45df64144b41da8b2b1b86b75b4ecc14ca3d2078..e5b7a8492743a466c65e3f63300c9253b85980c5 100644
--- a/common/static/common/js/jasmine.common.conf.js
+++ b/common/static/common/js/jasmine.common.conf.js
@@ -1,4 +1,4 @@
-/* jshint node: true */
+/* eslint-env node */
 'use strict';
 
 // By default, fixtures are loaded from spec/javascripts/fixtures but in karma everything gets served from /base
diff --git a/common/static/common/js/karma.common.conf.js b/common/static/common/js/karma.common.conf.js
index 4b00bfd8eb986ee18bef546f318f0b749a1a799c..c4539221c45d706b3e77d9f048e929cc24daa6ae 100644
--- a/common/static/common/js/karma.common.conf.js
+++ b/common/static/common/js/karma.common.conf.js
@@ -33,9 +33,8 @@
 // does not use graceful-fs and tries to read files simultaneously.
 //
 
+/* eslint-env node */
 
-/* jshint node: true */
-/*jshint -W079 */
 'use strict';
 
 var path = require('path');
diff --git a/common/static/common/js/spec/discussion/view/discussion_thread_list_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_thread_list_view_spec.js
index 23bc0999c63e7967b7aea181c409c3bed8384508..4b94f1394ae7199408f6b28de74f855af50f6d18 100644
--- a/common/static/common/js/spec/discussion/view/discussion_thread_list_view_spec.js
+++ b/common/static/common/js/spec/discussion/view/discussion_thread_list_view_spec.js
@@ -12,9 +12,7 @@
             DiscussionSpecHelper.setUpGlobals();
             DiscussionSpecHelper.setUnderscoreFixtures();
             // suppressing Line is too long (4272 characters!)
-            /* jshint -W101 */
-            appendSetFixtures("<script type=\"text/template\" id=\"thread-list-template\">\n    <div class=\"forum-nav-header\">\n        <button type=\"button\" class=\"forum-nav-browse\" id=\"forum-nav-browse\" aria-haspopup=\"true\">\n            <span class=\"icon fa fa-bars\" aria-hidden=\"true\"></span>\n            <span class=\"sr\">Discussion topics; currently listing: </span>\n            <span class=\"forum-nav-browse-current\">All Discussions</span>\n            â–¾\n        </button>\n        <form class=\"forum-nav-search\">\n            <label>\n                <span class=\"sr\">Search all posts</span>\n                <input class=\"forum-nav-search-input\" id=\"forum-nav-search\" type=\"text\" placeholder=\"Search all posts\">\n                <span class=\"icon fa fa-search\" aria-hidden=\"true\"></span>\n            </label>\n        </form>\n    </div>\n    <div class=\"forum-nav-browse-menu-wrapper\" style=\"display: none\">\n        <form class=\"forum-nav-browse-filter\">\n            <label>\n                <span class=\"sr\">Filter Topics</span>\n                <input type=\"text\" class=\"forum-nav-browse-filter-input\" placeholder=\"filter topics\">\n            </label>\n        </form>\n        <ul class=\"forum-nav-browse-menu\">\n            <li class=\"forum-nav-browse-menu-item forum-nav-browse-menu-all\">\n                <a href=\"#\" class=\"forum-nav-browse-title\">All Discussions</a>\n            </li>\n            <li class=\"forum-nav-browse-menu-item forum-nav-browse-menu-following\">\n                <a href=\"#\" class=\"forum-nav-browse-title\"><span class=\"icon fa fa-star\" aria-hidden=\"true\"></span>Posts I'm Following</a>\n            </li>\n            <li class=\"forum-nav-browse-menu-item\">\n                <a href=\"#\" class=\"forum-nav-browse-title\">Parent</a>\n                <ul class=\"forum-nav-browse-submenu\">\n                    <li class=\"forum-nav-browse-menu-item\">\n                        <a href=\"#\" class=\"forum-nav-browse-title\">Target</a>\n                        <ul class=\"forum-nav-browse-submenu\">\n                            <li\n                                class=\"forum-nav-browse-menu-item\"\n                                data-discussion-id=\"child\"\n                                data-cohorted=\"false\"\n                            >\n                                <a href=\"#\" class=\"forum-nav-browse-title\">Child</a>\n                            </li>\n                        </ul>\n                    <li\n                        class=\"forum-nav-browse-menu-item\"\n                        data-discussion-id=\"sibling\"\n                        data-cohorted=\"false\"\n                    >\n                        <a href=\"#\" class=\"forum-nav-browse-title\">Sibling</a>\n                    </li>\n                </ul>\n            </li>\n            <li\n                class=\"forum-nav-browse-menu-item\"\n                data-discussion-id=\"other\"\n                data-cohorted=\"true\"\n            >\n                <a href=\"#\" class=\"forum-nav-browse-title\">Other Category</a>\n            </li>\n        </ul>\n    </div>\n    <div class=\"forum-nav-thread-list-wrapper\" id=\"sort-filter-wrapper\" tabindex=\"-1\">\n        <div class=\"forum-nav-refine-bar\">\n            <label class=\"forum-nav-filter-main\">\n                <select class=\"forum-nav-filter-main-control\">\n                    <option value=\"all\">Show all</option>\n                    <option value=\"unread\">Unread</option>\n                    <option value=\"unanswered\">Unanswered</option>\n                    <option value=\"flagged\">Flagged</option>\n                </select>\n            </label>\n            <% if (isCohorted && isPrivilegedUser) { %>\n            <label class=\"forum-nav-filter-cohort\">\n                <span class=\"sr\">Cohort:</span>\n                <select class=\"forum-nav-filter-cohort-control\">\n                    <option value=\"\">in all cohorts</option>\n                    <option value=\"1\">Cohort1</option>\n                    <option value=\"2\">Cohort2</option>\n                </select>\n            </label>\n            <% } %>\n            <label class=\"forum-nav-sort\">\n                <select class=\"forum-nav-sort-control\">\n                    <option value=\"activity\">by recent activity</option>\n                    <option value=\"comments\">by most activity</option>\n                    <option value=\"votes\">by most votes</option>\n                </select>\n            </label>\n        </div>\n    </div>\n    <div class=\"search-alerts\"></div>\n    <ul class=\"forum-nav-thread-list\"></ul>\n</script>");
-            /* jshint +W101 */
+            appendSetFixtures("<script type=\"text/template\" id=\"thread-list-template\">\n    <div class=\"forum-nav-header\">\n        <button type=\"button\" class=\"forum-nav-browse\" id=\"forum-nav-browse\" aria-haspopup=\"true\">\n            <span class=\"icon fa fa-bars\" aria-hidden=\"true\"></span>\n            <span class=\"sr\">Discussion topics; currently listing: </span>\n            <span class=\"forum-nav-browse-current\">All Discussions</span>\n            â–¾\n        </button>\n        <form class=\"forum-nav-search\">\n            <label>\n                <span class=\"sr\">Search all posts</span>\n                <input class=\"forum-nav-search-input\" id=\"forum-nav-search\" type=\"text\" placeholder=\"Search all posts\">\n                <span class=\"icon fa fa-search\" aria-hidden=\"true\"></span>\n            </label>\n        </form>\n    </div>\n    <div class=\"forum-nav-browse-menu-wrapper\" style=\"display: none\">\n        <form class=\"forum-nav-browse-filter\">\n            <label>\n                <span class=\"sr\">Filter Topics</span>\n                <input type=\"text\" class=\"forum-nav-browse-filter-input\" placeholder=\"filter topics\">\n            </label>\n        </form>\n        <ul class=\"forum-nav-browse-menu\">\n            <li class=\"forum-nav-browse-menu-item forum-nav-browse-menu-all\">\n                <a href=\"#\" class=\"forum-nav-browse-title\">All Discussions</a>\n            </li>\n            <li class=\"forum-nav-browse-menu-item forum-nav-browse-menu-following\">\n                <a href=\"#\" class=\"forum-nav-browse-title\"><span class=\"icon fa fa-star\" aria-hidden=\"true\"></span>Posts I'm Following</a>\n            </li>\n            <li class=\"forum-nav-browse-menu-item\">\n                <a href=\"#\" class=\"forum-nav-browse-title\">Parent</a>\n                <ul class=\"forum-nav-browse-submenu\">\n                    <li class=\"forum-nav-browse-menu-item\">\n                        <a href=\"#\" class=\"forum-nav-browse-title\">Target</a>\n                        <ul class=\"forum-nav-browse-submenu\">\n                            <li\n                                class=\"forum-nav-browse-menu-item\"\n                                data-discussion-id=\"child\"\n                                data-cohorted=\"false\"\n                            >\n                                <a href=\"#\" class=\"forum-nav-browse-title\">Child</a>\n                            </li>\n                        </ul>\n                    <li\n                        class=\"forum-nav-browse-menu-item\"\n                        data-discussion-id=\"sibling\"\n                        data-cohorted=\"false\"\n                    >\n                        <a href=\"#\" class=\"forum-nav-browse-title\">Sibling</a>\n                    </li>\n                </ul>\n            </li>\n            <li\n                class=\"forum-nav-browse-menu-item\"\n                data-discussion-id=\"other\"\n                data-cohorted=\"true\"\n            >\n                <a href=\"#\" class=\"forum-nav-browse-title\">Other Category</a>\n            </li>\n        </ul>\n    </div>\n    <div class=\"forum-nav-thread-list-wrapper\" id=\"sort-filter-wrapper\" tabindex=\"-1\">\n        <div class=\"forum-nav-refine-bar\">\n            <label class=\"forum-nav-filter-main\">\n                <select class=\"forum-nav-filter-main-control\">\n                    <option value=\"all\">Show all</option>\n                    <option value=\"unread\">Unread</option>\n                    <option value=\"unanswered\">Unanswered</option>\n                    <option value=\"flagged\">Flagged</option>\n                </select>\n            </label>\n            <% if (isCohorted && isPrivilegedUser) { %>\n            <label class=\"forum-nav-filter-cohort\">\n                <span class=\"sr\">Cohort:</span>\n                <select class=\"forum-nav-filter-cohort-control\">\n                    <option value=\"\">in all cohorts</option>\n                    <option value=\"1\">Cohort1</option>\n                    <option value=\"2\">Cohort2</option>\n                </select>\n            </label>\n            <% } %>\n            <label class=\"forum-nav-sort\">\n                <select class=\"forum-nav-sort-control\">\n                    <option value=\"activity\">by recent activity</option>\n                    <option value=\"comments\">by most activity</option>\n                    <option value=\"votes\">by most votes</option>\n                </select>\n            </label>\n        </div>\n    </div>\n    <div class=\"search-alerts\"></div>\n    <ul class=\"forum-nav-thread-list\"></ul>\n</script>");  // eslint-disable-line max-len
             this.threads = [
                 DiscussionViewSpecHelper.makeThreadWithProps({
                     id: "1",
diff --git a/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js b/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js
index 1f72753efd5bc17f1cf67ca56828ee9f1a8e21a3..12b9c5f0bb56739e8154ea83aba1158dbd306066 100644
--- a/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js
+++ b/common/static/common/js/spec/discussion/view/discussion_thread_profile_view_spec.js
@@ -135,12 +135,11 @@
                     it(
                         "body with " + numImages + " images and " + (truncatedText ? "truncated" : "untruncated") +
                         " text",
-                        // suppressing Don't make functions within a loop.
-                        /* jshint -W083 */
+                        // eslint-disable no-loop-func
                         function() {
                             return checkPostWithImages(numImages, truncatedText, this.threadData, this.imageTag);
                         }
-                        /* jshint +W083 */
+                        // eslint-enable no-loop-func
                     );
                 }
             }
diff --git a/common/static/common/js/spec_helpers/jasmine-extensions.js b/common/static/common/js/spec_helpers/jasmine-extensions.js
index e7492e9dc1ec0002a0dc94ec3d6bd51d9ab68ccb..b4f62741a60200fb803a48045035c73ee98b86f3 100644
--- a/common/static/common/js/spec_helpers/jasmine-extensions.js
+++ b/common/static/common/js/spec_helpers/jasmine-extensions.js
@@ -1,3 +1,5 @@
+/* eslint-env node */
+
 // Extensions to Jasmine.
 //
 // This file adds the following:
@@ -9,7 +11,6 @@
 //    jQuery has been loaded, we set these matchers up again in this module.
 
 (function(root, factory) {
-    /* jshint strict: false */
     if (typeof define === 'function' && define.amd) {
         require(['jquery'], function ($) {
             factory(root, $);
@@ -18,7 +19,6 @@
         factory(root, root.jQuery);
     }
 }((function() {
-    /* jshint strict: false */
     return this;
 }()), function(window, $) {
     'use strict';
@@ -91,7 +91,7 @@
         });
     });
 
-    /* jshint ignore:start */
+    /* eslint-disable */
     // All the code below is taken from:
     // https://github.com/velesin/jasmine-jquery/blob/2.1.1/lib/jasmine-jquery.js
     beforeEach(function() {
@@ -271,5 +271,5 @@
             data.handlers = [];
         }
     };
-    /* jshint ignore:end */
+    /* eslint-enable */
 }));
diff --git a/common/static/common/js/spec_helpers/jasmine-stealth.js b/common/static/common/js/spec_helpers/jasmine-stealth.js
index 5ec68c04e91c985dd4973f355b8ca85c943749b2..333a7dec8b1ea914ee5a7738b86ca2f70e27a1a1 100644
--- a/common/static/common/js/spec_helpers/jasmine-stealth.js
+++ b/common/static/common/js/spec_helpers/jasmine-stealth.js
@@ -1,5 +1,6 @@
+/* eslint-env node */
+
 // Custom library to replace the legacy non jasmine 2.0 compatible jasmine-stealth
-// jshint ignore: start
 (function (root, factory) {
     factory(root, root.jasmine, root._);
 }((function () {
@@ -61,4 +62,4 @@
         spyOnConstructor: spyOnConstructor,
         clearSpies: clearSpies
     };
-}));
\ No newline at end of file
+}));
diff --git a/common/static/common/js/spec_helpers/jasmine-waituntil.js b/common/static/common/js/spec_helpers/jasmine-waituntil.js
index 43060c4412b33830d4c9dfa4b6cb1493262e4d9a..4d0a5db9209e2953024b122343e50dbf49d26032 100644
--- a/common/static/common/js/spec_helpers/jasmine-waituntil.js
+++ b/common/static/common/js/spec_helpers/jasmine-waituntil.js
@@ -1,12 +1,11 @@
+/* eslint-env node */
 
 // Takes a latch function and optionally timeout and error message.
 // Polls the latch function until the it returns true or the maximum timeout expires
 // whichever comes first.
 (function(root, factory) {
-    /* jshint strict: false */
     factory(root, root.jQuery);
 }((function() {
-    /* jshint strict: false */
     return this;
 }()), function(window, $) {
     'use strict';
@@ -30,7 +29,7 @@
             } else {
                 if (elapsedTimeInMs >= maxTimeout) {
                     // explicitly fail the spec with the given message
-                    fail(message); // jshint ignore:line
+                    fail(message);
 
                     // clear timeout and reject the promise
                     realClearTimeout(timeout);
diff --git a/common/static/js/capa/spec/formula_equation_preview_spec.js b/common/static/js/capa/spec/formula_equation_preview_spec.js
index 7a115ed9ce49642ac9694d9863273d67296b1905..4189fa3b0ac4462fac7f74581cc11739cbb9ec54 100644
--- a/common/static/js/capa/spec/formula_equation_preview_spec.js
+++ b/common/static/js/capa/spec/formula_equation_preview_spec.js
@@ -107,7 +107,6 @@ describe("Formula Equation Preview", function () {
         });
 
         it('does not request again if the initial request has already been made', function (done) {
-            // jshint undef:false
             expect(window.Problem.inputAjax.calls.count()).toEqual(1);
 
             // Reset the spy in order to check calls again.
diff --git a/common/static/karma_common.conf.js b/common/static/karma_common.conf.js
index 0af98d50491d10c34aa37cc016ef83c991a2294b..10ef28421b7089ad87b71b21c0871f6c64717ecc 100644
--- a/common/static/karma_common.conf.js
+++ b/common/static/karma_common.conf.js
@@ -1,8 +1,7 @@
 // Karma config for common suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
+/* eslint-env node */
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, '../../common/static/common/js/karma.common.conf.js'));
diff --git a/common/static/karma_common_requirejs.conf.js b/common/static/karma_common_requirejs.conf.js
index 64d5f48f703c564d2660780d7537e7eeb477eb72..e8decc75e4b6f6120d19dbfdcc915618a3687471 100644
--- a/common/static/karma_common_requirejs.conf.js
+++ b/common/static/karma_common_requirejs.conf.js
@@ -1,8 +1,7 @@
 // Karma config for common-requirejs suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
+/* eslint-env node */
 
 'use strict';
 var path = require('path');
diff --git a/lms/djangoapps/teams/static/teams/js/views/topic_card.js b/lms/djangoapps/teams/static/teams/js/views/topic_card.js
index 81bffedd055f390c077c1e15d1e91453821f2edb..54b5ddff577aa0a546574813ee940e503e65f1a5 100644
--- a/lms/djangoapps/teams/static/teams/js/views/topic_card.js
+++ b/lms/djangoapps/teams/static/teams/js/views/topic_card.js
@@ -46,7 +46,7 @@
                         gettext('View Teams in the %(topic_name)s Topic'),
                         { topic_name: this.model.get('name') }, true
                     ));
-                    return '<span class="sr">' + screenReaderText + '</span><span class="icon fa fa-arrow-right" aria-hidden="true"></span>'; // jshint ignore:line
+                    return '<span class="sr">' + screenReaderText + '</span><span class="icon fa fa-arrow-right" aria-hidden="true"></span>';  // eslint-disable-line max-len
                 }
             });
 
diff --git a/lms/static/js/Markdown.Editor.js b/lms/static/js/Markdown.Editor.js
index 90712ed422c8bea52a51b4002842865f1ecbe7cc..491d0f30ff74d898d9f505fb5a154bd978df0bf5 100644
--- a/lms/static/js/Markdown.Editor.js
+++ b/lms/static/js/Markdown.Editor.js
@@ -35,16 +35,16 @@
 
     // The text that appears on the dialog box when entering Images.
     var imageDialogText = gettext("Insert Image (upload file or type URL)"),
-        imageUrlHelpText = gettext("Type in a URL or use the \"Choose File\" button to upload a file from your machine. (e.g. 'http://example.com/img/clouds.jpg')"),  // jshint ignore:line
+        imageUrlHelpText = gettext("Type in a URL or use the \"Choose File\" button to upload a file from your machine. (e.g. 'http://example.com/img/clouds.jpg')"),  // eslint-disable-line max-len
         imageDescriptionLabel = gettext("Image Description"),
         imageDefaultText = "http://", // The default text that appears in input
-        imageDescError = gettext("Please describe this image or agree that it has no contextual value by checking the checkbox."),  // jshint ignore:line
-        imageDescriptionHelpText = gettext("e.g. 'Sky with clouds'. The description is helpful for users who cannot see the image."),  // jshint ignore:line
+        imageDescError = gettext('Please describe this image or agree that it has no contextual value by checking the checkbox.'),  // eslint-disable-line max-len
+        imageDescriptionHelpText = gettext("e.g. 'Sky with clouds'. The description is helpful for users who cannot see the image."),  // eslint-disable-line max-len
         imageDescriptionHelpLink = {
             href: 'http://www.w3.org/TR/html5/embedded-content-0.html#alt',
             text: gettext("How to create useful text alternatives.")
         },
-        imageIsDecorativeLabel = gettext("This image is for decorative purposes only and does not require a description.");  // jshint ignore:line
+        imageIsDecorativeLabel = gettext('This image is for decorative purposes only and does not require a description.');  // eslint-disable-line max-len
 
     // Text that is shared between both link and image dialog boxes.
     var defaultHelpHoverTitle = gettext("Markdown Editing Help"),
diff --git a/lms/static/js/bootstrap-alert.js b/lms/static/js/bootstrap-alert.js
index 57890a9a281aa54d2e1a306bdaf3b793b476befa..8768dbde0267403f7e6164d34f82182734b0d5c6 100644
--- a/lms/static/js/bootstrap-alert.js
+++ b/lms/static/js/bootstrap-alert.js
@@ -20,7 +20,7 @@
 
 !function ($) {
 
-  "use strict"; // jshint ;_;
+  "use strict";
 
 
  /* ALERT CLASS DEFINITION
@@ -87,4 +87,4 @@
     $('body').on('click.alert.data-api', dismiss, Alert.prototype.close)
   })
 
-}(window.jQuery);
\ No newline at end of file
+}(window.jQuery);
diff --git a/lms/static/js/bootstrap-collapse.js b/lms/static/js/bootstrap-collapse.js
index fbc915b9f96f485889a3cd5b4c9f42d866fa1898..10f3991be28ed1f4e395805ced243a3607ed190c 100644
--- a/lms/static/js/bootstrap-collapse.js
+++ b/lms/static/js/bootstrap-collapse.js
@@ -20,7 +20,7 @@
 
 !function ($) {
 
-  "use strict"; // jshint ;_;
+  "use strict";
 
 
  /* COLLAPSE PUBLIC CLASS DEFINITION
@@ -154,4 +154,4 @@
     })
   })
 
-}(window.jQuery);
\ No newline at end of file
+}(window.jQuery);
diff --git a/lms/static/js/bootstrap-modal.js b/lms/static/js/bootstrap-modal.js
index 38fd0c8468ce8a2031f1ec40e3fec0e1bf1b0e55..94ec4f04892f6acd759457c648eb6fc289c02976 100644
--- a/lms/static/js/bootstrap-modal.js
+++ b/lms/static/js/bootstrap-modal.js
@@ -20,7 +20,7 @@
 
 !function ($) {
 
-  "use strict"; // jshint ;_;
+  'use strict';
 
 
  /* MODAL CLASS DEFINITION
@@ -215,4 +215,4 @@
     })
   })
 
-}(window.jQuery);
\ No newline at end of file
+}(window.jQuery);
diff --git a/lms/static/js/bootstrap-transition.js b/lms/static/js/bootstrap-transition.js
index 534182622d017e9aa5d2b5d962efe56643adb0a4..da06a9bd590b9d2bd4a4d1f961c24a4f0bba1066 100644
--- a/lms/static/js/bootstrap-transition.js
+++ b/lms/static/js/bootstrap-transition.js
@@ -22,7 +22,7 @@
 
   $(function () {
 
-    "use strict"; // jshint ;_;
+    'use strict';
 
 
     /* CSS TRANSITION SUPPORT (http://www.modernizr.com/)
@@ -58,4 +58,4 @@
 
   })
 
-}(window.jQuery);
\ No newline at end of file
+}(window.jQuery);
diff --git a/lms/static/js/certificates/views/certificate_invalidation_view.js b/lms/static/js/certificates/views/certificate_invalidation_view.js
index c5b45766d440983df24b8e4da28399d365a7db06..a8fb76fc88af9e36ce0f34bdd86e6bc0ef87ab9a 100644
--- a/lms/static/js/certificates/views/certificate_invalidation_view.js
+++ b/lms/static/js/certificates/views/certificate_invalidation_view.js
@@ -46,7 +46,7 @@
                     );
 
                     if (this.collection.findWhere({user: user})) {
-                        message = gettext("Certificate of <%= user %> has already been invalidated. Please check your spelling and retry."); // jshint ignore:line
+                        message = gettext('Certificate of <%= user %> has already been invalidated. Please check your spelling and retry.');  // eslint-disable-line max-len
                         this.escapeAndShowMessage(_.template(message)({user: user}));
                     }
                     else if (certificate_invalidation.isValid()) {
@@ -88,7 +88,7 @@
                         model.destroy({
                             success: function() {
                                 self.escapeAndShowMessage(
-                                    gettext('The certificate for this learner has been re-validated and the system is re-running the grade for this learner.') // jshint ignore:line
+                                    gettext('The certificate for this learner has been re-validated and the system is re-running the grade for this learner.')  // eslint-disable-line max-len
                                 );
                             },
                             error: function(model, response) {
@@ -108,7 +108,7 @@
                     }
                     else {
                         self.escapeAndShowMessage(
-                            gettext('Could not find Certificate Invalidation in the list. Please refresh the page and try again') // jshint ignore:line
+                            gettext('Could not find Certificate Invalidation in the list. Please refresh the page and try again')  // eslint-disable-line max-len
                         );
                     }
                 },
@@ -126,4 +126,4 @@
             });
         }
     );
-}).call(this, define || RequireJS.define);
\ No newline at end of file
+}).call(this, define || RequireJS.define);
diff --git a/lms/static/js/certificates/views/certificate_whitelist.js b/lms/static/js/certificates/views/certificate_whitelist.js
index 66594c87b47268a4fcaed010f40c1f8fbfd770cd..21503d2aefaeb39a25f5748497842da0ea749ce4 100644
--- a/lms/static/js/certificates/views/certificate_whitelist.js
+++ b/lms/static/js/certificates/views/certificate_whitelist.js
@@ -67,7 +67,7 @@
                     }
                     else{
                         this.escapeAndShowMessage(
-                            gettext('Could not find Certificate Exception in white list. Please refresh the page and try again') // jshint ignore:line
+                            gettext('Could not find Certificate Exception in white list. Please refresh the page and try again')  // eslint-disable-line max-len
                         );
                     }
                 },
diff --git a/lms/static/js/certificates/views/certificate_whitelist_editor.js b/lms/static/js/certificates/views/certificate_whitelist_editor.js
index 6223267b81894f4084c48910a8f9b910e7dd8118..bbc9c1b8ca5288baf1cdc25a53b92dfe1dee57fb 100644
--- a/lms/static/js/certificates/views/certificate_whitelist_editor.js
+++ b/lms/static/js/certificates/views/certificate_whitelist_editor.js
@@ -64,7 +64,7 @@
                         );
                     }
                     else if(certificate_exception.isValid()){
-                        message = gettext("<%= user %> has been successfully added to the exception list. Click Generate Exception Certificate below to send the certificate."); // jshint ignore:line
+                        message = gettext('<%= user %> has been successfully added to the exception list. Click Generate Exception Certificate below to send the certificate.');  // eslint-disable-line max-len
                         certificate_exception.save(
                             null,
                             {
@@ -118,4 +118,4 @@
             });
         }
     );
-}).call(this, define || RequireJS.define);
\ No newline at end of file
+}).call(this, define || RequireJS.define);
diff --git a/lms/static/js/commerce/views/receipt_view.js b/lms/static/js/commerce/views/receipt_view.js
index b32f3156d67a15494f930436622ee13006221b4e..bb258a6139a29bac7e66dacb3371f20f458cc0b7 100644
--- a/lms/static/js/commerce/views/receipt_view.js
+++ b/lms/static/js/commerce/views/receipt_view.js
@@ -1,6 +1,8 @@
 /**
  * View for the receipt page.
  */
+
+/* globals _, Backbone */
 var edx = edx || {};
 
 (function ($, _, Backbone) {
@@ -319,10 +321,10 @@ var edx = edx || {};
     new edx.commerce.ReceiptView({
         el: $('#receipt-container')
     });
+})(jQuery, _, Backbone);
 
-})(jQuery, _, Backbone);     // jshint ignore:line
-
-function completeOrder(event) {     // jshint ignore:line
+function completeOrder(event) {
+    'use strict';
     var courseKey = $(event).data("course-key"),
         username = $(event).data("username"),
         providerId = $(event).data("provider"),
diff --git a/lms/static/js/courseware/courseware_factory.js b/lms/static/js/courseware/courseware_factory.js
index d45d87d36783c30f606ad70f0228536067d72388..2a1fbc47dd1a3c9fd8bb8c000c302a69fcf97d17 100644
--- a/lms/static/js/courseware/courseware_factory.js
+++ b/lms/static/js/courseware/courseware_factory.js
@@ -20,7 +20,7 @@
                 });
 
                 // 2. instantiating this button attaches events to all buttons in the courseware.
-                new BookmarksListButton(); // jshint ignore:line
+                new BookmarksListButton();  // eslint-disable-line no-new
             };
         }
     );
diff --git a/lms/static/js/dashboard/legacy.js b/lms/static/js/dashboard/legacy.js
index 5438475a842d5abce931ec5a915387a4419f6c7e..f44e3177d3b50d07f7f2047a89090ff796a1a97c 100644
--- a/lms/static/js/dashboard/legacy.js
+++ b/lms/static/js/dashboard/legacy.js
@@ -5,6 +5,9 @@
  * for the dashboard should be implemented as self-contained
  * modules with unit tests.
  */
+
+ /* globals Logger, accessible_modal, interpolate */
+
  var edx = edx || {};
 
 (function($, gettext, Logger, accessibleModal, interpolate) {
@@ -180,5 +183,4 @@
             $("#unenroll_course_name").text($(event.target).data("course-name"));
         });
     };
-
-})(jQuery, gettext, Logger, accessible_modal, interpolate); // jshint undef:false
+})(jQuery, gettext, Logger, accessible_modal, interpolate);
diff --git a/lms/static/js/groups/views/verified_track_settings_notification.js b/lms/static/js/groups/views/verified_track_settings_notification.js
index 72c4f6440e2dd4ccb0af3aad9545cf0e83508cff..54d0ff4c82b8fb7481ad49565101b227df8db6a2 100644
--- a/lms/static/js/groups/views/verified_track_settings_notification.js
+++ b/lms/static/js/groups/views/verified_track_settings_notification.js
@@ -32,7 +32,7 @@
                                 this.showNotification({
                                     type: 'confirmation',
                                     title: StringUtils.interpolate(
-                                        gettext("This course uses automatic cohorting for verified track learners. You cannot disable cohorts, and you cannot rename the manual cohort named '{verifiedCohortName}'. To change the configuration for verified track cohorts, contact your edX partner manager."), // jshint ignore:line
+                                        gettext("This course uses automatic cohorting for verified track learners. You cannot disable cohorts, and you cannot rename the manual cohort named '{verifiedCohortName}'. To change the configuration for verified track cohorts, contact your edX partner manager."),  // eslint-disable-line max-len
                                         {verifiedCohortName: verifiedCohortName}
                                     )
                                 });
@@ -42,7 +42,7 @@
                                 this.showNotification({
                                     type: 'error',
                                     title: StringUtils.interpolate(
-                                        gettext("This course has automatic cohorting enabled for verified track learners, but the required cohort does not exist. You must create a manually-assigned cohort named '{verifiedCohortName}' for the feature to work."), // jshint ignore:line
+                                        gettext("This course has automatic cohorting enabled for verified track learners, but the required cohort does not exist. You must create a manually-assigned cohort named '{verifiedCohortName}' for the feature to work."),  // eslint-disable-line max-len
                                         {verifiedCohortName: verifiedCohortName}
                                     )
                                 });
@@ -52,7 +52,7 @@
                         else {
                             this.showNotification({
                                 type: 'error',
-                                title: gettext('This course has automatic cohorting enabled for verified track learners, but cohorts are disabled. You must enable cohorts for the feature to work.') // jshint ignore:line
+                                title: gettext('This course has automatic cohorting enabled for verified track learners, but cohorts are disabled. You must enable cohorts for the feature to work.')  // eslint-disable-line max-len
                             });
                             enableCohortsCheckbox.prop('disabled', false);
                         }
diff --git a/lms/static/js/spec/courseware/updates_visibility_spec.js b/lms/static/js/spec/courseware/updates_visibility_spec.js
index f5505b90b95008d28a2c1c31e9b3b602f7b274db..df10a9ccf8139eaff047593996553ed3fd35a18a 100644
--- a/lms/static/js/spec/courseware/updates_visibility_spec.js
+++ b/lms/static/js/spec/courseware/updates_visibility_spec.js
@@ -6,9 +6,7 @@ define(['jquery', 'logger', 'js/courseware/toggle_element_visibility', 'moment']
 
             beforeEach(function() {
                 loadFixtures('js/fixtures/courseware/course_updates.html');
-                /*jshint newcap: false */
                 ToggleElementVisibility();
-                /*jshint newcap: true */
                 spyOn(Logger, 'log');
             });
 
diff --git a/lms/static/js/spec/shoppingcart/shoppingcart_spec.js b/lms/static/js/spec/shoppingcart/shoppingcart_spec.js
index 7d8109af197b6f4d6fc1f113824438170c1761f0..c9ee98efbb352ed652b89ca16639bc1807fde8b7 100644
--- a/lms/static/js/spec/shoppingcart/shoppingcart_spec.js
+++ b/lms/static/js/spec/shoppingcart/shoppingcart_spec.js
@@ -7,7 +7,7 @@ define(['edx-ui-toolkit/js/utils/spec-helpers/ajax-helpers', 'js/shoppingcart/sh
             var requests = null;
 
             beforeEach(function() {
-                setFixtures('<section class="wrapper confirm-enrollment shopping-cart cart-view"><form action="" method="post"><input type="hidden" name="" value="" /><span class="icon fa fa-caret-right"></span><input type="submit" value="Payment"/></form></section>'); // jshint ignore:line
+                setFixtures('<section class="wrapper confirm-enrollment shopping-cart cart-view"><form action="" method="post"><input type="hidden" name="" value="" /><span class="icon fa fa-caret-right"></span><input type="submit" value="Payment"/></form></section>'); // eslint-disable-line max-len
 
                 view = new edx.shoppingcart.showcart.CartView({
                     el: $('.confirm-enrollment.cart-view form')
diff --git a/lms/static/js/student_account/views/LoginView.js b/lms/static/js/student_account/views/LoginView.js
index 803e6ab5d791ea31ad6fbf6917e4842c4417154d..c62edc6787623ed53cc362b82c66b2720d4e6ec9 100644
--- a/lms/static/js/student_account/views/LoginView.js
+++ b/lms/static/js/student_account/views/LoginView.js
@@ -39,7 +39,7 @@
                 var fields = html || '';
                 this.successMessage = HtmlUtils.interpolateHtml(
                     // eslint-disable-next-line
-                    gettext('We have sent an email message with password reset instructions to the email address you provided.  If you do not receive this message, {anchorStart}contact technical support{anchorEnd}.'), {  // jshint ignore:line
+                    gettext('We have sent an email message with password reset instructions to the email address you provided.  If you do not receive this message, {anchorStart}contact technical support{anchorEnd}.'), {  // eslint-disable-line max-len
                         anchorStart: HtmlUtils.HTML('<a href="' + this.supportURL + '">'),
                         anchorEnd: HtmlUtils.HTML('</a>')
                     }
@@ -151,4 +151,3 @@
         });
     });
 }).call(this, define || RequireJS.define);
-
diff --git a/lms/static/js/student_account/views/account_settings_factory.js b/lms/static/js/student_account/views/account_settings_factory.js
index d8140c12e03317c36116c4a65b4a00e09dfa526a..1f93bf05417bf7e1ca7d409025d1817b208e68f9 100644
--- a/lms/static/js/student_account/views/account_settings_factory.js
+++ b/lms/static/js/student_account/views/account_settings_factory.js
@@ -34,7 +34,7 @@
             aboutSectionsData = [
                  {
                     title: gettext('Basic Account Information'),
-                    subtitle: gettext('These settings include basic information about your account. You can also specify additional information and see your linked social accounts on this page.'), /* jshint ignore:line */
+                    subtitle: gettext('These settings include basic information about your account. You can also specify additional information and see your linked social accounts on this page.'),  // eslint-disable-line max-len
                     fields: [
                         {
                             view: new AccountSettingsFieldViews.ReadonlyFieldView({
@@ -42,7 +42,7 @@
                                 title: gettext('Username'),
                                 valueAttribute: 'username',
                                 helpMessage: StringUtils.interpolate(
-                                    gettext('The name that identifies you throughout {platform_name}. You cannot change your username.'), /* jshint ignore:line */
+                                    gettext('The name that identifies you throughout {platform_name}. You cannot change your username.'),  // eslint-disable-line max-len
                                     {platform_name: platformName}
                                 )
                             })
@@ -53,7 +53,7 @@
                                 title: gettext('Full Name'),
                                 valueAttribute: 'name',
                                 helpMessage: gettext(
-                                    'The name that is used for ID verification and appears on your certificates. Other learners never see your full name. Make sure to enter your name exactly as it appears on your government-issued photo ID, including any non-Roman characters.' /* jshint ignore:line */
+                                    'The name that is used for ID verification and appears on your certificates. Other learners never see your full name. Make sure to enter your name exactly as it appears on your government-issued photo ID, including any non-Roman characters.'  // eslint-disable-line max-len
                                 ),
                                 persistChanges: true
                             })
@@ -64,7 +64,7 @@
                                 title: gettext('Email Address'),
                                 valueAttribute: 'email',
                                 helpMessage: StringUtils.interpolate(
-                                    gettext('The email address you use to sign in. Communications from {platform_name} and your courses are sent to this address.'), /* jshint ignore:line */
+                                    gettext('The email address you use to sign in. Communications from {platform_name} and your courses are sent to this address.'),  // eslint-disable-line max-len
                                     {platform_name: platformName}
                                 ),
                                 persistChanges: true
@@ -80,7 +80,7 @@
                                 linkTitle: gettext('Reset Your Password'),
                                 linkHref: fieldsData.password.url,
                                 helpMessage: StringUtils.interpolate(
-                                    gettext('When you select "Reset Your Password", a message will be sent to the email address for your {platform_name} account. Click the link in the message to reset your password.'), /* jshint ignore:line */
+                                    gettext('When you select "Reset Your Password", a message will be sent to the email address for your {platform_name} account. Click the link in the message to reset your password.'),  // eslint-disable-line max-len
                                     {platform_name: platformName}
                                 )
                             })
@@ -93,7 +93,7 @@
                                 required: true,
                                 refreshPageOnSave: true,
                                 helpMessage: StringUtils.interpolate(
-                                    gettext('The language used throughout this site. This site is currently available in a limited number of languages.'), /* jshint ignore:line */
+                                    gettext('The language used throughout this site. This site is currently available in a limited number of languages.'),  // eslint-disable-line max-len
                                     {platform_name: platformName}
                                 ),
                                 options: fieldsData.language.options,
@@ -207,7 +207,7 @@
                 {
                     title: gettext('My Orders'),
                     subtitle: StringUtils.interpolate(
-                        gettext('This page contains information about orders that you have placed with {platform_name}.'),  /* jshint ignore:line */
+                        gettext('This page contains information about orders that you have placed with {platform_name}.'),  // eslint-disable-line max-len
                         {platform_name: platformName}
                     ),
                     fields: _.map(ordersHistoryData, function(order) {
diff --git a/lms/static/js/student_account/views/account_settings_fields.js b/lms/static/js/student_account/views/account_settings_fields.js
index 33dccc925a7bfb20ef17fbfca3c595114c7962b8..dbfff2172f1e80d32782a3a506c9ee706830ba0a 100644
--- a/lms/static/js/student_account/views/account_settings_fields.js
+++ b/lms/static/js/student_account/views/account_settings_fields.js
@@ -44,7 +44,7 @@
                     return HtmlUtils.joinHtml(
                         this.indicators.success,
                         StringUtils.interpolate(
-                            gettext('We\'ve sent a confirmation message to {new_email_address}. Click the link in the message to update your email address.'), /* jshint ignore:line */
+                            gettext('We\'ve sent a confirmation message to {new_email_address}. Click the link in the message to update your email address.'),  // eslint-disable-line max-len
                             {'new_email_address': this.fieldValue()}
                         )
                     );
@@ -70,7 +70,7 @@
                             view.showNotificationMessage(
                                 HtmlUtils.joinHtml(
                                     view.indicators.error,
-                                    gettext('You must sign out and sign back in before your language changes take effect.') // jshint ignore:line
+                                    gettext('You must sign out and sign back in before your language changes take effect.')  // eslint-disable-line max-len
                                 )
                             );
                         }
@@ -114,7 +114,7 @@
                     return HtmlUtils.joinHtml(
                         this.indicators.success,
                         StringUtils.interpolate(
-                            gettext('We\'ve sent a message to {email_address}. Click the link in the message to reset your password.'), /* jshint ignore:line */
+                            gettext('We\'ve sent a message to {email_address}. Click the link in the message to reset your password.'),  // eslint-disable-line max-len
                             {'email_address': this.model.get(this.options.emailAttribute)}
                         )
                     );
@@ -161,7 +161,7 @@
                         linkTitle = gettext('Unlink This Account');
                         linkClass = 'social-field-linked';
                         subTitle = StringUtils.interpolate(
-                            gettext('You can use your {accountName} account to sign in to your {platformName} account.'), /* jshint ignore:line */
+                            gettext('You can use your {accountName} account to sign in to your {platformName} account.'),  // eslint-disable-line max-len
                             {accountName: this.options.title, platformName: this.options.platformName}
                         );
                         screenReaderTitle = StringUtils.interpolate(
@@ -172,7 +172,7 @@
                         linkTitle = gettext('Link Your Account');
                         linkClass = 'social-field-unlinked';
                         subTitle = StringUtils.interpolate(
-                            gettext('Link your {accountName} account to your {platformName} account and use {accountName} to sign in to {platformName}.'), /* jshint ignore:line */
+                            gettext('Link your {accountName} account to your {platformName} account and use {accountName} to sign in to {platformName}.'),  // eslint-disable-line max-len
                             {accountName: this.options.title, platformName: this.options.platformName}
                         );
                     }
@@ -236,7 +236,7 @@
                     return HtmlUtils.joinHtml(this.indicators.success, gettext('Successfully unlinked.'));
                 }
             }),
-            
+
             OrderHistoryFieldView: FieldViews.ReadonlyFieldView.extend({
                 fieldType: 'orderHistory',
                 fieldTemplate: field_order_history_template,
diff --git a/lms/static/js/student_profile/views/learner_profile_fields.js b/lms/static/js/student_profile/views/learner_profile_fields.js
index db508d895878aac3ca20eece75b9f764217bc020..c57d62e1e015bbc150f02e40445ac1b2491516bc 100644
--- a/lms/static/js/student_profile/views/learner_profile_fields.js
+++ b/lms/static/js/student_profile/views/learner_profile_fields.js
@@ -27,21 +27,21 @@
                 if (this.profileIsPrivate) {
                     this._super(
                         HtmlUtils.interpolateHtml(
-                            gettext("You must specify your birth year before you can share your full profile. To specify your birth year, go to the {account_settings_page_link}"), // jshint ignore:line
+                            gettext('You must specify your birth year before you can share your full profile. To specify your birth year, go to the {account_settings_page_link}'),  // eslint-disable-line max-len
                             {'account_settings_page_link':accountSettingsLink}
                         )
                     );
                 } else if (this.requiresParentalConsent) {
                     this._super(
                         HtmlUtils.interpolateHtml(
-                            gettext('You must be over 13 to share a full profile. If you are over 13, make sure that you have specified a birth year on the {account_settings_page_link}'), // jshint ignore:line
+                            gettext('You must be over 13 to share a full profile. If you are over 13, make sure that you have specified a birth year on the {account_settings_page_link}'),  // eslint-disable-line max-len
                             {'account_settings_page_link': accountSettingsLink}
                         )
                     );
                 }
                 else {
                     this._super('');
-                } 
+                }
             },
 
             updateFieldValue: function() {
diff --git a/lms/static/js/views/fields.js b/lms/static/js/views/fields.js
index f1c72dda7640b8e3f1e3defb57fe5aefd18502d6..762f34223474deeac70571143a7a333d388b1380 100644
--- a/lms/static/js/views/fields.js
+++ b/lms/static/js/views/fields.js
@@ -1,7 +1,7 @@
 ;(function (define, undefined) {
     'use strict';
     define([
-        'gettext', 'jquery', 'underscore', 'backbone', 
+        'gettext', 'jquery', 'underscore', 'backbone',
         'edx-ui-toolkit/js/utils/html-utils',
         'text!templates/fields/field_readonly.underscore',
         'text!templates/fields/field_dropdown.underscore',
@@ -21,7 +21,7 @@
         var FieldViews = {};
 
         FieldViews.FieldView = Backbone.View.extend({
-                
+
             fieldType: 'generic',
 
             className: function () {
@@ -32,27 +32,27 @@
 
             indicators: {
                 'canEdit': HtmlUtils.joinHtml(
-                    HtmlUtils.HTML('<span class="icon fa fa-pencil message-can-edit" aria-hidden="true"></span><span class="sr">'), // jshint ignore:line
+                    HtmlUtils.HTML('<span class="icon fa fa-pencil message-can-edit" aria-hidden="true"></span><span class="sr">'),  // eslint-disable-line max-len
                     gettext("Editable"),
                     HtmlUtils.HTML('</span>')
                 ),
                 'error': HtmlUtils.joinHtml(
-                    HtmlUtils.HTML('<span class="fa fa-exclamation-triangle message-error" aria-hidden="true"></span><span class="sr">'), // jshint ignore:line
+                    HtmlUtils.HTML('<span class="fa fa-exclamation-triangle message-error" aria-hidden="true"></span><span class="sr">'),  // eslint-disable-line max-len
                     gettext("Error"),
                     HtmlUtils.HTML('</span>')
                 ),
                 'validationError': HtmlUtils.joinHtml(
-                    HtmlUtils.HTML('<span class="fa fa-exclamation-triangle message-validation-error" aria-hidden="true"></span><span class="sr">'), // jshint ignore:line
+                    HtmlUtils.HTML('<span class="fa fa-exclamation-triangle message-validation-error" aria-hidden="true"></span><span class="sr">'),  // eslint-disable-line max-len
                     gettext("Validation Error"),
                     HtmlUtils.HTML('</span>')
                 ),
                 'inProgress': HtmlUtils.joinHtml(
-                    HtmlUtils.HTML('<span class="fa fa-spinner fa-pulse message-in-progress" aria-hidden="true"></span><span class="sr">'), // jshint ignore:line
+                    HtmlUtils.HTML('<span class="fa fa-spinner fa-pulse message-in-progress" aria-hidden="true"></span><span class="sr">'),  // eslint-disable-line max-len
                     gettext("In Progress"),
                     HtmlUtils.HTML('</span>')
                 ),
                 'success': HtmlUtils.joinHtml(
-                    HtmlUtils.HTML('<span class="fa fa-check message-success" aria-hidden="true"></span><span class="sr">'), // jshint ignore:line
+                    HtmlUtils.HTML('<span class="fa fa-check message-success" aria-hidden="true"></span><span class="sr">'),  // eslint-disable-line max-len
                     gettext("Success"),
                     HtmlUtils.HTML('</span>')
                 ),
diff --git a/lms/static/karma_lms.conf.js b/lms/static/karma_lms.conf.js
index a4f5f3c29d4986fb09fb57be6f25e8399f39396a..75bd7b9322e0098e68d6ed6643be52ae044f297c 100644
--- a/lms/static/karma_lms.conf.js
+++ b/lms/static/karma_lms.conf.js
@@ -1,8 +1,7 @@
 // Karma config for lms suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
+/* eslint-env node */
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, '../../common/static/common/js/karma.common.conf.js'));
diff --git a/lms/static/karma_lms_coffee.conf.js b/lms/static/karma_lms_coffee.conf.js
index 78866c684c879e3a22beb7cf9a931a78ecd12678..e65d9890ee563e2670c0e08dfc0f1a5d14d8128e 100644
--- a/lms/static/karma_lms_coffee.conf.js
+++ b/lms/static/karma_lms_coffee.conf.js
@@ -1,8 +1,7 @@
 // Karma config for lms-coffee suite.
 // Docs and troubleshooting tips in common/static/common/js/karma.common.conf.js
 
-/* jshint node: true */
-/*jshint -W079 */
+/* eslint-env node */
 'use strict';
 var path = require('path');
 var configModule = require(path.join(__dirname, '../../common/static/common/js/karma.common.conf.js'));
diff --git a/lms/static/lms/js/preview/preview_factory.js b/lms/static/lms/js/preview/preview_factory.js
index 9a5b37e43ef7d45ee166d31a77ed633b353ac9fb..7def8f75c3b317ab2b22d4ab060a5bd05a319af6 100644
--- a/lms/static/lms/js/preview/preview_factory.js
+++ b/lms/static/lms/js/preview/preview_factory.js
@@ -22,7 +22,7 @@
                 $selectElement.change(function() {
                     var selectedOption;
                     if ($selectElement.attr('disabled')) {
-                        return alert(gettext('You cannot view the course as a student or beta tester before the course release date.'));  // jshint ignore:line
+                        return alert(gettext('You cannot view the course as a student or beta tester before the course release date.'));  // eslint-disable-line max-len, no-alert
                     }
                     selectedOption = $selectElement.find('option:selected');
                     if (selectedOption.val() === 'specific student') {
diff --git a/lms/static/lms/js/spec/main.js b/lms/static/lms/js/spec/main.js
index fdc8af973cb21e2255a0b4686bb7f5ed576eb30d..5c4d42cf96bb8029685acf5dec96e8273db24a85 100644
--- a/lms/static/lms/js/spec/main.js
+++ b/lms/static/lms/js/spec/main.js
@@ -51,7 +51,7 @@
             'squire': 'xmodule_js/common_static/js/vendor/Squire',
             'jasmine-imagediff': 'xmodule_js/common_static/js/vendor/jasmine-imagediff',
             'domReady': 'xmodule_js/common_static/js/vendor/domReady',
-            'mathjax': '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured', // jshint ignore:line
+            mathjax: '//cdn.mathjax.org/mathjax/2.6-latest/MathJax.js?config=TeX-MML-AM_SVG&delayStartupUntil=configured',  // eslint-disable-line max-len
             'youtube': '//www.youtube.com/player_api?noext',
             'coffee/src/ajax_prefix': 'xmodule_js/common_static/coffee/src/ajax_prefix',
             'coffee/src/instructor_dashboard/student_admin': 'coffee/src/instructor_dashboard/student_admin',
diff --git a/lms/static/lms/js/xblock/lms.runtime.v1.js b/lms/static/lms/js/xblock/lms.runtime.v1.js
index 50903ccaa39577383b682747bfaeaa14dfb0dd9e..362c760b2aa7a3d7b8bed4ec84241c96da3d1c7f 100644
--- a/lms/static/lms/js/xblock/lms.runtime.v1.js
+++ b/lms/static/lms/js/xblock/lms.runtime.v1.js
@@ -1,3 +1,5 @@
+/* globals URI */
+
 (function(URI) {
     'use strict';
 
@@ -51,5 +53,4 @@
         return v1;
 
     })(XBlock.Runtime.v1);
-
-}).call(this, URI);  // jshint ignore:line
+}).call(this, URI);
diff --git a/lms/templates/discussion/_discussion_inline.html b/lms/templates/discussion/_discussion_inline.html
index bd17014839121807944bae2ddcb364f3ecf843ae..a383150cf888d9919db8cdc588016ce0e865053b 100644
--- a/lms/templates/discussion/_discussion_inline.html
+++ b/lms/templates/discussion/_discussion_inline.html
@@ -22,7 +22,6 @@ var $$course_id = "${course_id | n, js_escaped_string}";
 function DiscussionInlineBlock(runtime, element) {
     'use strict';
     var el = $(element).find('.discussion-module');
-    /* jshint nonew:false */
     new DiscussionModuleView({ el: el });
 }
 </script>
diff --git a/package.json b/package.json
index 7fb50cee4b56f7a13b7d7961eec0d24f2d6e542c..b1a3c606cc7ee601c726c8ef29c73aa148f2883b 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
   "devDependencies": {
     "edx-custom-a11y-rules": "0.1.2",
     "eslint": "^2.13.1",
-    "eslint-config-edx": "^1.2.0",
+    "eslint-config-edx": "^1.2.1",
     "jasmine-core": "^2.4.1",
     "jasmine-jquery": "^2.1.1",
     "jquery": "^2.1.4",
diff --git a/scripts/all-tests.sh b/scripts/all-tests.sh
index b8a978069323179d0f0015d1a6097a8089fb2265..01b794a6bfdc092906020ccdc18187d4baee4a9e 100755
--- a/scripts/all-tests.sh
+++ b/scripts/all-tests.sh
@@ -12,7 +12,7 @@ set -e
 
 # Violations thresholds for failing the build
 export PYLINT_THRESHOLD=3750
-export ESLINT_THRESHOLD=49019
+export ESLINT_THRESHOLD=48129
 
 SAFELINT_THRESHOLDS=`cat scripts/safelint_thresholds.json`
 export SAFELINT_THRESHOLDS=${SAFELINT_THRESHOLDS//[[:space:]]/}