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 873cd8781ef0c4ec5c34f78696f10185ab646acd..0e075097d6ee68871a243c72430d20bba597e46d 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)
@@ -896,7 +894,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..cb8e2f4d1abca15eaded15260adeaf5ffaaff69a 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';
+require('deckar01-task_list');
 
 class TaskList {
   constructor(options = {}) {
diff --git a/package.json b/package.json
index 800327d8a08c5871fad0fce9c106cab0eeb9932c..448fe6287e344e60fc494e4547a36f8320be65fc 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/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 8aac2b1b1cd72004c07a39d9dcbee72b1b070109..bd25b7b987fcca40e87a0a3024f3166e384b8e19 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1564,6 +1564,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"