diff --git a/assets/icons/workbench.svg b/assets/icons/workbench.svg
new file mode 100644
index 0000000..693d6f1
--- /dev/null
+++ b/assets/icons/workbench.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
+  <path d="M6.53 3.19 l12.45 12.44 -3.39 3.39 -12.44 -12.45 3.39 -3.39 zm-0.57 -0.57 l-1.63 -1.63 -3.34 3.39 1.57 1.63 3.39 -3.39 zm10.26 16.90 l3.98 0.68 -0.73 -3.92 -3.24 3.24 zm-3.65 -12.56 l2.01 -2.01 1.70 -1.70 1.70 1.70 -3.70 3.70 1.11 1.11 4.82 -4.82 -3.93 -3.96 -4.84 4.84 1.13 1.13 zm-3.96 7.35 l-3.65 3.65 -1.70 -1.70 3.39 -3.40 0.26 -0.26 -1.13 -1.13 -4.78 4.78 3.96 3.93 4.76 -4.76 -1.11 -1.11 zm7.95 -9.08 c0.16 -0.16 0.16 -0.41 0.00 -0.57 s-0.41 -0.16 -0.57 0.00 -0.16 0.41 0.00 0.57 0.41 0.16 0.57 0.00 z" fill="currentColor"/>
+</svg>
diff --git a/src/Plugin/Block/WorkbenchNavigationBlock.php b/src/Plugin/Block/WorkbenchNavigationBlock.php
new file mode 100644
index 0000000..99fef5d
--- /dev/null
+++ b/src/Plugin/Block/WorkbenchNavigationBlock.php
@@ -0,0 +1,64 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\workbench\Plugin\Block;
+
+use Drupal\Core\Access\AccessResult;
+use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Session\AccountInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a Workbench Navigation block.
+ *
+ * @Block(
+ *   id = "workbench_navigation",
+ *   admin_label = @Translation("Workbench Navigation"),
+ *   category = @Translation("Navigation")
+ * )
+ */
+final class WorkbenchNavigationBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition): static {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build(): array {
+    return [
+      '#lazy_builder' => ['workbench.navigation.lazy_builder:renderNavigationLinks', []],
+      '#create_placeholder' => TRUE,
+      '#lazy_builder_preview' => [
+        '#type' => 'component',
+        '#component' => 'navigation:toolbar-button',
+        '#props' => [
+          'html_tag' => 'a',
+          'text' => $this->t('Workbench'),
+          'icon' => [
+            'pack_id' => 'workbench',
+            'icon_id' => 'workbench',
+          ],
+        ],
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function blockAccess(AccountInterface $account) {
+    return AccessResult::allowedIfHasPermission($account, 'access workbench');
+  }
+
+}
diff --git a/src/WorkbenchNavigationLazyBuilder.php b/src/WorkbenchNavigationLazyBuilder.php
new file mode 100644
index 0000000..9647a53
--- /dev/null
+++ b/src/WorkbenchNavigationLazyBuilder.php
@@ -0,0 +1,87 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\workbench;
+
+use Drupal\Core\Menu\MenuLinkTreeInterface;
+use Drupal\Core\Menu\MenuTreeParameters;
+use Drupal\Core\Security\Attribute\TrustedCallback;
+use Drupal\Core\StringTranslation\StringTranslationTrait;
+
+/**
+ * Lazy builder for Workbench navigation content.
+ */
+final class WorkbenchNavigationLazyBuilder {
+
+  use StringTranslationTrait;
+
+  /**
+   * Constructs a WorkbenchNavigationLazyBuilder object.
+   *
+   * @param \Drupal\Core\Menu\MenuLinkTreeInterface $menuTree
+   *   The navigation menu tree service.
+   */
+  public function __construct(
+    protected readonly MenuLinkTreeInterface $menuTree,
+  ) {}
+
+  /**
+   * Lazy builder callback for rendering workbench navigation links.
+   *
+   * @return array
+   *   A renderable array.
+   */
+  #[TrustedCallback]
+  public function renderNavigationLinks(): array {
+    $parameters = new MenuTreeParameters();
+    $parameters->setMinDepth(1)->setMaxDepth(1);
+    $tree = $this->menuTree->load('workbench', $parameters);
+    $manipulators = [
+      ['callable' => 'menu.default_tree_manipulators:checkAccess'],
+      ['callable' => 'menu.default_tree_manipulators:generateIndexAndSort'],
+      ['callable' => 'toolbar_menu_navigation_links'],
+    ];
+    $tree = $this->menuTree->transform($tree, $manipulators);
+    $build = $this->menuTree->build($tree);
+
+    if (empty($build['#items'])) {
+      return [
+        '#cache' => $build['#cache'] ?? [],
+      ];
+    }
+
+    $items = $build['#items'];
+    $root_link_id = 'workbench.content';
+
+    if (!isset($items[$root_link_id])) {
+      return [
+        '#cache' => $build['#cache'] ?? [],
+      ];
+    }
+
+    $root_item = $items[$root_link_id];
+    unset($items[$root_link_id]);
+
+    // Use "Workbench" as the title to match the Toolbar tab.
+    $root_item['title'] = $this->t('Workbench');
+    $root_item['below'] = $items;
+    $root_item['icon'] = [
+      'pack_id' => 'workbench',
+      'icon_id' => 'workbench',
+    ];
+
+    return [
+      '#theme' => 'navigation_menu',
+      '#menu_name' => 'workbench',
+      '#items' => [
+        'workbench' => $root_item,
+      ],
+      '#attached' => [
+        'library' => ['workbench/workbench.toolbar'],
+      ],
+      '#cache' => $build['#cache'] ?? [],
+    ];
+  }
+
+}
diff --git a/src/WorkbenchServiceProvider.php b/src/WorkbenchServiceProvider.php
new file mode 100644
index 0000000..ff67c87
--- /dev/null
+++ b/src/WorkbenchServiceProvider.php
@@ -0,0 +1,26 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\workbench;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderBase;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Modifies workbench.navigation.lazy_builder if navigation is present.
+ */
+final class WorkbenchServiceProvider extends ServiceProviderBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alter(ContainerBuilder $container): void {
+    if ($container->has('navigation.menu_tree')) {
+      $definition = $container->getDefinition('workbench.navigation.lazy_builder');
+      $definition->setArgument(0, new Reference('navigation.menu_tree'));
+    }
+  }
+
+}
diff --git a/workbench.icons.yml b/workbench.icons.yml
new file mode 100644
index 0000000..e1317a3
--- /dev/null
+++ b/workbench.icons.yml
@@ -0,0 +1,36 @@
+workbench:
+  enabled: true
+  label: "Workbench"
+  description: "Icons available within Workbench module."
+  version: 11.x
+  license:
+    name: GPL2-or-later
+    url: https://api.drupal.org/api/drupal/core%21LICENSE.txt/11.x
+    gpl-compatible: true
+  extractor: svg
+  config:
+    sources:
+      - assets/icons/*.svg
+  settings:
+    size:
+      title: "Size"
+      description: "Set a size for this icon."
+      type: "integer"
+      default: 20
+    class:
+      title: "Class"
+      description: "Set a class for this icon."
+      type: "string"
+      default: ""
+  template: >
+    <svg
+      {{ attributes
+          .setAttribute('viewBox', attributes.viewBox|default('0 0 24 24'))
+          .setAttribute('class', class)
+          .setAttribute('width', size|default('20'))
+          .setAttribute('height', size|default('20'))
+          .setAttribute('aria-hidden', 'true')
+      }}
+    >
+      {{ content }}
+    </svg>
diff --git a/workbench.install b/workbench.install
index d1a2f65..d99b9a2 100644
--- a/workbench.install
+++ b/workbench.install
@@ -39,3 +39,49 @@ function workbench_update_8002(&$sandbox) {
   $config->set('all_main', 'workbench_recent_content:embed_1');
   $config->save(TRUE);
 }
+
+/**
+ * Add the Workbench navigation block to the navigation layout.
+ */
+function workbench_update_8003(&$sandbox) {
+  if (!\Drupal::moduleHandler()->moduleExists('navigation')) {
+    return;
+  }
+
+  // Add the block to navigation.block_layout if it's not already there.
+  $config_factory = \Drupal::configFactory();
+  $config = $config_factory->getEditable('navigation.block_layout');
+  if ($config->isNew()) {
+    return;
+  }
+
+  // Use the config action manager if available.
+  if (\Drupal::hasService('plugin.manager.config_action')) {
+    /** @var \Drupal\Core\Config\Action\ConfigActionManager $config_action_manager */
+    $config_action_manager = \Drupal::service('plugin.manager.config_action');
+
+    // Check if the block is already there.
+    $sections = $config->get('sections');
+    if (!empty($sections)) {
+      foreach ($sections as $section) {
+        if (!empty($section['components'])) {
+          foreach ($section['components'] as $component) {
+            if (isset($component['configuration']['id']) && $component['configuration']['id'] === 'workbench_navigation') {
+              return;
+            }
+          }
+        }
+      }
+    }
+
+    $block = [
+      'configuration' => [
+        'id' => 'workbench_navigation',
+        'label' => 'Workbench',
+        'label_display' => '0',
+        'provider' => 'workbench',
+      ],
+    ];
+    $config_action_manager->applyAction('addNavigationBlock', 'navigation.block_layout', $block);
+  }
+}
diff --git a/workbench.module b/workbench.module
index 6a1c307..059dc7b 100644
--- a/workbench.module
+++ b/workbench.module
@@ -92,3 +92,30 @@ function workbench_parse_help(string $text) {
   $text = str_replace($find, $replace, $text);
   return $text;
 }
+
+/**
+ * Implements hook_block_alter().
+ */
+function workbench_block_alter(&$definitions) {
+  if (isset($definitions['workbench_navigation'])) {
+    $definitions['workbench_navigation']['allow_in_navigation'] = TRUE;
+  }
+}
+
+/**
+ * Implements hook_navigation_defaults().
+ */
+function workbench_navigation_defaults(): array {
+  $blocks = [];
+
+  $blocks[] = [
+    'configuration' => [
+      'id' => 'workbench_navigation',
+      'label' => 'Workbench',
+      'label_display' => '0',
+      'provider' => 'workbench',
+    ],
+  ];
+
+  return $blocks;
+}
diff --git a/workbench.services.yml b/workbench.services.yml
new file mode 100644
index 0000000..932b66b
--- /dev/null
+++ b/workbench.services.yml
@@ -0,0 +1,5 @@
+services:
+  workbench.navigation.lazy_builder:
+    class: Drupal\workbench\WorkbenchNavigationLazyBuilder
+    arguments:
+      - '@menu.link_tree'
