diff --git a/.eslintrc.yml b/.eslintrc.yml
index 70a71baa590fdc8764376984ee62918d16db1ba4..59eec634e8b6b8cf14d9c8f0e90a037821f38729 100644
--- a/.eslintrc.yml
+++ b/.eslintrc.yml
@@ -10,6 +10,7 @@ plugins:
   - import
   - "@gitlab/i18n"
   - "@gitlab/vue-i18n"
+  - no-jquery
 settings:
   import/resolver:
     webpack:
@@ -36,6 +37,11 @@ rules:
   vue/no-use-v-if-with-v-for: off
   vue/no-v-html: off
   vue/use-v-on-exact: off
+  no-jquery/no-ajax: error
+  no-jquery/no-ajax-events: error
+  no-jquery/no-load: error
+  no-jquery/no-load-shorthand: error
+  no-jquery/no-serialize: error
 overrides:
   files:
     - '**/spec/**/*'
diff --git a/app/assets/javascripts/filterable_list.js b/app/assets/javascripts/filterable_list.js
index 77080691dcb32c49b0ec58a6483ba22fa2589560..c21fba06d42c50322a759e24ff267ce859aae7d2 100644
--- a/app/assets/javascripts/filterable_list.js
+++ b/app/assets/javascripts/filterable_list.js
@@ -22,6 +22,7 @@ export default class FilterableList {
 
   getPagePath() {
     const action = this.filterForm.getAttribute('action');
+    // eslint-disable-next-line no-jquery/no-serialize
     const params = $(this.filterForm).serialize();
     return `${action}${action.indexOf('?') > 0 ? '&' : '?'}${params}`;
   }
diff --git a/app/assets/javascripts/integrations/integration_settings_form.js b/app/assets/javascripts/integrations/integration_settings_form.js
index a7746bb3a0b7d4f73bc9f582c631231a36d71432..1c9b94ade8ac902183db67f08aecfcb2579ac9a3 100644
--- a/app/assets/javascripts/integrations/integration_settings_form.js
+++ b/app/assets/javascripts/integrations/integration_settings_form.js
@@ -42,6 +42,7 @@ export default class IntegrationSettingsForm {
     // and test the service using provided configuration.
     if (this.$form.get(0).checkValidity() && this.canTestService) {
       e.preventDefault();
+      // eslint-disable-next-line no-jquery/no-serialize
       this.testSettings(this.$form.serialize());
     }
   }
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index 49be11d466d2ef72baa2bb5d7b6fae681bc6a9b4..c19a845eb69d88a4b5efa8480915422e6fb3788f 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -314,6 +314,7 @@ document.addEventListener('DOMContentLoaded', () => {
     const action = `${this.action}${link.search === '' ? '?' : '&'}`;
 
     event.preventDefault();
+    // eslint-disable-next-line no-jquery/no-serialize
     visitUrl(`${action}${$(this).serialize()}`);
   });
 
diff --git a/app/assets/javascripts/notes.js b/app/assets/javascripts/notes.js
index 9cc56b34c757e66767a4f424d7428b9c3556f38c..ed52eec8b188395feddb9c34889f89654dbbbecb 100644
--- a/app/assets/javascripts/notes.js
+++ b/app/assets/javascripts/notes.js
@@ -1461,6 +1461,7 @@ export default class Notes {
   getFormData($form) {
     const content = $form.find('.js-note-text').val();
     return {
+      // eslint-disable-next-line no-jquery/no-serialize
       formData: $form.serialize(),
       formContent: _.escape(content),
       formAction: $form.attr('action'),
diff --git a/app/assets/javascripts/pages/projects/commit/pipelines/index.js b/app/assets/javascripts/pages/projects/commit/pipelines/index.js
index 8cc3cb0a57c92ca0038d558b8373261948f73f95..9f08260c3d6cd516fe5af4c4c575826376dc39fd 100644
--- a/app/assets/javascripts/pages/projects/commit/pipelines/index.js
+++ b/app/assets/javascripts/pages/projects/commit/pipelines/index.js
@@ -6,6 +6,7 @@ document.addEventListener('DOMContentLoaded', () => {
   new MiniPipelineGraph({
     container: '.js-commit-pipeline-graph',
   }).bindEvents();
+  // eslint-disable-next-line no-jquery/no-load
   $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath);
   initPipelines();
 });
diff --git a/app/assets/javascripts/pages/projects/commit/show/index.js b/app/assets/javascripts/pages/projects/commit/show/index.js
index 6fc982967eb3f7bd00ce77090070feba711315b3..5aa4734244e702fed6e8b073e3003522b43084b8 100644
--- a/app/assets/javascripts/pages/projects/commit/show/index.js
+++ b/app/assets/javascripts/pages/projects/commit/show/index.js
@@ -21,6 +21,7 @@ document.addEventListener('DOMContentLoaded', () => {
   }).bindEvents();
   initNotes();
   initChangesDropdown(document.querySelector('.navbar-gitlab').offsetHeight + performanceHeight);
+  // eslint-disable-next-line no-jquery/no-load
   $('.commit-info.branches').load(document.querySelector('.js-commit-box').dataset.commitPath);
   fetchCommitMergeRequests();
   initDiffNotes();
diff --git a/ee/app/assets/javascripts/jira_connect.js b/ee/app/assets/javascripts/jira_connect.js
index 0716a94ea8512eb2c7ff069ae94bf58318b19656..4ab5d6368d0e79452940eaa98a33505309241d66 100644
--- a/ee/app/assets/javascripts/jira_connect.js
+++ b/ee/app/assets/javascripts/jira_connect.js
@@ -24,6 +24,7 @@
       e.preventDefault();
 
       AP.context.getToken(function(token) {
+        // eslint-disable-next-line no-jquery/no-ajax
         $.post(actionUrl, {
           jwt: token,
           namespace_path: $('#namespace-input').val(),
@@ -39,6 +40,7 @@
       e.preventDefault();
 
       AP.context.getToken(function(token) {
+        // eslint-disable-next-line no-jquery/no-ajax
         $.ajax({
           url: href,
           method: 'DELETE',
diff --git a/ee/app/assets/javascripts/projects/custom_project_templates.js b/ee/app/assets/javascripts/projects/custom_project_templates.js
index 9f7f0e53edb42c78d2e3ffba97c65a06ab00697c..f4930f73fc01421ecaab12914d7972adb959dd64 100644
--- a/ee/app/assets/javascripts/projects/custom_project_templates.js
+++ b/ee/app/assets/javascripts/projects/custom_project_templates.js
@@ -120,10 +120,12 @@ export default () => {
   $groupTabContent.on('ajax:success', bindEvents);
 
   $navElement.one('click', () => {
+    // eslint-disable-next-line no-jquery/no-ajax
     $.get($tabContent.data('initialTemplates'));
   });
 
   $groupNavElement.one('click', () => {
+    // eslint-disable-next-line no-jquery/no-ajax
     $.get($groupTabContent.data('initialTemplates'));
   });
 
diff --git a/package.json b/package.json
index 3e9b7fca77311d3764ed1b5d2b8da95510fa22ab..9e1ea86b6925bf17544accbce3a81b2b24a26cbe 100644
--- a/package.json
+++ b/package.json
@@ -166,6 +166,7 @@
     "eslint-plugin-import": "^2.14.0",
     "eslint-plugin-jasmine": "^2.10.1",
     "eslint-plugin-jest": "^22.3.0",
+    "eslint-plugin-no-jquery": "^2.1.0",
     "gettext-extractor": "^3.4.3",
     "gettext-extractor-vue": "^4.0.2",
     "graphql-tag": "^2.10.0",
diff --git a/spec/javascripts/integrations/integration_settings_form_spec.js b/spec/javascripts/integrations/integration_settings_form_spec.js
index 069e2cb07b5bc8277a78d72c449d8652936485c4..82d1f815ca8195a8514876cf813f1ee815079c55 100644
--- a/spec/javascripts/integrations/integration_settings_form_spec.js
+++ b/spec/javascripts/integrations/integration_settings_form_spec.js
@@ -126,6 +126,7 @@ describe('IntegrationSettingsForm', () => {
       spyOn(axios, 'put').and.callThrough();
 
       integrationSettingsForm = new IntegrationSettingsForm('.js-integration-settings-form');
+      // eslint-disable-next-line no-jquery/no-serialize
       formData = integrationSettingsForm.$form.serialize();
     });
 
diff --git a/yarn.lock b/yarn.lock
index 923f0305ea4b6b39a540f1f3885aba1f945bef1d..8e6fd5b1a2e8c383ca9636a2a7ea6ec3efbc061e 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4624,6 +4624,11 @@ eslint-plugin-jest@^22.3.0:
   resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-22.3.0.tgz#a10f10dedfc92def774ec9bb5bfbd2fb8e1c96d2"
   integrity sha512-P1mYVRNlOEoO5T9yTqOfucjOYf1ktmJ26NjwjH8sxpCFQa6IhBGr5TpKl3hcAAT29hOsRJVuMWmTsHoUVo9FoA==
 
+eslint-plugin-no-jquery@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/eslint-plugin-no-jquery/-/eslint-plugin-no-jquery-2.1.0.tgz#d03b74224c5cfbc7fc0bdd12ce4eb400d09e0c0b"
+  integrity sha512-5sr5tOJRfuRviyAvFTe/mr80TXWxTteD/JHRuJtDN8q/bxAh16eSKoKLAevLC7wZCRN2iwnEfhQPQV4rp/gYtg==
+
 eslint-plugin-promise@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-4.1.1.tgz#1e08cb68b5b2cd8839f8d5864c796f56d82746db"