diff --git a/help_topics.services.yml b/help_topics.services.yml
index 230b8b9..723aefa 100644
--- a/help_topics.services.yml
+++ b/help_topics.services.yml
@@ -5,5 +5,5 @@ services:
     tags:
       - { name: breadcrumb_builder, priority: 900 }
   plugin.manager.help_topic:
-    class: Drupal\help_topics\Plugin\HelpTopicPluginManager
+    class: Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginManager
     arguments: ['@module_handler', '@cache.discovery']
diff --git a/help_topics.tokens.inc b/help_topics.tokens.inc
index f8206a9..b765967 100644
--- a/help_topics.tokens.inc
+++ b/help_topics.tokens.inc
@@ -50,6 +50,8 @@ function help_topics_token_info() {
 function help_topics_tokens($type, $tokens, array $data, array $options, BubbleableMetadata $bubbleable_metadata) {
   $replacements = [];
   $token_service = \Drupal::token();
+  /** @var \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginManagerInterface $plugin_manager */
+  $plugin_manager = \Drupal::get('plugin.manager.help_topic');
 
   // Our tokens generate URLs, which depend on language. See if a language is
   // passed in; if not, we will let the URL system use its own defaults.
@@ -65,8 +67,9 @@ function help_topics_tokens($type, $tokens, array $data, array $options, Bubblea
   if ($type == 'help_topic') {
     $topics = $token_service->findWithPrefix($tokens, 'url');
     foreach ($topics as $name => $original) {
-      if ($topic = HelpTopic::load($name)) {
-        $url = $topic->toUrl('canonical', $url_options)->toString(TRUE);
+      /** @var \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginInterface $topic */
+      if ($topic = $plugin_manager->getInstance(['id' => $name])) {
+        $url = $topic->toUrl($url_options)->toString(TRUE);
         $replacements[$original] = $url->getGeneratedUrl();
         $bubbleable_metadata
           ->addCacheableDependency($url)
diff --git a/src/Plugin/HelpSection/ConfigHelpSection.php b/src/Plugin/HelpSection/ConfigHelpSection.php
deleted file mode 100644
index b1e675a..0000000
--- a/src/Plugin/HelpSection/ConfigHelpSection.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace Drupal\help_topics\Plugin\HelpSection;
-
-use Drupal\help_topics\Entity\HelpTopic;
-use Drupal\Core\Entity\EntityTypeManagerInterface;
-use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
-use Drupal\help\Plugin\HelpSection\HelpSectionPluginBase;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Provides the configurable help topics list section for the help page.
- *
- * @HelpSection(
- *   id = "help_topics",
- *   title = @Translation("Configured topics"),
- *   description = @Translation("Configured topics can be provided by modules, themes, installation profiles, or site administrators, and they may be organized hierarchically. Top-level help topics configured on your site:"),
- *   permission = "view help topics"
- * )
- */
-class ConfigHelpSection extends HelpSectionPluginBase implements ContainerFactoryPluginInterface {
-
-  /**
-   * The entity type manager.
-   *
-   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
-   */
-  protected $entityTypeManager;
-
-  /**
-   * Constructs a HookHelpSection object.
-   *
-   * @param array $configuration
-   *   A configuration array containing information about the plugin instance.
-   * @param string $plugin_id
-   *   The plugin_id for the plugin instance.
-   * @param mixed $plugin_definition
-   *   The plugin implementation definition.
-   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
-   *   The entity manager service.
-   */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, EntityTypeManagerInterface $entity_type_manager) {
-    parent::__construct($configuration, $plugin_id, $plugin_definition);
-    $this->entityTypeManager = $entity_type_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
-    return new static(
-      $configuration,
-      $plugin_id,
-      $plugin_definition,
-      $container->get('entity_type.manager')
-    );
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheTags() {
-    // The list of topics depends on the list cache tag for the topic entity.
-    return $this->entityTypeManager->getDefinition('help_topic')->getListCacheTags();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheContexts() {
-    // The links are checked for user access, so we need the user permissions
-    // context.
-    return ['user.permissions'];
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function listTopics() {
-    /** @var \Drupal\Core\Entity\EntityStorageInterface $tour_storage */
-    $help_storage = $this->entityTypeManager->getStorage('help_topic');
-    /** @var \Drupal\help_topics\Entity\HelpTopic[] $entities */
-    $entities = $help_storage->loadMultiple();
-    uasort($entities, [HelpTopic::class, 'sort']);
-
-    $topics = [];
-    foreach ($entities as $entity) {
-      if ($entity->isTopLevel() && $entity->access('view')) {
-        $topics[$entity->id()] = $entity->toLink();
-      }
-    }
-
-    return $topics;
-  }
-
-}
diff --git a/src/Plugin/HelpSection/HelpTopicSection.php b/src/Plugin/HelpSection/HelpTopicSection.php
new file mode 100644
index 0000000..5db8f14
--- /dev/null
+++ b/src/Plugin/HelpSection/HelpTopicSection.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Drupal\help_topics\Plugin\HelpSection;
+
+use Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginInterface;
+use Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\help\Plugin\HelpSection\HelpSectionPluginBase;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides the help topics list section for the help page.
+ *
+ * @HelpSection(
+ *   id = "help_topics",
+ *   title = @Translation("Topics"),
+ *   description = @Translation("Topics can be provided by modules, themes, installation profiles, or site administrators, and they may be organized hierarchically. Top-level help topics configured on your site:"),
+ *   permission = "view help topics"
+ * )
+ */
+class HelpTopicSection extends HelpSectionPluginBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The plugin manager.
+   *
+   * @var \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginManagerInterface
+   */
+  protected $pluginManager;
+
+  /**
+   * Constructs a HelpTopicSection object.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginManagerInterface $plugin_manager
+   *   The help topic plugin manager service.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, HelpTopicPluginManagerInterface $plugin_manager) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->pluginManager = $plugin_manager;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.help_topic')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheTags() {
+    return $this->pluginManager->getCacheTags();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheContexts() {
+    // The links are checked for user access, so we need the user permissions
+    // context.
+    return ['user.permissions'];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function listTopics() {
+    /** @var \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginInterface[] $plugins */
+    $plugins = $this->pluginManager->getTopLevelTopics();
+
+    $topics = [];
+    foreach ($plugins as $plugin) {
+      $topics[$plugin->getPluginId()] = $plugin->toLink();
+    }
+
+    return $topics;
+  }
+
+}
diff --git a/src/Plugin/HelpTopic/HelpTopicPluginInterface.php b/src/Plugin/HelpTopic/HelpTopicPluginInterface.php
index ead483f..dedb0ae 100644
--- a/src/Plugin/HelpTopic/HelpTopicPluginInterface.php
+++ b/src/Plugin/HelpTopic/HelpTopicPluginInterface.php
@@ -59,4 +59,34 @@ interface HelpTopicPluginInterface extends PluginInspectionInterface, Derivative
    *   Array of the IDs of topics that should list this one as "related".
    */
   public function getListOn();
+
+  /**
+   * Returns the URL for viewing the help topic.
+   *
+   * @param array $options
+   *   (optional) See
+   *   \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for the
+   *    available options.
+   *
+   * @return \Drupal\Core\Url
+   *   A URL object containing the URL for viewing the help topic.
+   */
+  public function toUrl(array $options = []);
+
+  /**
+   * Returns a link for viewing the help topic.
+   *
+   * @param string|null $text
+   *   (optional) Link text to use for the link. If NULL, defaults to the
+   *   topic title.
+   * @param array $options
+   *   (optional) See
+   *   \Drupal\Core\Routing\UrlGeneratorInterface::generateFromRoute() for the
+   *    available options.
+   *
+   * @return \Drupal\Core\Link
+   *   A link object for viewing the topic.
+   */
+  public function toLink($text = NULL, array $options = []);
+
 }
diff --git a/src/Plugin/HelpTopic/HelpTopicPluginManagerInterface.php b/src/Plugin/HelpTopic/HelpTopicPluginManagerInterface.php
index 5a6f6e0..a19c7bb 100644
--- a/src/Plugin/HelpTopic/HelpTopicPluginManagerInterface.php
+++ b/src/Plugin/HelpTopic/HelpTopicPluginManagerInterface.php
@@ -23,6 +23,13 @@ use Drupal\Component\Plugin\PluginManagerInterface;
  */
 interface HelpTopicManagerInterface extends PluginManagerInterface {
 
+  /**
+   * Returns a list of the top-level topics.
+   *
+   * @return \Drupal\help_topics\Plugin\HelpTopic\HelpTopicPluginInterface[]
+   *   Array of all of the help topics that are marked as top-level, sorted
+   *   by topic title.
+   */
   function getTopLevelTopics();
 
   function getAllListOn();
