diff --git a/src/Controller/GroupContentMenuController.php b/src/Controller/GroupContentMenuController.php
index 39331d6..aa03682 100644
--- a/src/Controller/GroupContentMenuController.php
+++ b/src/Controller/GroupContentMenuController.php
@@ -184,4 +184,17 @@ class GroupContentMenuController extends GroupContentController {
     return $this->entityFormBuilder()->getForm($menu_link_content);
   }
 
+  /**
+   * Provides the menu link edit form.
+   *
+   * @param \Drupal\menu_link_content\MenuLinkContentInterface $menu_link_content
+   *   The menu link content.
+   *
+   * @return array
+   *   Returns the menu link edit form.
+   */
+  public function deleteLink(MenuLinkContentInterface $menu_link_content) {
+    return $this->entityFormBuilder()->getForm($menu_link_content, 'delete');
+  }
+
 }
diff --git a/src/Entity/GroupContentMenu.php b/src/Entity/GroupContentMenu.php
index 35b20ac..eef7e20 100644
--- a/src/Entity/GroupContentMenu.php
+++ b/src/Entity/GroupContentMenu.php
@@ -46,6 +46,8 @@ use Drupal\group_content_menu\GroupContentMenuInterface;
  *     "add-page" = "/group/{group}/menu/add",
  *     "add-menu-link" = "/group/{group}/menu/{group_content_menu}/add-link",
  *     "edit-menu-link" = "/group/{group}/menu/{group_content_menu}/link/{menu_link_content}",
+ *     "delete-menu-link" = "/group/{group}/menu/{group_content_menu}/link/{menu_link_content}/delete",
+ *     "translate-menu-link" = "/group/{group}/menu/{group_content_menu}/link/{menu_link_content}/translations",
  *     "edit-form" = "/group/{group}/menu/{group_content_menu}/edit",
  *     "delete-form" = "/group/{group}/menu/{group_content_menu}/delete",
  *     "collection" = "/group/{group}/menus"
diff --git a/src/Form/GroupContentMenuForm.php b/src/Form/GroupContentMenuForm.php
index f1d8aa5..438700c 100644
--- a/src/Form/GroupContentMenuForm.php
+++ b/src/Form/GroupContentMenuForm.php
@@ -293,17 +293,25 @@ class GroupContentMenuForm extends ContentEntityForm {
             'url' => Url::fromRoute('menu_ui.link_reset', ['menu_link_plugin' => $link->getPluginId()]),
           ];
         }
-        elseif ($delete_link = $link->getDeleteRoute()) {
-          $operations['delete']['url'] = $delete_link;
+        elseif ($link->isDeletable()) {
+          $operations['delete']['url'] = Url::fromRoute('entity.group_content_menu.delete_link', [
+            'group' => $group->id(),
+            'group_content_menu' => $this->entity->id(),
+            'menu_link_content' => $link->getMetaData()['entity_id'],
+          ]);
           $operations['delete']['query'] = $this->getRedirectDestination()->getAsArray();
           $operations['delete']['title'] = $this->t('Delete');
         }
         if ($link->isTranslatable()) {
           $operations['translate'] = [
             'title' => $this->t('Translate'),
-            'url' => $link->getTranslateRoute(),
+            'url' => Url::fromRoute('entity.group_content_menu.translate_link', [
+              'group' => $group->id(),
+              'group_content_menu' => $this->entity->id(),
+              'menu_link_content' => $link->getMetaData()['entity_id'],
+            ]),
+            'query' => $this->getRedirectDestination()->getAsArray(),
           ];
-          $operations['translate']['query'] = ['destination' => Url::fromRouteMatch($this->getRouteMatch())->toString()];
         }
 
         // Only display the operations to which the user has access.
diff --git a/src/NodeFormAlter.php b/src/NodeFormAlter.php
index d709f04..ad99646 100644
--- a/src/NodeFormAlter.php
+++ b/src/NodeFormAlter.php
@@ -6,13 +6,11 @@ use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Menu\MenuParentFormSelectorInterface;
-use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
 use Drupal\Core\Session\AccountProxyInterface;
-use Drupal\group\Entity\GroupContent;
 use Drupal\group\Entity\GroupContentInterface;
+use Drupal\group\Entity\GroupInterface;
 use Drupal\group_content_menu\GroupContentMenuInterface;
 use Drupal\node\NodeInterface;
-use Drupal\system\MenuInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -43,13 +41,6 @@ class NodeFormAlter implements ContainerInjectionInterface {
    */
   protected $currentUser;
 
-  /**
-   * The `context.repository` service.
-   *
-   * @var \Drupal\Core\Plugin\Context\ContextRepositoryInterface
-   */
-  protected $contextRepository;
-
   /**
    * Construct our class and inject dependencies.
    *
@@ -59,14 +50,11 @@ class NodeFormAlter implements ContainerInjectionInterface {
    *   The `menu.parent_form_selector` service.
    * @param \Drupal\Core\Session\AccountProxyInterface $current_user
    *   The `current_user` service.
-   * @param \Drupal\Core\Plugin\Context\ContextRepositoryInterface $context_repository
-   *   The `context.repository` service.
    */
-  public function __construct(EntityTypeManagerInterface $entity_type_manager, MenuParentFormSelectorInterface $menu_parent_form_selector, AccountProxyInterface $current_user, ContextRepositoryInterface $context_repository) {
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, MenuParentFormSelectorInterface $menu_parent_form_selector, AccountProxyInterface $current_user) {
     $this->entityTypeManager = $entity_type_manager;
     $this->menuParentSelector = $menu_parent_form_selector;
     $this->currentUser = $current_user;
-    $this->contextRepository = $context_repository;
   }
 
   /**
@@ -97,120 +85,158 @@ class NodeFormAlter implements ContainerInjectionInterface {
   public function alter(array &$form, FormStateInterface $form_state) {
     /** @var \Drupal\node\NodeInterface $node */
     $node = $form_state->getFormObject()->getEntity();
-    /** @var \Drupal\node\NodeTypeInterface $node_type */
-    $node_type = $this->entityTypeManager
-      ->getStorage('node_type')
-      ->load($node->bundle());
-    $available_menus = $node_type
-      ->getThirdPartySetting('menu_ui', 'available_menus', ['main']);
-    $menu_ui_menus = array_map(static function (MenuInterface $menu) {
-      return $menu->label();
-    }, $this->entityTypeManager
-      ->getStorage('menu')
-      ->loadMultiple($available_menus));
 
     $groups = $this->getGroups($form_state, $node);
-    if (!empty($groups)) {
-      $group_menus = $this->getGroupMenus($groups);
-      $defaults = menu_ui_get_menu_link_defaults($node);
-      if ($defaults['id']) {
-        $default = $defaults['menu_name'] . ':' . $defaults['parent'];
-      }
-      else {
-        $defaults = group_content_menu_get_menu_link_default($node, array_keys($group_menus));
-        $default = $defaults['menu_name'] . ':' . $defaults['parent'];
-      }
+    if (empty($groups)) {
+      return;
+    }
 
-      // Are there any traditional menus that are not group menus?
-      $traditional_menus = !empty($form['menu']['link']['menu_parent']['#options']);
+    $group_menus = $this->getGroupMenus($groups);
+    if (empty($group_menus)) {
+      return;
+    }
 
-      $form['menu'] = [
-        '#type' => 'details',
-        '#title' => t('Menu settings'),
-        '#open' => (bool) $defaults['id'],
-        '#group' => 'advanced',
-        '#attached' => [
-          'library' => ['menu_ui/drupal.menu_ui'],
-        ],
-        '#tree' => TRUE,
-        '#weight' => -2,
-        '#attributes' => ['class' => ['menu-link-form']],
-      ];
-      $form['menu']['enabled'] = [
-        '#type' => 'checkbox',
-        '#title' => t('Provide a menu link'),
-        '#default_value' => (int) (bool) $defaults['id'],
-      ];
-      $form['menu']['link'] = [
-        '#type' => 'container',
-        '#parents' => ['menu'],
-        '#states' => [
-          'invisible' => [
-            'input[name="menu[enabled]"]' => ['checked' => FALSE],
-          ],
-        ],
-      ];
+    if (!empty($form['menu']) && (!isset($form['menu']['#access']) || $form['menu']['#access'] === TRUE)) {
+      // The menu element exists and is accessible, update the menu element with
+      // the group menus options.
+      $this->updateMenuElement($form, $node, $group_menus);
+    }
+    else {
+      // The menu element is hidden or doesn't exist. Build the menu element
+      // from scratch with only group menu options.
+      $this->attachMenuElement($form, $node, $group_menus);
+    }
+  }
 
-      $form['menu']['link']['menu_parent'] = $this->menuParentSelector
-        ->parentSelectElement($default, $defaults['id'], array_merge($group_menus, $menu_ui_menus));
+  /**
+   * Build a menu element for a node form with only group menu options.
+   *
+   * @param array $form
+   *   The node form to add the menu element to.
+   * @param \Drupal\node\NodeInterface $node
+   *   The current node being edited.
+   * @param array $group_menus
+   *   The group menus available as options.
+   */
+  protected function attachMenuElement(array &$form, NodeInterface $node, array $group_menus) {
+    $defaults = group_content_menu_get_menu_link_default($node, array_keys($group_menus));
+    $default_parent = $defaults['menu_name'] . ':' . $defaults['parent'];
 
-      // Populate the element with the link data.
-      foreach (['id', 'entity_id'] as $key) {
-        $form['menu']['link'][$key] = [
-          '#type' => 'value',
-          '#value' => $defaults[$key],
-        ];
-      }
+    $form['menu'] = [
+      '#type' => 'details',
+      '#title' => t('Menu settings'),
+      '#open' => (bool) $defaults['id'],
+      '#group' => 'advanced',
+      '#attached' => [
+        'library' => ['menu_ui/drupal.menu_ui'],
+      ],
+      '#tree' => TRUE,
+      '#weight' => -2,
+      '#attributes' => ['class' => ['menu-link-form']],
+    ];
+    $form['menu']['enabled'] = [
+      '#type' => 'checkbox',
+      '#title' => t('Provide a menu link'),
+      '#default_value' => (int) (bool) $defaults['id'],
+    ];
+    $form['menu']['link'] = [
+      '#type' => 'container',
+      '#parents' => ['menu'],
+      '#states' => [
+        'invisible' => [
+          'input[name="menu[enabled]"]' => ['checked' => FALSE],
+        ],
+      ],
+    ];
 
-      $form['menu']['link']['title'] = [
-        '#type' => 'textfield',
-        '#title' => t('Menu link title'),
-        '#default_value' => $defaults['title'],
-        '#maxlength' => $defaults['title_max_length'],
-      ];
+    $form['menu']['link']['menu_parent'] = $this->menuParentSelector
+      ->parentSelectElement($default_parent, $defaults['id'], $group_menus);
 
-      $form['menu']['link']['description'] = [
-        '#type' => 'textfield',
-        '#title' => t('Description'),
-        '#default_value' => $defaults['description'],
-        '#description' => t('Shown when hovering over the menu link.'),
-        '#maxlength' => $defaults['description_max_length'],
+    // Populate the element with the link data.
+    foreach (['id', 'entity_id'] as $key) {
+      $form['menu']['link'][$key] = [
+        '#type' => 'value',
+        '#value' => $defaults[$key],
       ];
+    }
 
-      $form['menu']['link']['menu_parent']['#title'] = t('Parent item');
-      $form['menu']['link']['menu_parent']['#attributes']['class'][] = 'menu-parent-select';
+    $form['menu']['link']['title'] = [
+      '#type' => 'textfield',
+      '#title' => t('Menu link title'),
+      '#default_value' => $defaults['title'],
+      '#maxlength' => $defaults['title_max_length'],
+    ];
 
-      $form['menu']['link']['weight'] = [
-        '#type' => 'number',
-        '#title' => t('Weight'),
-        '#default_value' => $defaults['weight'],
-        '#description' => t('Menu links with lower weights are displayed before links with higher weights.'),
-      ];
+    $form['menu']['link']['description'] = [
+      '#type' => 'textfield',
+      '#title' => t('Description'),
+      '#default_value' => $defaults['description'],
+      '#description' => t('Shown when hovering over the menu link.'),
+      '#maxlength' => $defaults['description_max_length'],
+    ];
 
-      foreach (array_keys($form['actions']) as $action) {
-        if ($action !== 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
-          $form['actions'][$action]['#submit'][] = 'menu_ui_form_node_form_submit';
-        }
+    $form['menu']['link']['menu_parent']['#title'] = t('Parent item');
+    $form['menu']['link']['menu_parent']['#attributes']['class'][] = 'menu-parent-select';
+
+    $form['menu']['link']['weight'] = [
+      '#type' => 'number',
+      '#title' => t('Weight'),
+      '#default_value' => $defaults['weight'],
+      '#description' => t('Menu links with lower weights are displayed before links with higher weights.'),
+    ];
+
+    foreach (array_keys($form['actions']) as $action) {
+      if ($action !== 'preview' && isset($form['actions'][$action]['#type']) && $form['actions'][$action]['#type'] === 'submit') {
+        $form['actions'][$action]['#submit'][] = 'menu_ui_form_node_form_submit';
       }
+    }
 
-      $form['menu']['#access'] = FALSE;
-      if (!empty($form['menu']['link']['menu_parent']['#options'])) {
-        // If there are traditional menus and user has admin permission.
-        if ($traditional_menus && $this->currentUser->hasPermission('administer menu')) {
-          $form['menu']['#access'] = TRUE;
-        }
-        else {
-          $context_id = '@group.group_route_context:group';
-          $contexts = $this->contextRepository
-            ->getRuntimeContexts([$context_id]);
-          $group = $contexts[$context_id]->getContextValue();
-          if ($group && $group->hasPermission('manage group_content_menu', $this->currentUser)) {
-            $form['menu']['#access'] = TRUE;
-          }
-        }
+    $form['#entity_builders'][] = 'menu_ui_node_builder';
+  }
+
+  /**
+   * Update an existing menu element with group menu options.
+   *
+   * @param array $form
+   *   The node form to add the menu element to.
+   * @param \Drupal\node\NodeInterface $node
+   *   The current node being edited.
+   * @param array $group_menus
+   *   The group menus available as options.
+   */
+  protected function updateMenuElement(array &$form, NodeInterface $node, array $group_menus) {
+    // Check for default menu link values from the traditional menu system.
+    $defaults = menu_ui_get_menu_link_defaults($node);
+    if (empty($defaults['id'])) {
+      // Node does not have a menu link in traditional menus, check group menus.
+      $defaults = group_content_menu_get_menu_link_default($node, array_keys($group_menus));
+      if ($defaults['id']) {
+        $has_link_in_group_menus = TRUE;
       }
+    }
+
+    $group_menu_parent_options = $this->menuParentSelector
+      ->getParentSelectOptions($defaults['id'], $group_menus);
+
+    $traditional_menu_parent_options = $form['menu']['link']['menu_parent']['#options'];
+    $form['menu']['link']['menu_parent']['#options'] = $group_menu_parent_options + $traditional_menu_parent_options;
+
+    if (!empty($has_link_in_group_menus)) {
+      $form['menu']['#open'] = (bool) $defaults['id'];
+      $form['menu']['enabled']['#default_value'] = (int) (bool) $defaults['id'];
 
-      $form['#entity_builders'][] = 'menu_ui_node_builder';
+      $form['menu']['link']['id']['#value'] = $defaults['id'];
+      $form['menu']['link']['entity_id']['#value'] = $defaults['entity_id'];
+
+      $form['menu']['link']['title']['#default_value'] = $defaults['title'];
+      $form['menu']['link']['title']['#maxlength'] = $defaults['title_max_length'];
+
+      $form['menu']['link']['description']['#default_value'] = $defaults['description'];
+      $form['menu']['link']['description']['#maxlength'] = $defaults['description_max_length'];
+
+      $form['menu']['link']['menu_parent']['#default_value'] = $defaults['menu_name'] . ':' . $defaults['parent'];
+
+      $form['menu']['link']['weight']['#default_value'] = $defaults['weight'];
     }
   }
 
@@ -242,7 +268,7 @@ class NodeFormAlter implements ContainerInjectionInterface {
       $group_contents = $this->entityTypeManager
         ->getStorage('group_content')
         ->loadByEntity($node);
-      $group_ids = array_map(static function (GroupContent $group_content) {
+      $group_ids = array_map(static function (GroupContentInterface $group_content) {
         return $group_content->getGroup()->id();
       }, $group_contents);
       $groups = $this->entityTypeManager
@@ -254,31 +280,52 @@ class NodeFormAlter implements ContainerInjectionInterface {
   }
 
   /**
-   * Get an array of GroupContentMenus.
+   * Get an array of GroupContentMenus keyed by mlid.
    *
    * @param \Drupal\group\Entity\GroupInterface[] $groups
    *   An array of groups to get menus for.
    *
    * @return array
-   *   An array of GroupContentMenu labels, keyed by menu link id..
+   *   An array of GroupContentMenu labels, keyed by menu link id.
    */
   protected function getGroupMenus(array $groups) {
-    $group_menus = [];
+    $menus = [];
     foreach ($groups as $group) {
-      $group_menus[] = array_map(static function (GroupContentInterface $group_content) {
-        $id = GroupContentMenuInterface::MENU_PREFIX . $group_content->getEntity()->id();
-        return [$id => $group_content->getEntity()->label() . " ({$group_content->getGroup()->label()})"];
-      }, group_content_menu_get_menus_per_group($group));
+      if ($this->canManageGroupMenuItems($group, $this->currentUser)) {
+        foreach (group_content_menu_get_menus_per_group($group) as $group_content) {
+          $group_menu = $group_content->getEntity();
+          $mlid = GroupContentMenuInterface::MENU_PREFIX . $group_menu->id();
+          $menus[$mlid] = $group_menu->label() . " ({$group->label()})";
+        }
+      }
+    }
+
+    return array_unique($menus);
+  }
+
+  /**
+   * Check if a user can manage menu items within a group.
+   *
+   * @param \Drupal\group\Entity\GroupInterface $group
+   *   The group to check for.
+   * @param \Drupal\Core\Session\AccountProxyInterface $user
+   *   The user to access check.
+   *
+   * @return bool
+   *   TRUE if the user can manage menu items within the group.
+   */
+  protected function canManageGroupMenuItems(GroupInterface $group, AccountProxyInterface $user): bool {
+    if ($user->hasPermission('administer menu')) {
+      return TRUE;
+    }
+    if ($group->hasPermission('manage group_content_menu', $user)) {
+      return TRUE;
     }
-    // Unpack the group menus.
-    $group_menus = array_merge(...$group_menus);
-    // We have multiple levels of nested arrays, depending on if any groups
-    // have menus or not.
-    if ($group_menus) {
-      $group_menus = array_merge(...$group_menus);
+    if ($group->hasPermission('manage group_content_menu menu items', $user)) {
+      return TRUE;
     }
 
-    return array_unique($group_menus);
+    return FALSE;
   }
 
 }
diff --git a/src/Plugin/GroupContentMenuPermissionProvider.php b/src/Plugin/GroupContentMenuPermissionProvider.php
index 26f4a9b..00627fa 100644
--- a/src/Plugin/GroupContentMenuPermissionProvider.php
+++ b/src/Plugin/GroupContentMenuPermissionProvider.php
@@ -32,6 +32,10 @@ class GroupContentMenuPermissionProvider extends GroupContentPermissionProvider
       'Manage menus',
       'Create, update and delete menus'
     );
+    $permissions['manage group_content_menu menu items'] = $this->buildPermission(
+      'Manage menu items',
+      'Create, update and delete menu items within group menus'
+    );
 
     return $permissions;
   }
diff --git a/src/Routing/GroupContentMenuRouteProvider.php b/src/Routing/GroupContentMenuRouteProvider.php
index c2b0aee..da5f228 100644
--- a/src/Routing/GroupContentMenuRouteProvider.php
+++ b/src/Routing/GroupContentMenuRouteProvider.php
@@ -2,10 +2,14 @@
 
 namespace Drupal\group_content_menu\Routing;
 
+use Drupal\Core\Entity\EntityFieldManagerInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider;
+use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\group_content_menu\Controller\GroupContentMenuController;
 use Drupal\group_content_menu\Entity\GroupContentMenuType;
+use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\Routing\Route;
 
 /**
@@ -13,6 +17,52 @@ use Symfony\Component\Routing\Route;
  */
 class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
 
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The entity field manager.
+   *
+   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
+   */
+  protected $entityFieldManager;
+
+  /**
+   * The module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandler
+   */
+  protected $moduleHandler;
+
+  /**
+   * Constructs a new DefaultHtmlRouteProvider.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity type manager.
+   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
+   *   The entity field manager.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, ModuleHandlerInterface $module_handler) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->entityFieldManager = $entity_field_manager;
+    $this->moduleHandler = $module_handler;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function createInstance(ContainerInterface $container, EntityTypeInterface $entity_type) {
+    return new static(
+      $container->get('entity_type.manager'),
+      $container->get('entity_field.manager'),
+      $container->get('module_handler')
+    );
+  }
+
   /**
    * {@inheritdoc}
    */
@@ -25,6 +75,12 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
     if ($add_menu_link = $this->getEditMenuLink($entity_type)) {
       $collection->add('entity.group_content_menu.edit_link', $add_menu_link);
     }
+    if ($delete_menu_link = $this->getDeleteMenuLink($entity_type)) {
+      $collection->add('entity.group_content_menu.delete_link', $delete_menu_link);
+    }
+    if ($this->moduleHandler->moduleExists('content_translation') && $translations_menu_link = $this->getTranslationsMenuLink($entity_type)) {
+      $collection->add('entity.group_content_menu.translate_link', $translations_menu_link);
+    }
 
     return $collection;
   }
@@ -46,7 +102,7 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
           '_title' => 'Add menu link',
           '_controller' => sprintf('%s::addLink', GroupContentMenuController::class),
         ])
-        ->setRequirement('_group_permission', implode('+', $this->getCreatePermissions()))
+        ->setRequirement('_group_permission', implode('+', $this->getManageMenuItemsPermissions()))
         ->setRequirement('_group_installed_content', implode('+', $this->getPluginIds()))
         ->setOption('parameters', [
           'group' => ['type' => 'entity:group'],
@@ -73,7 +129,64 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
           '_title' => 'Edit menu link',
           '_controller' => sprintf('%s::editLink', GroupContentMenuController::class),
         ])
-        ->setRequirement('_group_permission', 'manage group_content_menu')
+        ->setRequirement('_group_permission', implode('+', $this->getManageMenuItemsPermissions()))
+        ->setRequirement('_group_installed_content', implode('+', $this->getPluginIds()))
+        ->setOption('parameters', [
+          'group' => ['type' => 'entity:group'],
+          'group_content_menu' => ['type' => 'entity:group_content_menu'],
+          'menu_link_content' => ['type' => 'entity:menu_link_content'],
+        ])
+        ->setOption('_group_operation_route', TRUE);
+    }
+  }
+
+  /**
+   * Gets the edit-menu-link route.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type.
+   *
+   * @return \Symfony\Component\Routing\Route|null
+   *   The generated route, if available.
+   */
+  protected function getDeleteMenuLink(EntityTypeInterface $entity_type) {
+    if ($entity_type->hasLinkTemplate('delete-menu-link')) {
+      $route = new Route($entity_type->getLinkTemplate('delete-menu-link'));
+      return $route
+        ->setDefaults([
+          '_title' => 'Delete menu link',
+          '_controller' => sprintf('%s::deleteLink', GroupContentMenuController::class),
+        ])
+        ->setRequirement('_group_permission', implode('+', $this->getManageMenuItemsPermissions()))
+        ->setRequirement('_group_installed_content', implode('+', $this->getPluginIds()))
+        ->setOption('parameters', [
+          'group' => ['type' => 'entity:group'],
+          'group_content_menu' => ['type' => 'entity:group_content_menu'],
+          'menu_link_content' => ['type' => 'entity:menu_link_content'],
+        ])
+        ->setOption('_group_operation_route', TRUE);
+    }
+  }
+
+  /**
+   * Gets the translate-menu-link route.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
+   *   The entity type.
+   *
+   * @return \Symfony\Component\Routing\Route|null
+   *   The generated route, if available.
+   */
+  protected function getTranslationsMenuLink(EntityTypeInterface $entity_type) {
+    if ($entity_type->hasLinkTemplate('translate-menu-link')) {
+      $route = new Route($entity_type->getLinkTemplate('translate-menu-link'));
+      return $route
+        ->setDefaults([
+          '_title' => 'Translations menu link',
+          '_controller' => '\Drupal\content_translation\Controller\ContentTranslationController::overview',
+          'entity_type_id' => 'menu_link_content',
+        ])
+        ->setRequirement('_group_permission', implode('+', $this->getManageMenuItemsPermissions()))
         ->setRequirement('_group_installed_content', implode('+', $this->getPluginIds()))
         ->setOption('parameters', [
           'group' => ['type' => 'entity:group'],
@@ -174,7 +287,7 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
       $route->setRequirements($requirements);
       return $route
         ->setRequirement('_group_menu_owns_content', 'TRUE')
-        ->setRequirement('_group_permission', 'manage group_content_menu')
+        ->setRequirement('_group_permission', implode('+', $this->getManageMenuItemsPermissions()))
         ->setOption('_group_operation_route', TRUE)
         ->setOption('parameters', [
           'group' => ['type' => 'entity:group'],
@@ -203,17 +316,18 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
   }
 
   /**
-   * Get create permissions.
+   * Get permissions that allow managing menu items.
    *
    * @return array
-   *   List of create permissions.
+   *   List of permissions that allow managing menu items.
    */
-  protected function getCreatePermissions() {
+  protected function getManageMenuItemsPermissions() {
     $permissions = [];
-    foreach (array_keys(GroupContentMenuType::loadMultiple()) as $entity_type_id) {
-      $permissions[] = "create group_content_menu:$entity_type_id content";
-    }
-    return $permissions ?: ['access group content menu overview'];
+
+    $permissions[] = 'manage group_content_menu';
+    $permissions[] = 'manage group_content_menu menu items';
+
+    return $permissions;
   }
 
   /**
@@ -231,3 +345,4 @@ class GroupContentMenuRouteProvider extends DefaultHtmlRouteProvider {
   }
 
 }
+
