diff --git a/Gemfile b/Gemfile
index 9efb362e494eaa8b443418e31f63187cd9e06087..d5d7051ecc6a8523ccb4f3e45de45afc444c9b98 100644
--- a/Gemfile
+++ b/Gemfile
@@ -109,7 +109,7 @@ gem 'seed-fu', '~> 2.3.5'
 
 # Markdown and HTML processing
 gem 'html-pipeline', '~> 1.11.0'
-gem 'deckar01-task_list', '1.0.6', require: 'task_list/railtie'
+gem 'deckar01-task_list', '2.0.0'
 gem 'gitlab-markup', '~> 1.5.1'
 gem 'redcarpet', '~> 3.4'
 gem 'RedCloth', '~> 4.3.2'
diff --git a/Gemfile.lock b/Gemfile.lock
index 273a69792ef4cbdb1ae54041855abd0a6b196c79..b4252a2bdc9c58061df30b34f8afa30688229ea7 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -141,10 +141,8 @@ GEM
     database_cleaner (1.5.3)
     debug_inspector (0.0.2)
     debugger-ruby_core_source (1.3.8)
-    deckar01-task_list (1.0.6)
-      activesupport (~> 4.0)
+    deckar01-task_list (2.0.0)
       html-pipeline
-      rack (~> 1.0)
     default_value_for (3.0.2)
       activerecord (>= 3.2.0, < 5.1)
     descendants_tracker (0.0.4)
@@ -895,7 +893,7 @@ DEPENDENCIES
   creole (~> 0.5.0)
   d3_rails (~> 3.5.0)
   database_cleaner (~> 1.5.0)
-  deckar01-task_list (= 1.0.6)
+  deckar01-task_list (= 2.0.0)
   default_value_for (~> 3.0.0)
   devise (~> 4.2)
   devise-two-factor (~> 3.0.0)
diff --git a/app/assets/javascripts/task_list.js b/app/assets/javascripts/task_list.js
index 3392cb9da29cac67eaacb2bef2feeeb697abed29..419c458ff3421ff7a7942b4f11f26fb7bc6a44b8 100644
--- a/app/assets/javascripts/task_list.js
+++ b/app/assets/javascripts/task_list.js
@@ -1,6 +1,6 @@
 /* global Flash */
 
-import 'vendor/task_list';
+import 'deckar01-task_list';
 
 class TaskList {
   constructor(options = {}) {
diff --git a/changelogs/unreleased/task-list-2.yml b/changelogs/unreleased/task-list-2.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cbae8178081531f1bf42fef1739fe1be332442bf
--- /dev/null
+++ b/changelogs/unreleased/task-list-2.yml
@@ -0,0 +1,4 @@
+---
+title: Update task_list to version 2.0.0
+merge_request: 11525
+author: Jared Deckard <jared.deckard@gmail.com>
diff --git a/package.json b/package.json
index 8e280e77d67bf015db41070ba1ac2dbfad3396d7..29165fd41828c6007a8f5f8c0fe7d06d87f534bf 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
     "core-js": "^2.4.1",
     "css-loader": "^0.28.0",
     "d3": "^3.5.11",
+    "deckar01-task_list": "^2.0.0",
     "document-register-element": "^1.3.0",
     "dropzone": "^4.2.0",
     "emoji-unicode-version": "^0.2.1",
diff --git a/spec/javascripts/merge_request_spec.js b/spec/javascripts/merge_request_spec.js
index 1173fa40947dae6211a4a567a3a30feb5250658a..f444bcaf8471643245117d50eded30418bb20bca 100644
--- a/spec/javascripts/merge_request_spec.js
+++ b/spec/javascripts/merge_request_spec.js
@@ -13,7 +13,9 @@ import '~/merge_request';
       });
       it('modifies the Markdown field', function() {
         spyOn(jQuery, 'ajax').and.stub();
-        $('input[type=checkbox]').attr('checked', true).trigger('change');
+        const changeEvent = document.createEvent('HTMLEvents');
+        changeEvent.initEvent('change', true, true);
+        $('input[type=checkbox]').attr('checked', true)[0].dispatchEvent(changeEvent);
         return expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
       });
       return it('submits an ajax request on tasklist:changed', function() {
diff --git a/spec/javascripts/notes_spec.js b/spec/javascripts/notes_spec.js
index 04cf0fe2bf8fb7c52047d08cb88122b7dcefe637..17aa70ff3f1bb3ecc16922befc285afeb1455438 100644
--- a/spec/javascripts/notes_spec.js
+++ b/spec/javascripts/notes_spec.js
@@ -34,7 +34,9 @@ import '~/notes';
       });
 
       it('modifies the Markdown field', function() {
-        $('input[type=checkbox]').attr('checked', true).trigger('change');
+        const changeEvent = document.createEvent('HTMLEvents');
+        changeEvent.initEvent('change', true, true);
+        $('input[type=checkbox]').attr('checked', true)[0].dispatchEvent(changeEvent);
         expect($('.js-task-list-field').val()).toBe('- [x] Task List Item');
       });
 
diff --git a/vendor/assets/javascripts/task_list.js b/vendor/assets/javascripts/task_list.js
deleted file mode 100644
index 9fbfef03f6d61ac874c4aa8ad286e55f6d1fa0eb..0000000000000000000000000000000000000000
--- a/vendor/assets/javascripts/task_list.js
+++ /dev/null
@@ -1,258 +0,0 @@
-// The MIT License (MIT)
-//
-// Copyright (c) 2014 GitHub, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all
-// copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-// SOFTWARE.
-// TaskList Behavior
-//
-/*= provides tasklist:enabled */
-/*= provides tasklist:disabled */
-/*= provides tasklist:change */
-/*= provides tasklist:changed */
-//
-//
-// Enables Task List update behavior.
-//
-// ### Example Markup
-//
-//   <div class="js-task-list-container">
-//     <ul class="task-list">
-//       <li class="task-list-item">
-//         <input type="checkbox" class="js-task-list-item-checkbox" disabled />
-//         text
-//       </li>
-//     </ul>
-//     <form>
-//       <textarea class="js-task-list-field">- [ ] text</textarea>
-//     </form>
-//   </div>
-//
-// ### Specification
-//
-// TaskLists MUST be contained in a `(div).js-task-list-container`.
-//
-// TaskList Items SHOULD be an a list (`UL`/`OL`) element.
-//
-// Task list items MUST match `(input).task-list-item-checkbox` and MUST be
-// `disabled` by default.
-//
-// TaskLists MUST have a `(textarea).js-task-list-field` form element whose
-// `value` attribute is the source (Markdown) to be udpated. The source MUST
-// follow the syntax guidelines.
-//
-// TaskList updates trigger `tasklist:change` events. If the change is
-// successful, `tasklist:changed` is fired. The change can be canceled.
-//
-// jQuery is required.
-//
-// ### Methods
-//
-// `.taskList('enable')` or `.taskList()`
-//
-// Enables TaskList updates for the container.
-//
-// `.taskList('disable')`
-//
-// Disables TaskList updates for the container.
-//
-//# ### Events
-//
-// `tasklist:enabled`
-//
-// Fired when the TaskList is enabled.
-//
-// * **Synchronicity** Sync
-// * **Bubbles** Yes
-// * **Cancelable** No
-// * **Target** `.js-task-list-container`
-//
-// `tasklist:disabled`
-//
-// Fired when the TaskList is disabled.
-//
-// * **Synchronicity** Sync
-// * **Bubbles** Yes
-// * **Cancelable** No
-// * **Target** `.js-task-list-container`
-//
-// `tasklist:change`
-//
-// Fired before the TaskList item change takes affect.
-//
-// * **Synchronicity** Sync
-// * **Bubbles** Yes
-// * **Cancelable** Yes
-// * **Target** `.js-task-list-field`
-//
-// `tasklist:changed`
-//
-// Fired once the TaskList item change has taken affect.
-//
-// * **Synchronicity** Sync
-// * **Bubbles** Yes
-// * **Cancelable** No
-// * **Target** `.js-task-list-field`
-//
-// ### NOTE
-//
-// Task list checkboxes are rendered as disabled by default because rendered
-// user content is cached without regard for the viewer.
-(function() {
-  var codeFencesPattern, complete, completePattern, disableTaskList, disableTaskLists, enableTaskList, enableTaskLists, escapePattern, incomplete, incompletePattern, itemPattern, itemsInParasPattern, updateTaskList, updateTaskListItem,
-    indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
-
-  incomplete = "[ ]";
-
-  complete = "[x]";
-
-  // Escapes the String for regular expression matching.
-  escapePattern = function(str) {
-    return str.replace(/([\[\]])/g, "\\$1").replace(/\s/, "\\s").replace("x", "[xX]");
-  };
-
-  incompletePattern = RegExp("" + (escapePattern(incomplete))); // escape square brackets
- // match all white space
-  completePattern = RegExp("" + (escapePattern(complete))); // match all cases
-
-  // Pattern used to identify all task list items.
-  // Useful when you need iterate over all items.
-  itemPattern = RegExp("^(?:\\s*(?:>\\s*)*(?:[-+*]|(?:\\d+\\.)))\\s*(" + (escapePattern(complete)) + "|" + (escapePattern(incomplete)) + ")\\s+(?!\\(.*?\\))(?=(?:\\[.*?\\]\\s*(?:\\[.*?\\]|\\(.*?\\))\\s*)*(?:[^\\[]|$))");
-
-  // prefix, consisting of
-  // optional leading whitespace
-  // zero or more blockquotes
-  // list item indicator
-  // optional whitespace prefix
-  // checkbox
-  // is followed by whitespace
-  // is not part of a [foo](url) link
-  // and is followed by zero or more links
-  // and either a non-link or the end of the string
-  // Used to filter out code fences from the source for comparison only.
-  // http://rubular.com/r/x5EwZVrloI
-  // Modified slightly due to issues with JS
-  codeFencesPattern = /^`{3}(?:\s*\w+)?[\S\s].*[\S\s]^`{3}$/mg;
-
-  // ```
-  // followed by optional language
-  // whitespace
-  // code
-  // whitespace
-  // ```
-  // Used to filter out potential mismatches (items not in lists).
-  // http://rubular.com/r/OInl6CiePy
-  itemsInParasPattern = RegExp("^(" + (escapePattern(complete)) + "|" + (escapePattern(incomplete)) + ").+$", "g");
-
-  // Given the source text, updates the appropriate task list item to match the
-  // given checked value.
-  //
-  // Returns the updated String text.
-  updateTaskListItem = function(source, itemIndex, checked) {
-    var clean, index, line, result;
-    clean = source.replace(/\r/g, '').replace(codeFencesPattern, '').replace(itemsInParasPattern, '').split("\n");
-    index = 0;
-    result = (function() {
-      var i, len, ref, results;
-      ref = source.split("\n");
-      results = [];
-      for (i = 0, len = ref.length; i < len; i++) {
-        line = ref[i];
-        if (indexOf.call(clean, line) >= 0 && line.match(itemPattern)) {
-          index += 1;
-          if (index === itemIndex) {
-            line = checked ? line.replace(incompletePattern, complete) : line.replace(completePattern, incomplete);
-          }
-        }
-        results.push(line);
-      }
-      return results;
-    })();
-    return result.join("\n");
-  };
-
-  // Updates the $field value to reflect the state of $item.
-  // Triggers the `tasklist:change` event before the value has changed, and fires
-  // a `tasklist:changed` event once the value has changed.
-  updateTaskList = function($item) {
-    var $container, $field, checked, event, index;
-    $container = $item.closest('.js-task-list-container');
-    $field = $container.find('.js-task-list-field');
-    index = 1 + $container.find('.task-list-item-checkbox').index($item);
-    checked = $item.prop('checked');
-    event = $.Event('tasklist:change');
-    $field.trigger(event, [index, checked]);
-    if (!event.isDefaultPrevented()) {
-      $field.val(updateTaskListItem($field.val(), index, checked));
-      $field.trigger('change');
-      return $field.trigger('tasklist:changed', [index, checked]);
-    }
-  };
-
-  // When the task list item checkbox is updated, submit the change
-  $(document).on('change', '.task-list-item-checkbox', function() {
-    return updateTaskList($(this));
-  });
-
-  // Enables TaskList item changes.
-  enableTaskList = function($container) {
-    if ($container.find('.js-task-list-field').length > 0) {
-      $container.find('.task-list-item').addClass('enabled').find('.task-list-item-checkbox').attr('disabled', null);
-      return $container.addClass('is-task-list-enabled').trigger('tasklist:enabled');
-    }
-  };
-
-  // Enables a collection of TaskList containers.
-  enableTaskLists = function($containers) {
-    var container, i, len, results;
-    results = [];
-    for (i = 0, len = $containers.length; i < len; i++) {
-      container = $containers[i];
-      results.push(enableTaskList($(container)));
-    }
-    return results;
-  };
-
-  // Disable TaskList item changes.
-  disableTaskList = function($container) {
-    $container.find('.task-list-item').removeClass('enabled').find('.task-list-item-checkbox').attr('disabled', 'disabled');
-    return $container.removeClass('is-task-list-enabled').trigger('tasklist:disabled');
-  };
-
-  // Disables a collection of TaskList containers.
-  disableTaskLists = function($containers) {
-    var container, i, len, results;
-    results = [];
-    for (i = 0, len = $containers.length; i < len; i++) {
-      container = $containers[i];
-      results.push(disableTaskList($(container)));
-    }
-    return results;
-  };
-
-  $.fn.taskList = function(method) {
-    var $container, methods;
-    $container = $(this).closest('.js-task-list-container');
-    methods = {
-      enable: enableTaskLists,
-      disable: disableTaskLists
-    };
-    return methods[method || 'enable']($container);
-  };
-
-}).call(this);
diff --git a/yarn.lock b/yarn.lock
index 8221711960df0ad3317c6129f0ac41994c7f2b5f..1db64aead8d129972505fb55d1ff9d6fc58b99ab 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1570,6 +1570,10 @@ decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2:
   version "1.2.0"
   resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
 
+deckar01-task_list@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/deckar01-task_list/-/deckar01-task_list-2.0.0.tgz#7f7a595430d21b3036ed5dfbf97d6b65de18e2c9"
+
 deep-extend@~0.4.0:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253"