diff --git a/config/devel_a11y.settings.yml b/config/devel_a11y.settings.yml
deleted file mode 100644
index f35d8c5..0000000
--- a/config/devel_a11y.settings.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-aural:
-  announce:
-    log: '1'
-keyboard:
-  tabbingmanager:
-    log: '1'
-    visualize: '1'
diff --git a/config/install/devel_a11y.settings.yml b/config/install/devel_a11y.settings.yml
new file mode 100644
index 0000000..daea4ee
--- /dev/null
+++ b/config/install/devel_a11y.settings.yml
@@ -0,0 +1,7 @@
+aural:
+  announce:
+    log: true
+keyboard:
+  tabbingmanager:
+    log: true
+    visualize: true
diff --git a/config/schema/devel_a11y.schema.yml b/config/schema/devel_a11y.schema.yml
new file mode 100644
index 0000000..95762b2
--- /dev/null
+++ b/config/schema/devel_a11y.schema.yml
@@ -0,0 +1,31 @@
+# Config schema for devel_ally.settings
+
+devel_a11y.settings:
+  type: mapping
+  label: ''
+  mapping:
+    aural:
+      type: mapping
+      label: ''
+      mapping:
+        announce:
+          type: mapping
+          label: ''
+          mapping:
+          log:
+            type: boolean
+            label: ''
+    keyboard:
+      type: mapping
+      label: ''
+      mapping:
+        tabbingmanager:
+          type: mapping
+          label: ''
+          mapping:
+          log:
+            type: boolean
+            label: ''
+          visualize:
+            type: boolean
+            label: ''
diff --git a/devel_a11y.info.yml b/devel_a11y.info.yml
index 5c77115..3a130b5 100644
--- a/devel_a11y.info.yml
+++ b/devel_a11y.info.yml
@@ -2,9 +2,7 @@ name: Devel accessibility
 type: module
 description: 'Extends the Devel module to simplify testing of accessibility.'
 package: Development
-core: 8.x
-configure: admin/config/development/devel/a11y
 dependencies:
   - devel
-tags:
- - developer
+core: 8.x
+configure: devel_a11y.settings
diff --git a/devel_a11y.libraries.yml b/devel_a11y.libraries.yml
new file mode 100644
index 0000000..2d53f1f
--- /dev/null
+++ b/devel_a11y.libraries.yml
@@ -0,0 +1,24 @@
+announce.log:
+  version: VERSION
+  js:
+    js/announce.log.js: {}
+  dependencies:
+    - core/drupal.announce
+
+tabbingmanager.log:
+  version: VERSION
+  js:
+    js/tabbingmanager.log.js: {}
+  dependencies:
+    - core/drupal.tabbingmanager
+
+tabbingmanager.visualize:
+  version: VERSION
+  js:
+    js/tabbingmanager.log.js: {}
+    js/tabbingmanager.visualize.js: {}
+  css:
+    theme:
+      css/tabbingmanager.visualize.css: {}
+  dependencies:
+    - core/drupal.tabbingmanager
diff --git a/devel_a11y.module b/devel_a11y.module
index 6d89cf8..cd8e413 100644
--- a/devel_a11y.module
+++ b/devel_a11y.module
@@ -7,66 +7,23 @@
 
 
  /**
- * Implements hook_page_alter().
+ * Implements hook_page_attachments().
  *
  * Dynamically attaches devel_a11y's overrides depending on its configuration.
  */
-function devel_a11y_page_alter(&$page) {
-  if (!user_access('access devel information')) {
+function devel_a11y_page_attachments(array &$attachments) {
+  if (!\Drupal::currentUser()->hasPermission('access devel information')) {
     return;
   }
 
-  $config = config('devel_a11y.settings');
+  $config = \Drupal::config('devel_a11y.settings');
   if ($config->get('aural.announce.log')) {
-    $page['#attached']['library'][] = array('devel_a11y', 'announce.log');
+    $attachments['#attached']['library'][] = 'devel_a11y/announce.log';
   }
   if ($config->get('keyboard.tabbingmanager.log')) {
-    $page['#attached']['library'][] = array('devel_a11y', 'tabbingmanager.log');
+    $attachments['#attached']['library'][] = 'devel_a11y/tabbingmanager.log';
   }
   if ($config->get('keyboard.tabbingmanager.visualize')) {
-    $page['#attached']['library'][] = array('devel_a11y', 'tabbingmanager.visualize');
+    $attachments['#attached']['library'][] = 'devel_a11y/tabbingmanager.visualize';
   }
 }
-
-/**
- * Implements hook_library_info().
- */
-function devel_a11y_library_info() {
-  $path = drupal_get_path('module', 'devel_a11y');
-  $libraries['announce.log'] = array(
-    'title' => 'Devel accessibility log Drupal.announce',
-    'version' => \Drupal::VERSION,
-    'js' => array(
-      $path . '/js/announce.log.js',
-    ),
-    'dependencies' => array(
-      array('system', 'drupal.announce'),
-    )
-  );
-  $libraries['tabbingmanager.log'] = array(
-    'title' => 'Devel accessibility log Drupal.TabbingManager',
-    'version' => \Drupal::VERSION,
-    'js' => array(
-      $path . '/js/tabbingmanager.log.js',
-    ),
-    'dependencies' => array(
-      array('system', 'jquery'),
-      array('system', 'drupal.tabbingmanager'),
-    )
-  );
-  $libraries['tabbingmanager.visualize'] = array(
-    'title' => 'Devel accessibility visualize Drupal.TabbingManager',
-    'version' => \Drupal::VERSION,
-    'js' => array(
-      $path . '/js/tabbingmanager.visualize.js',
-    ),
-    'css' => array(
-      $path . '/css/tabbingmanager.visualize.css',
-    ),
-    'dependencies' => array(
-      array('system', 'jquery'),
-      array('system', 'drupal.tabbingmanager'),
-    )
-  );
-  return $libraries;
-}
diff --git a/devel_a11y.routing.yml b/devel_a11y.routing.yml
index aef9661..2c2385c 100644
--- a/devel_a11y.routing.yml
+++ b/devel_a11y.routing.yml
@@ -1,6 +1,6 @@
-devel_a11y_settings:
-  pattern: 'admin/config/development/devel/a11y'
+devel_a11y.settings:
+  path: '/admin/config/development/devel/a11y'
   defaults:
-    _form: 'Drupal\devel_a11y\Form\Settings'
+    _form: '\Drupal\devel_a11y\Form\Settings'
   requirements:
     _permission: 'access devel information'
diff --git a/lib/Drupal/devel_a11y/Form/Settings.php b/lib/Drupal/devel_a11y/Form/Settings.php
deleted file mode 100644
index a87739a..0000000
--- a/lib/Drupal/devel_a11y/Form/Settings.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * @file
- * Contains \Drupal\devel_a11y\Form\Settings.
- */
-
-namespace Drupal\devel_a11y\Form;
-
-use Drupal\system\SystemConfigFormBase;
-
-/**
- * Configure devel accessibility settings for this site.
- */
-class Settings extends SystemConfigFormBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFormID() {
-    return 'devel_a11y_settings_form';
-  }
-
-  /**
-   * {@inheritdoc}.
-   */
-  public function buildForm(array $form, array &$form_state) {
-    $config = $this->configFactory->get('devel_a11y.settings');
-    $form['aural'] = array(
-      '#type' => 'details',
-      '#tree' => TRUE,
-      '#title' => t('Aural accessibility (screen readers)'),
-    );
-    $form['aural']['announce']['log'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Log announcements (ARIA live regions)'),
-      '#description' => t('Overrides <code>Drupal.announce()</code> to not only announce UI changes via ARIA live regions, but to also log these aural announcements to the browser console.'),
-      '#default_value' => $config->get('aural.announce.log'),
-    );
-
-    $form['keyboard'] = array(
-      '#type' => 'details',
-      '#tree' => TRUE,
-      '#title' => t('Keyboard accessibility'),
-    );
-    $form['keyboard']['tabbingmanager']['log'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Log tabbing manager'),
-      '#description' => t('Logs when tabbing is constrained.'),
-      '#default_value' => $config->get('keyboard.tabbingmanager.visualize'),
-    );
-    $form['keyboard']['tabbingmanager']['visualize'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Visualize tabbing manager'),
-      '#description' => t('Visually indicates which elements are reachable when the tabbing manager is active.'),
-      '#default_value' => $config->get('keyboard.tabbingmanager.visualize'),
-    );
-
-    return parent::buildForm($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, array &$form_state) {
-    $this->configFactory->get('devel_a11y.settings')
-      ->set('aural.announce.log', $form_state['values']['aural']['announce']['log'])
-      ->set('keyboard.tabbingmanager.log', $form_state['values']['keyboard']['tabbingmanager']['log'])
-      ->set('keyboard.tabbingmanager.visualize', $form_state['values']['keyboard']['tabbingmanager']['visualize'])
-      ->save();
-
-    parent::submitForm($form, $form_state);
-  }
-
-}
diff --git a/src/Form/Settings.php b/src/Form/Settings.php
new file mode 100644
index 0000000..f994f82
--- /dev/null
+++ b/src/Form/Settings.php
@@ -0,0 +1,86 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\devel_a11y\Form\Settings.
+ */
+
+namespace Drupal\devel_a11y\Form;
+
+use Drupal\Core\Form\ConfigFormBase;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Configure devel accessibility settings for this site.
+ */
+class Settings extends ConfigFormBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormID() {
+    return 'devel_a11y_settings_form';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function getEditableConfigNames() {
+    return [
+      'devel_a11y.settings',
+    ];
+  }
+
+  /**
+   * {@inheritdoc}.
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $config = $this->config('devel_a11y.settings');
+    $form['aural'] = array(
+      '#type' => 'details',
+      '#tree' => TRUE,
+      '#title' => t('Aural accessibility (screen readers)'),
+      '#open' => TRUE,
+    );
+    $form['aural']['announce']['log'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Log announcements (ARIA live regions)'),
+      '#description' => t('Overrides <code>Drupal.announce()</code> to not only announce UI changes via ARIA live regions, but to also log these aural announcements to the browser console.'),
+      '#default_value' => (int) $config->get('aural.announce.log'),
+    );
+
+    $form['keyboard'] = array(
+      '#type' => 'details',
+      '#tree' => TRUE,
+      '#title' => t('Keyboard accessibility'),
+      '#open' => TRUE,
+    );
+    $form['keyboard']['tabbingmanager']['log'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Log tabbing manager'),
+      '#description' => t('Logs when tabbing is constrained.'),
+      '#default_value' => (int) $config->get('keyboard.tabbingmanager.visualize'),
+    );
+    $form['keyboard']['tabbingmanager']['visualize'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Visualize tabbing manager'),
+      '#description' => t('Visually indicates which elements are reachable when the tabbing manager is active.'),
+      '#default_value' => (int) $config->get('keyboard.tabbingmanager.visualize'),
+    );
+    return parent::buildForm($form, $form_state);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $this->config('devel_a11y.settings')
+      ->set('aural.announce.log', (boolean) $form_state->getValue(['aural', 'announce', 'log']))
+      ->set('keyboard.tabbingmanager.log', (boolean) $form_state->getValue(['keyboard', 'tabbingmanager', 'log']))
+      ->set('keyboard.tabbingmanager.visualize', (boolean) $form_state->getValue(['keyboard', 'tabbingmanager', 'visualize']))
+      ->save();
+
+    parent::submitForm($form, $form_state);
+  }
+
+}
