diff --git a/core/modules/field/field.api.php b/core/modules/field/field.api.php
index 22a9ed7..386a002 100644
--- a/core/modules/field/field.api.php
+++ b/core/modules/field/field.api.php
@@ -455,7 +455,7 @@ function hook_field_presave($entity_type, $entity, $field, $instance, $langcode,
  * @see hook_field_delete()
  */
 function hook_field_insert($entity_type, $entity, $field, $instance, $langcode, &$items) {
-  if (variable_get('taxonomy_maintain_index_table', TRUE) && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node' && $entity->status) {
+  if (config('taxonomy.settings')->get('maintain_index_table') && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node' && $entity->status) {
     $query = db_insert('taxonomy_index')->fields(array('nid', 'tid', 'sticky', 'created', ));
     foreach ($items as $item) {
       $query->values(array(
@@ -496,7 +496,7 @@ function hook_field_insert($entity_type, $entity, $field, $instance, $langcode,
  * @see hook_field_delete()
  */
 function hook_field_update($entity_type, $entity, $field, $instance, $langcode, &$items) {
-  if (variable_get('taxonomy_maintain_index_table', TRUE) && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node') {
+  if (config('taxonomy.settings')->get('maintain_index_table') && $field['storage']['type'] == 'field_sql_storage' && $entity_type == 'node') {
     $first_call = &drupal_static(__FUNCTION__, array());
 
     // We don't maintain data for old revisions, so clear all previous values
diff --git a/core/modules/taxonomy/config/taxonomy.settings.yml b/core/modules/taxonomy/config/taxonomy.settings.yml
new file mode 100644
index 0000000..2c0b5ab
--- /dev/null
+++ b/core/modules/taxonomy/config/taxonomy.settings.yml
@@ -0,0 +1,3 @@
+override_selector: false
+terms_per_page_count: 100
+maintain_index_table: true
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
index f81b9e5..d3e57ae 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermFormController.php
@@ -64,10 +64,10 @@ public function form(array $form, array &$form_state, EntityInterface $term) {
     );
 
     // taxonomy_get_tree and taxonomy_term_load_parents may contain large numbers of
-    // items so we check for taxonomy_override_selector before loading the
+    // items so we check for taxonomy.settings:override_selector before loading the
     // full vocabulary. Contrib modules can then intercept before
     // hook_form_alter to provide scalable alternatives.
-    if (!variable_get('taxonomy_override_selector', FALSE)) {
+    if (!config('taxonomy.settings')->get('override_selector')) {
       $parent = array_keys(taxonomy_term_load_parents($term->tid));
       $children = taxonomy_get_tree($vocabulary->vid, $term->tid);
 
diff --git a/core/modules/taxonomy/taxonomy.admin.inc b/core/modules/taxonomy/taxonomy.admin.inc
index 3847ebf..49e1e85 100644
--- a/core/modules/taxonomy/taxonomy.admin.inc
+++ b/core/modules/taxonomy/taxonomy.admin.inc
@@ -151,7 +151,7 @@ function taxonomy_overview_terms($form, &$form_state, Vocabulary $vocabulary) {
   $form['#parent_fields'] = FALSE;
 
   $page            = isset($_GET['page']) ? $_GET['page'] : 0;
-  $page_increment  = variable_get('taxonomy_terms_per_page_admin', 100);  // Number of terms per page.
+  $page_increment  = config('taxonomy.settings')->get('terms_per_page_count');
   $page_entries    = 0;   // Elements shown on this page.
   $before_entries  = 0;   // Elements at the root level before this page.
   $after_entries   = 0;   // Elements at the root level after this page.
diff --git a/core/modules/taxonomy/taxonomy.install b/core/modules/taxonomy/taxonomy.install
index 25d2c06..f959d65 100644
--- a/core/modules/taxonomy/taxonomy.install
+++ b/core/modules/taxonomy/taxonomy.install
@@ -9,9 +9,6 @@
  * Implements hook_uninstall().
  */
 function taxonomy_uninstall() {
-  // Remove variables.
-  variable_del('taxonomy_override_selector');
-  variable_del('taxonomy_terms_per_page_admin');
   // Remove taxonomy_term bundles.
   $vocabularies = db_query("SELECT machine_name FROM {taxonomy_vocabulary}")->fetchCol();
   foreach ($vocabularies as $vocabulary) {
@@ -349,3 +346,15 @@ function taxonomy_update_8003(&$sandbox) {
 
   $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);
 }
+
+/**
+ * Moves taxonomy settings from variable to config.
+ */
+function taxonomy_update_8004() {
+  update_variables_to_config('taxonomy.settings', array(
+    'taxonomy_override_selector' => 'override_selector',
+    'taxonomy_terms_per_page_admin' => 'terms_per_page_count',
+    'taxonomy_maintain_index_table' => 'maintain_index_table',
+  ));
+}
+
diff --git a/core/modules/taxonomy/taxonomy.module b/core/modules/taxonomy/taxonomy.module
index 75573a9..894fec1 100644
--- a/core/modules/taxonomy/taxonomy.module
+++ b/core/modules/taxonomy/taxonomy.module
@@ -185,7 +185,7 @@ function taxonomy_field_extra_fields() {
  *   An array of nids matching the query.
  */
 function taxonomy_select_nodes($tid, $pager = TRUE, $limit = FALSE, $order = array('t.sticky' => 'DESC', 't.created' => 'DESC')) {
-  if (!variable_get('taxonomy_maintain_index_table', TRUE)) {
+  if (!config('taxonomy.settings')->get('maintain_index_table')) {
     return array();
   }
   $query = db_select('taxonomy_index', 't');
@@ -1388,7 +1388,7 @@ function taxonomy_rdf_mapping() {
  * published nodes and common sort criteria such as sticky and created.
  * This is used as a lookup table by taxonomy_select_nodes(). When using other
  * field storage engines or alternative methods of denormalizing this data
- * you should set the variable 'taxonomy_maintain_index_table' to FALSE
+ * you should set the config setting 'maintain_index_table' to false
  * to avoid unnecessary writes in SQL.
  */
 
@@ -1430,7 +1430,7 @@ function taxonomy_build_node_index($node) {
   // We maintain a denormalized table of term/node relationships, containing
   // only data for current, published nodes.
   $status = NULL;
-  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+  if (config('taxonomy.settings')->get('maintain_index_table')) {
     // If a node property is not set in the node object when node_save() is
     // called, the old value from $node->original is used.
     if (!empty($node->original)) {
@@ -1510,7 +1510,7 @@ function taxonomy_node_predelete(Node $node) {
  *   The node entity.
  */
 function taxonomy_delete_node_index(Node $node) {
-  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+  if (config('taxonomy.settings')->get('maintain_index_table')) {
     db_delete('taxonomy_index')->condition('nid', $node->nid)->execute();
   }
 }
@@ -1519,7 +1519,7 @@ function taxonomy_delete_node_index(Node $node) {
  * Implements hook_taxonomy_term_delete().
  */
 function taxonomy_taxonomy_term_delete(Term $term) {
-  if (variable_get('taxonomy_maintain_index_table', TRUE)) {
+  if (config('taxonomy.settings')->get('maintain_index_table')) {
     // Clean up the {taxonomy_index} table when terms are deleted.
     db_delete('taxonomy_index')->condition('tid', $term->tid)->execute();
   }
