diff --git a/access_filter.routing.yml b/access_filter.routing.yml
index dd227e7..89c56e8 100644
--- a/access_filter.routing.yml
+++ b/access_filter.routing.yml
@@ -1,7 +1,7 @@
 entity.access_filter.collection:
   path: '/admin/config/people/access_filter'
   defaults:
-    _form: '\Drupal\access_filter\Form\Overview'
+    _entity_list: 'access_filter'
     _title: 'Access filters'
   requirements:
     _permission: 'manage access filters'
diff --git a/css/access_filter.css b/css/access_filter.css
index c1f2ce0..edb6798 100644
--- a/css/access_filter.css
+++ b/css/access_filter.css
@@ -1,19 +1,19 @@
 @charset "UTF-8";
 
-#filters .disabled {
+#edit-entities .disabled {
   background: #dddddd;
 }
 
-#filters ul {
+#edit-entities ul {
   margin: 0;
   padding: 0 0 0 1em;
 }
 
-#filters ul ul {
+#edit-entities ul ul {
   list-style-type: '» ';
 }
 
-#filters .regex {
+#edit-entities .regex {
   margin-left: 0.5em;
   color: #0f74a8;
 }
diff --git a/src/Controller/AccessFilterListBuilder.php b/src/Controller/AccessFilterListBuilder.php
new file mode 100644
index 0000000..dfb1024
--- /dev/null
+++ b/src/Controller/AccessFilterListBuilder.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Drupal\access_filter\Controller;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Config\Entity\DraggableListBuilder;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Component\Utility\Html;
+
+/**
+ * Provides filter config entity list builder.
+ */
+class AccessFilterListBuilder extends DraggableListBuilder {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'access_filter_overview';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildHeader() {
+    $header['ID'] = $this->t('ID');
+    $header['name'] = $this->t('Name');
+    $header['conditions'] = $this->t('Conditions');
+    $header['rules'] = $this->t('Rules');
+    $header['response'] = $this->t('Response');
+    $header['weight'] = $this->t('Weight');
+    $header['operations'] = $this->t('Operations');
+
+    return $header + parent::buildHeader();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildRow(EntityInterface $entity) {
+    /** @var \Drupal\access_filter\Entity\Filter $entity */
+    $entity->parse();
+
+    $classes = [];
+    if ($entity->status() === FALSE) {
+      $row['#attributes']['class'] = ['disabled', 'draggable'];
+    }
+
+    $row['id']['#plain_text'] = $entity->id();
+    $row['label'] = $entity->label();
+
+    $conditions = [];
+    foreach ($entity->parsedConditions as $condition) {
+      $item = $this->t('@type: @summary', [
+        '@type' => $condition->getPluginId(),
+        '@summary' => $condition->summary(),
+      ]);
+      $conditions[] = ['#markup' => Html::decodeEntities($item)];
+    }
+    $row['conditions'] = [
+      '#theme' => 'item_list',
+      '#items' => $conditions,
+    ];
+
+    $rules = [];
+    foreach ($entity->parsedRules as $rule) {
+      $item = $this->t('@type: @summary', [
+        '@type' => $rule->getPluginId(),
+        '@summary' => $rule->summary(),
+      ]);
+      $rules[] = ['#markup' =>  Html::decodeEntities($item)];
+    }
+    $row['rules'] = [
+      '#theme' => 'item_list',
+      '#items' => $rules,
+    ];
+
+    $row['response']['#plain_text'] = $entity->parsedResponse['code'];
+
+    return $row + parent::buildRow($entity);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function render() {
+    $entities = $this->load();
+    $build = parent::render();
+    $build['table']['#empty'] = t('No filters available.');
+
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildForm($form, $form_state);
+    $form['#attached']['library'][] = 'access_filter/common';
+    $form['actions']['submit']['#value'] = t('Save');
+
+    return $form;
+  }
+
+}
diff --git a/src/Entity/Filter.php b/src/Entity/Filter.php
index e4d9c01..a40df0b 100644
--- a/src/Entity/Filter.php
+++ b/src/Entity/Filter.php
@@ -17,7 +17,8 @@ use Symfony\Component\Yaml\Parser;
  *     "form" = {
  *       "default" = "Drupal\access_filter\Form\EditForm",
  *       "delete" = "Drupal\access_filter\Form\DeleteForm",
- *     }
+ *     },
+ *     "list_builder" = "Drupal\access_filter\Controller\AccessFilterListBuilder",
  *   },
  *   config_prefix = "filter",
  *   admin_permission = "manage access filters",
diff --git a/src/Form/Overview.php b/src/Form/Overview.php
deleted file mode 100644
index cd71711..0000000
--- a/src/Form/Overview.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-namespace Drupal\access_filter\Form;
-
-use Drupal\Component\Utility\Html;
-use Drupal\Core\Form\FormBase;
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Site\Settings;
-use Drupal\Core\Url;
-use Drupal\access_filter\Entity\Filter;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Provides filter overview form.
- */
-class Overview extends FormBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getFormId() {
-    return 'access_filter_overview';
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function buildForm(array $form, FormStateInterface $form_state) {
-    if (Settings::get('access_filter_disabled')) {
-      drupal_set_message($this->t('Access control is currently disabled in settings.php.'), 'warning');
-    }
-
-    $form['filters'] = [
-      '#type' => 'table',
-      '#attributes' => ['id' => 'filters'],
-      '#header' => [
-        $this->t('ID'),
-        $this->t('Name'),
-        $this->t('Conditions'),
-        $this->t('Rules'),
-        $this->t('Response'),
-        $this->t('Weight'),
-        $this->t('Operations'),
-      ],
-      '#empty' => $this->t('No filters available.'),
-    ];
-
-    $destination = $this->getDestinationArray();
-
-    $filters = Filter::loadMultiple();
-    $form_state->set('filters', $filters);
-
-    foreach ($filters as $filter) {
-      $filter->parse();
-
-      $classes = ['draggable'];
-      if (!$filter->status()) {
-        $classes[] = 'disabled';
-      }
-
-      $row = [
-        '#attributes' => ['class' => $classes],
-      ];
-
-      $row['id'] = [
-        '#markup' => $filter->id,
-      ];
-      $row['name'] = [
-        '#markup' => Html::escape($filter->name),
-      ];
-
-      $conditions_summary = '<ul>';
-      foreach ($filter->parsedConditions as $condition) {
-        $conditions_summary .= '<li>' . $condition->getPluginId() . ': ' . $condition->summary() . '</li>';
-      }
-      $conditions_summary .= '</ul>';
-      $row['conditions'] = [
-        '#type' => 'markup',
-        '#markup' => $conditions_summary,
-      ];
-
-      $rules_summary = '<ul>';
-      foreach ($filter->parsedRules as $rule) {
-        $rules_summary .= '<li>' . $rule->getPluginId() . ': ' . $rule->summary() . '</li>';
-      }
-      $rules_summary .= '</ul>';
-      $row['rules'] = [
-        '#type' => 'markup',
-        '#markup' => $rules_summary,
-      ];
-
-      $row['response'] = [
-        '#markup' => Html::escape($filter->parsedResponse['code']),
-      ];
-
-      $operations = [];
-      $operations['edit'] = [
-        'title' => $this->t('Edit'),
-        'query' => $destination,
-        'url' => Url::fromRoute('entity.access_filter.edit_form', ['access_filter' => $filter->id]),
-      ];
-      $operations['delete'] = [
-        'title' => $this->t('Delete'),
-        'query' => $destination,
-        'url' => Url::fromRoute('entity.access_filter.delete_form', ['access_filter' => $filter->id]),
-      ];
-
-      $row['weight'] = [
-        '#type' => 'weight',
-        '#title' => $this->t('Weight for filter.'),
-        '#title_display' => 'invisible',
-        '#delta' => 20,
-        '#attributes' => [
-          'class' => ['filter-weight'],
-        ],
-        '#default_value' => $filter->weight,
-      ];
-
-      $row['operations'] = [
-        '#type' => 'operations',
-        '#links' => $operations,
-      ];
-
-      $form['filters'][$filter->id] = $row;
-    }
-
-    $form['filters']['#tabledrag'][] = [
-      'action' => 'order',
-      'relationship' => 'sibling',
-      'group' => 'filter-weight',
-    ];
-
-    $form['actions']['save'] = [
-      '#type' => 'submit',
-      '#value' => $this->t('Save'),
-    ];
-
-    $form['#attached']['library'][] = 'access_filter/common';
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    /* @var Filter[] $filters */
-    $filters = $form_state->get('filters');
-    /* @var Filter[] $changed_filters */
-    $changed_filters = [];
-    $values = $form_state->getValue('filters');
-    foreach ($values as $fid => $value) {
-      if ($filters[$fid]->weight != $value) {
-        $filters[$fid]->weight = $value['weight'];
-        $changed_filters[] = $filters[$fid];
-      }
-    }
-
-    foreach ($changed_filters as $filter) {
-      $filter->save();
-    }
-  }
-
-}
