From a5cbdcdccf3566f0d4f115d7ab7200765e5f98c6 Mon Sep 17 00:00:00 2001
From: Maksym Chubin <maksim.chubin@netzlabor.co>
Date: Thu, 6 May 2021 10:14:00 +0300
Subject: [PATCH] [TASK] NL-3241 Change domain modeling

---
 Classes/Domain/Model/Menu.php                 | 161 +++++--------
 Classes/Domain/Model/MenuGroup.php            | 100 --------
 Classes/Domain/Model/MenuInterface.php        |  24 ++
 Classes/Domain/Model/MenuItem.php             | 155 ++++++------
 Classes/Domain/Model/MenuItemContent.php      |  10 +
 Classes/Domain/Model/MenuItemLink.php         |  10 +
 Classes/Domain/Model/MenuItemPage.php         |  29 +++
 Classes/Domain/Model/MenuItemSubmenu.php      |  10 +
 Classes/Domain/Model/MenuTrait.php            |  83 +++++++
 Classes/Domain/Model/Page.php                 | 106 +++++++++
 .../Domain/Repository/MenuGroupRepository.php |  20 --
 Classes/Domain/Repository/MenuRepository.php  |   2 +
 Classes/Hooks/ItemsProcFunc.php               |   5 +-
 .../Menu/Controller/RenderController.php      |  38 +++
 .../ViewHelpers/{ => Menu}/GetViewHelper.php  |  10 +-
 Classes/ViewHelpers/Menu/RenderViewHelper.php |  42 ++++
 .../Widget/Controller/ShowController.php      |  63 -----
 Classes/ViewHelpers/Widget/ShowViewHelper.php |  47 ----
 Configuration/Extbase/Persistence/Classes.php |  34 +++
 .../tx_nlmenubuilder_domain_model_menu.php    |  74 ++----
 ...x_nlmenubuilder_domain_model_menugroup.php | 146 ------------
 ...tx_nlmenubuilder_domain_model_menuitem.php | 140 +++++------
 ExtensionBuilder.json                         | 222 ++++++++++--------
 Resources/Private/Language/locallang.xlf      |  34 +--
 ...csh_tx_nlmenubuilder_domain_model_menu.xlf |  10 +-
 ...tx_nlmenubuilder_domain_model_menuitem.xlf |  12 +-
 ...csh_tx_nlmenubuilder_domain_model_page.xlf |  17 ++
 Resources/Private/Language/locallang_db.xlf   |  42 ++--
 Resources/Private/Partials/Menu.html          |   8 +-
 .../Private/Partials/MenuItem/Content.html    |   2 +
 Resources/Private/Partials/MenuItem/Link.html |   2 +
 Resources/Private/Partials/MenuItem/Page.html |   4 +-
 .../Private/Partials/MenuItem/Submenu.html    |   5 +-
 .../ViewHelpers/Menu/Render/Index.html        |  10 +
 .../ViewHelpers/Widget/Show/Index.html        |   9 -
 .../ViewHelpers/Widget/Show/Show.html         |   9 -
 ...x_nlmenubuilder_domain_model_menugroup.gif | Bin 5236 -> 0 bytes
 .../tx_nlmenubuilder_domain_model_page.gif    | Bin 0 -> 230 bytes
 ext_emconf.php                                |   2 +-
 ext_tables.php                                |   6 +-
 ext_tables.sql                                |  28 +--
 41 files changed, 838 insertions(+), 893 deletions(-)
 delete mode 100644 Classes/Domain/Model/MenuGroup.php
 create mode 100644 Classes/Domain/Model/MenuInterface.php
 create mode 100644 Classes/Domain/Model/MenuItemContent.php
 create mode 100644 Classes/Domain/Model/MenuItemLink.php
 create mode 100644 Classes/Domain/Model/MenuItemPage.php
 create mode 100644 Classes/Domain/Model/MenuItemSubmenu.php
 create mode 100644 Classes/Domain/Model/MenuTrait.php
 create mode 100644 Classes/Domain/Model/Page.php
 delete mode 100644 Classes/Domain/Repository/MenuGroupRepository.php
 create mode 100644 Classes/ViewHelpers/Menu/Controller/RenderController.php
 rename Classes/ViewHelpers/{ => Menu}/GetViewHelper.php (89%)
 create mode 100644 Classes/ViewHelpers/Menu/RenderViewHelper.php
 delete mode 100644 Classes/ViewHelpers/Widget/Controller/ShowController.php
 delete mode 100644 Classes/ViewHelpers/Widget/ShowViewHelper.php
 create mode 100644 Configuration/Extbase/Persistence/Classes.php
 delete mode 100644 Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php
 create mode 100644 Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_page.xlf
 create mode 100644 Resources/Private/Templates/ViewHelpers/Menu/Render/Index.html
 delete mode 100644 Resources/Private/Templates/ViewHelpers/Widget/Show/Index.html
 delete mode 100644 Resources/Private/Templates/ViewHelpers/Widget/Show/Show.html
 delete mode 100644 Resources/Public/Icons/tx_nlmenubuilder_domain_model_menugroup.gif
 create mode 100644 Resources/Public/Icons/tx_nlmenubuilder_domain_model_page.gif

diff --git a/Classes/Domain/Model/Menu.php b/Classes/Domain/Model/Menu.php
index 323c092..ee51ae8 100644
--- a/Classes/Domain/Model/Menu.php
+++ b/Classes/Domain/Model/Menu.php
@@ -1,7 +1,11 @@
 <?php
+declare(strict_types=1);
+
 namespace NL\NlMenubuilder\Domain\Model;
 
 
+use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
+
 /***
  *
  * This file is part of the "Menu Builder" Extension for TYPO3 CMS.
@@ -9,65 +13,47 @@ namespace NL\NlMenubuilder\Domain\Model;
  * For the full copyright and license information, please read the
  * LICENSE.txt file that was distributed with this source code.
  *
- *  (c) 2021 
+ *  (c) 2021
  *
  ***/
 /**
  * Menu
  */
-class Menu extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
+class Menu extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity implements MenuInterface
 {
+    use MenuTrait;
+
+    const DEFAULT_TEMPLATE = 'Default';
 
     /**
      * Name of the menu
-     * 
+     *
      * @var string
      * @TYPO3\CMS\Extbase\Annotation\Validate("NotEmpty")
      */
     protected $title = '';
 
     /**
-     * menuGroup
-     * 
-     * @var \NL\NlMenubuilder\Domain\Model\MenuGroup
+     * template
+     *
+     * @var string
+     * @TYPO3\CMS\Extbase\Annotation\Validate("NotEmpty")
      */
-    protected $menuGroup = null;
+    protected $template = self::DEFAULT_TEMPLATE;
 
     /**
-     * menuItem
-     * 
-     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\MenuItem>
+     * items
+     *
+     * @var ObjectStorage<MenuItem>
      * @TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove")
      */
-    protected $menuItem = null;
-
-    /**
-     * Returns the title
-     * 
-     * @return string $title
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Sets the title
-     * 
-     * @param string $title
-     * @return void
-     */
-    public function setTitle($title)
-    {
-        $this->title = $title;
-    }
+    protected $items = null;
 
     /**
      * __construct
      */
     public function __construct()
     {
-
         //Do not remove the next line: It would break the functionality
         $this->initStorageObjects();
     }
@@ -77,123 +63,96 @@ class Menu extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * Do not modify this method!
      * It will be rewritten on each save in the extension builder
      * You may modify the constructor of this class instead
-     * 
+     *
      * @return void
      */
     protected function initStorageObjects()
     {
-        $this->menuItem = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
+        $this->items = $this->items ?: new ObjectStorage();
     }
 
     /**
-     * @return array
-     */
-    public function getMenuItemPages(): array
-    {
-        return $this->getMenuItemByType(MenuItem::TYPE_PAGE);
-    }
-
-    /**
-     * @return array
-     */
-    public function getMenuItemLinks(): array
-    {
-        return $this->getMenuItemByType(MenuItem::TYPE_LINK);
-    }
-
-    /**
-     * @return array
-     */
-    public function getMenuItemContents(): array
-    {
-        return $this->getMenuItemByType(MenuItem::TYPE_CONTENT);
-    }
-
-    /**
-     * @return array
+     * Returns the title
+     *
+     * @return string $title
      */
-    public function getMenuItemSubmenus(): array
+    public function getTitle(): string
     {
-        return $this->getMenuItemByType(MenuItem::TYPE_SUBMENU);
+        return $this->title;
     }
 
     /**
-     * @param int $type
-     * @return array
+     * Sets the title
+     *
+     * @param string $title
+     * @return void
      */
-    public function getMenuItemByType(int $type): array
+    public function setTitle(string $title): string
     {
-        if ($items = $this->getMenuItem()) {
-            return array_filter($items->toArray(), function ($item) use ($type) {
-                /** @var MenuItem $item */
-               return $item->getType() === $type;
-            });
-        }
-
-        return [];
+        $this->title = $title;
     }
 
     /**
-     * Returns the menuGroup
-     * 
-     * @return \NL\NlMenubuilder\Domain\Model\MenuGroup menuGroup
+     * Returns the template
+     *
+     * @return string $template
      */
-    public function getMenuGroup()
+    public function getTemplate(): string
     {
-        return $this->menuGroup;
+        return $this->template;
     }
 
     /**
-     * Sets the menuGroup
-     * 
-     * @param \NL\NlMenubuilder\Domain\Model\MenuGroup $menuGroup
+     * Sets the template
+     *
+     * @param string $template
      * @return void
      */
-    public function setMenuGroup(\NL\NlMenubuilder\Domain\Model\MenuGroup $menuGroup)
+    public function setTemplate(string $template): void
     {
-        $this->menuGroup = $menuGroup;
+        $this->template = $template;
     }
 
     /**
      * Adds a MenuItem
-     * 
-     * @param \NL\NlMenubuilder\Domain\Model\MenuItem $menuItem
+     *
+     * @param MenuItem $item
      * @return void
      */
-    public function addMenuItem(\NL\NlMenubuilder\Domain\Model\MenuItem $menuItem)
+    public function addItem(MenuItem $item): void
     {
-        $this->menuItem->attach($menuItem);
+        $this->items->attach($item);
     }
 
     /**
      * Removes a MenuItem
-     * 
-     * @param \NL\NlMenubuilder\Domain\Model\MenuItem $menuItemToRemove The MenuItem to be removed
+     *
+     * @param MenuItem $itemToRemove The MenuItem to be removed
      * @return void
      */
-    public function removeMenuItem(\NL\NlMenubuilder\Domain\Model\MenuItem $menuItemToRemove)
+    public function removeItem(MenuItem $itemToRemove): void
     {
-        $this->menuItem->detach($menuItemToRemove);
+        $this->items->detach($itemToRemove);
     }
 
     /**
-     * Returns the menuItem
-     * 
-     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\MenuItem> menuItem
+     * Returns the items
+     *
+     * @return ObjectStorage<MenuItem> items
      */
-    public function getMenuItem()
+    public function getItems(): ?ObjectStorage
     {
-        return $this->menuItem;
+        return $this->items;
     }
 
     /**
-     * Sets the menuItem
-     * 
-     * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\MenuItem> $menuItem
+     * Sets the items
+     *
+     * @param ObjectStorage<MenuItem> $items
      * @return void
      */
-    public function setMenuItem(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $menuItem)
+    public function setItems(ObjectStorage $items): void
     {
-        $this->menuItem = $menuItem;
+        $this->items = $items;
     }
 }
diff --git a/Classes/Domain/Model/MenuGroup.php b/Classes/Domain/Model/MenuGroup.php
deleted file mode 100644
index e37a5ab..0000000
--- a/Classes/Domain/Model/MenuGroup.php
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-namespace NL\NlMenubuilder\Domain\Model;
-
-
-/***
- *
- * This file is part of the "Menu Builder" Extension for TYPO3 CMS.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- *  (c) 2021
- *
- ***/
-/**
- * MenuGroup
- */
-class MenuGroup extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
-{
-
-    /**
-     * Name of the menu group
-     *
-     * @var string
-     * @TYPO3\CMS\Extbase\Annotation\Validate("NotEmpty")
-     */
-    protected $title = '';
-
-    /**
-     * Name of the template
-     *
-     * @var string
-     * @TYPO3\CMS\Extbase\Annotation\Validate("NotEmpty")
-     */
-    protected $template = '';
-
-    /**
-     * __construct
-     */
-    public function __construct()
-    {
-
-        //Do not remove the next line: It would break the functionality
-        $this->initStorageObjects();
-    }
-
-    /**
-     * Initializes all ObjectStorage properties
-     * Do not modify this method!
-     * It will be rewritten on each save in the extension builder
-     * You may modify the constructor of this class instead
-     *
-     * @return void
-     */
-    protected function initStorageObjects()
-    {
-    }
-
-    /**
-     * Returns the title
-     *
-     * @return string title
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Sets the title
-     *
-     * @param string $title
-     * @return void
-     */
-    public function setTitle($title)
-    {
-        $this->title = $title;
-    }
-
-    /**
-     * Returns the template
-     *
-     * @return string title
-     */
-    public function getTemplate()
-    {
-        return $this->template;
-    }
-
-    /**
-     * Sets the template
-     *
-     * @param string $template
-     * @return void
-     */
-    public function setTemplate($template)
-    {
-        $this->template = $template;
-    }
-}
diff --git a/Classes/Domain/Model/MenuInterface.php b/Classes/Domain/Model/MenuInterface.php
new file mode 100644
index 0000000..bb1117f
--- /dev/null
+++ b/Classes/Domain/Model/MenuInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
+
+interface MenuInterface
+{
+    public function getTitle(): string;
+
+    public function getItems(): ?ObjectStorage;
+
+    public function getItemsByType(int $type): array;
+
+    public function getPageItems(): array;
+
+    public function getLinkItems(): array;
+
+    public function getContentItems(): array;
+
+    public function getSubmenuItems(): array;
+}
diff --git a/Classes/Domain/Model/MenuItem.php b/Classes/Domain/Model/MenuItem.php
index 14db263..2f6aed4 100644
--- a/Classes/Domain/Model/MenuItem.php
+++ b/Classes/Domain/Model/MenuItem.php
@@ -1,7 +1,13 @@
 <?php
+declare(strict_types=1);
 
 namespace NL\NlMenubuilder\Domain\Model;
 
+
+use TYPO3\CMS\Extbase\Domain\Model\FileReference;
+use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
+use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
+
 /***
  *
  * This file is part of the "Menu Builder" Extension for TYPO3 CMS.
@@ -15,7 +21,7 @@ namespace NL\NlMenubuilder\Domain\Model;
 /**
  * MenuItem
  */
-class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
+class MenuItem extends AbstractEntity
 {
     const TYPE_PAGE = 0;
     const TYPE_LINK = 1;
@@ -48,18 +54,11 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     /**
      * Optional link image
      *
-     * @var \TYPO3\CMS\Extbase\Domain\Model\FileReference
+     * @var FileReference
      * @TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove")
      */
     protected $image = null;
 
-    /**
-     * page
-     *
-     * @var string
-     */
-    protected $page = '';
-
     /**
      * link
      *
@@ -75,12 +74,41 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     protected $content = '';
 
     /**
-     * submenu
+     * items
      *
-     * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\Menu>
+     * @var ObjectStorage<MenuItem>
      * @TYPO3\CMS\Extbase\Annotation\ORM\Cascade("remove")
      */
-    protected $submenu = null;
+    protected $items = null;
+
+    /**
+     * page
+     *
+     * @var Page
+     */
+    protected $page = null;
+
+    /**
+     * __construct
+     */
+    public function __construct()
+    {
+        //Do not remove the next line: It would break the functionality
+        $this->initStorageObjects();
+    }
+
+    /**
+     * Initializes all ObjectStorage properties
+     * Do not modify this method!
+     * It will be rewritten on each save in the extension builder
+     * You may modify the constructor of this class instead
+     *
+     * @return void
+     */
+    protected function initStorageObjects()
+    {
+        $this->items = $this->items ?: new ObjectStorage();
+    }
 
     /**
      * Get type name of the menu item.
@@ -108,7 +136,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      *
      * @return string $title
      */
-    public function getTitle()
+    public function getTitle(): string
     {
         return $this->title;
     }
@@ -119,7 +147,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * @param string $title
      * @return void
      */
-    public function setTitle($title)
+    public function setTitle(string $title): void
     {
         $this->title = $title;
     }
@@ -129,7 +157,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      *
      * @return int $type
      */
-    public function getType()
+    public function getType(): int
     {
         return $this->type;
     }
@@ -140,7 +168,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * @param int $type
      * @return void
      */
-    public function setType($type)
+    public function setType(int $type): void
     {
         $this->type = $type;
     }
@@ -150,7 +178,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      *
      * @return string $subtitle
      */
-    public function getSubtitle()
+    public function getSubtitle(): string
     {
         return $this->subtitle;
     }
@@ -161,7 +189,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * @param string $subtitle
      * @return void
      */
-    public function setSubtitle($subtitle)
+    public function setSubtitle(string $subtitle): void
     {
         $this->subtitle = $subtitle;
     }
@@ -169,9 +197,9 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     /**
      * Returns the image
      *
-     * @return \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
+     * @return FileReference $image
      */
-    public function getImage()
+    public function getImage(): ?FileReference
     {
         return $this->image;
     }
@@ -179,41 +207,20 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
     /**
      * Sets the image
      *
-     * @param \TYPO3\CMS\Extbase\Domain\Model\FileReference $image
+     * @param FileReference $image
      * @return void
      */
-    public function setImage(\TYPO3\CMS\Extbase\Domain\Model\FileReference $image)
+    public function setImage(FileReference $image): void
     {
         $this->image = $image;
     }
 
-    /**
-     * Returns the page
-     *
-     * @return string $page
-     */
-    public function getPage()
-    {
-        return $this->page;
-    }
-
-    /**
-     * Sets the page
-     *
-     * @param string $page
-     * @return void
-     */
-    public function setPage($page)
-    {
-        $this->page = $page;
-    }
-
     /**
      * Returns the link
      *
      * @return string $link
      */
-    public function getLink()
+    public function getLink(): string
     {
         return $this->link;
     }
@@ -224,7 +231,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * @param string $link
      * @return void
      */
-    public function setLink($link)
+    public function setLink(string $link): void
     {
         $this->link = $link;
     }
@@ -234,7 +241,7 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      *
      * @return string $content
      */
-    public function getContent()
+    public function getContent(): string
     {
         return $this->content;
     }
@@ -245,74 +252,72 @@ class MenuItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
      * @param string $content
      * @return void
      */
-    public function setContent($content)
+    public function setContent(string $content): void
     {
         $this->content = $content;
     }
 
     /**
-     * __construct
+     * Adds a MenuItem
+     *
+     * @param MenuItem $item
+     * @return void
      */
-    public function __construct()
+    public function addItem(MenuItem $item): void
     {
-
-        //Do not remove the next line: It would break the functionality
-        $this->initStorageObjects();
+        $this->items->attach($item);
     }
 
     /**
-     * Initializes all ObjectStorage properties
-     * Do not modify this method!
-     * It will be rewritten on each save in the extension builder
-     * You may modify the constructor of this class instead
+     * Removes a MenuItem
      *
+     * @param MenuItem $itemToRemove The MenuItem to be removed
      * @return void
      */
-    protected function initStorageObjects()
+    public function removeItem(MenuItem $itemToRemove): void
     {
-        $this->submenu = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage();
+        $this->items->detach($itemToRemove);
     }
 
     /**
-     * Adds a Menu
+     * Returns the items
      *
-     * @param \NL\NlMenubuilder\Domain\Model\Menu $submenu
-     * @return void
+     * @return ObjectStorage<MenuItem> $items
      */
-    public function addSubmenu(\NL\NlMenubuilder\Domain\Model\Menu $submenu)
+    public function getItems(): ?ObjectStorage
     {
-        $this->submenu->attach($submenu);
+        return $this->items;
     }
 
     /**
-     * Removes a Menu
+     * Sets the items
      *
-     * @param \NL\NlMenubuilder\Domain\Model\Menu $submenuToRemove The Menu to be removed
+     * @param ObjectStorage<MenuItem> $items
      * @return void
      */
-    public function removeSubmenu(\NL\NlMenubuilder\Domain\Model\Menu $submenuToRemove)
+    public function setItems(ObjectStorage $items): void
     {
-        $this->submenu->detach($submenuToRemove);
+        $this->items = $items;
     }
 
     /**
-     * Returns the submenu
+     * Returns the page
      *
-     * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\Menu> $submenu
+     * @return Page $page
      */
-    public function getSubmenu()
+    public function getPage(): ?Page
     {
-        return $this->submenu->current();
+        return $this->page;
     }
 
     /**
-     * Sets the submenu
+     * Sets the page
      *
-     * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NL\NlMenubuilder\Domain\Model\Menu> $submenu
+     * @param Page $page
      * @return void
      */
-    public function setSubmenu(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $submenu)
+    public function setPage(Page $page): void
     {
-        $this->submenu = $submenu;
+        $this->page = $page;
     }
 }
diff --git a/Classes/Domain/Model/MenuItemContent.php b/Classes/Domain/Model/MenuItemContent.php
new file mode 100644
index 0000000..4146f12
--- /dev/null
+++ b/Classes/Domain/Model/MenuItemContent.php
@@ -0,0 +1,10 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+class MenuItemContent extends MenuItem
+{
+
+}
diff --git a/Classes/Domain/Model/MenuItemLink.php b/Classes/Domain/Model/MenuItemLink.php
new file mode 100644
index 0000000..bdf7f31
--- /dev/null
+++ b/Classes/Domain/Model/MenuItemLink.php
@@ -0,0 +1,10 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+class MenuItemLink extends MenuItem
+{
+
+}
diff --git a/Classes/Domain/Model/MenuItemPage.php b/Classes/Domain/Model/MenuItemPage.php
new file mode 100644
index 0000000..f64b1a7
--- /dev/null
+++ b/Classes/Domain/Model/MenuItemPage.php
@@ -0,0 +1,29 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+use TYPO3\CMS\Extbase\Reflection\ObjectAccess;
+
+class MenuItemPage extends MenuItem
+{
+    /**
+     * @return string
+     */
+    public function getTitle(): string
+    {
+        return $this->title ?:
+            ObjectAccess::getPropertyPath($this, 'page.navTitle') ?:
+                ObjectAccess::getPropertyPath($this, 'page.title');
+    }
+
+    /**
+     * @return string
+     */
+    public function getSubtitle(): string
+    {
+        return $this->subtitle ?:
+            ObjectAccess::getPropertyPath($this, 'page.subtitle');
+    }
+}
diff --git a/Classes/Domain/Model/MenuItemSubmenu.php b/Classes/Domain/Model/MenuItemSubmenu.php
new file mode 100644
index 0000000..36ed1d5
--- /dev/null
+++ b/Classes/Domain/Model/MenuItemSubmenu.php
@@ -0,0 +1,10 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+class MenuItemSubmenu extends MenuItem implements MenuInterface
+{
+    use MenuTrait;
+}
diff --git a/Classes/Domain/Model/MenuTrait.php b/Classes/Domain/Model/MenuTrait.php
new file mode 100644
index 0000000..4318402
--- /dev/null
+++ b/Classes/Domain/Model/MenuTrait.php
@@ -0,0 +1,83 @@
+<?php
+
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+use TYPO3\CMS\Extbase\Persistence\ObjectStorage;
+
+trait MenuTrait
+{
+    /**
+     * Returns the title
+     *
+     * @return string $title
+     */
+    public function getTitle(): string
+    {
+        return $this->title;
+    }
+
+    /**
+     * Returns the items
+     *
+     * @return ObjectStorage<MenuItem> items
+     */
+    public function getItems(): ?ObjectStorage
+    {
+        return $this->items;
+    }
+
+    /**
+     * @return array
+     */
+    public function getPageItems(): array
+    {
+        return $this->getItemsByType(MenuItem::TYPE_PAGE);
+    }
+
+    /**
+     * @return array
+     */
+    public function getLinkItems(): array
+    {
+        return $this->getItemsByType(MenuItem::TYPE_LINK);
+    }
+
+    /**
+     * @return array
+     */
+    public function getContentItems(): array
+    {
+        return $this->getItemsByType(MenuItem::TYPE_CONTENT);
+    }
+
+    /**
+     * @return array
+     */
+    public function getSubmenuItems(): array
+    {
+        return $this->getItemsByType(MenuItem::TYPE_SUBMENU);
+    }
+
+    /**
+     * @param int $type
+     * @return array
+     */
+    public function getItemsByType(int $type): array
+    {
+        if ($items = $this->getItems()) {
+
+            return array_filter(
+                $items->toArray(),
+                function ($item) use($type) {
+
+                    /** @var MenuItem $item */
+                    return $item->getType() === $type;
+                }
+            );
+        }
+
+        return [];
+    }
+}
diff --git a/Classes/Domain/Model/Page.php b/Classes/Domain/Model/Page.php
new file mode 100644
index 0000000..f557b2b
--- /dev/null
+++ b/Classes/Domain/Model/Page.php
@@ -0,0 +1,106 @@
+<?php
+declare(strict_types=1);
+
+namespace NL\NlMenubuilder\Domain\Model;
+
+
+/***
+ *
+ * This file is part of the "Menu Builder" Extension for TYPO3 CMS.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ *  (c) 2021 
+ *
+ ***/
+/**
+ * Page
+ */
+class Page extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity
+{
+
+    /**
+     * title
+     * 
+     * @var string
+     */
+    protected $title = '';
+
+    /**
+     * navTitle
+     * 
+     * @var string
+     */
+    protected $navTitle = '';
+
+    /**
+     * subtitle
+     * 
+     * @var string
+     */
+    protected $subtitle = '';
+
+    /**
+     * Returns the title
+     * 
+     * @return string $title
+     */
+    public function getTitle()
+    {
+        return $this->title;
+    }
+
+    /**
+     * Sets the title
+     * 
+     * @param string $title
+     * @return void
+     */
+    public function setTitle($title)
+    {
+        $this->title = $title;
+    }
+
+    /**
+     * Returns the navTitle
+     * 
+     * @return string $navTitle
+     */
+    public function getNavTitle()
+    {
+        return $this->navTitle;
+    }
+
+    /**
+     * Sets the navTitle
+     * 
+     * @param string $navTitle
+     * @return void
+     */
+    public function setNavTitle($navTitle)
+    {
+        $this->navTitle = $navTitle;
+    }
+
+    /**
+     * Returns the subtitle
+     * 
+     * @return string $subtitle
+     */
+    public function getSubtitle()
+    {
+        return $this->subtitle;
+    }
+
+    /**
+     * Sets the subtitle
+     * 
+     * @param string $subtitle
+     * @return void
+     */
+    public function setSubtitle($subtitle)
+    {
+        $this->subtitle = $subtitle;
+    }
+}
diff --git a/Classes/Domain/Repository/MenuGroupRepository.php b/Classes/Domain/Repository/MenuGroupRepository.php
deleted file mode 100644
index b399d90..0000000
--- a/Classes/Domain/Repository/MenuGroupRepository.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-namespace NL\NlMenubuilder\Domain\Repository;
-
-
-/***
- *
- * This file is part of the "Menu Builder" Extension for TYPO3 CMS.
- *
- * For the full copyright and license information, please read the
- * LICENSE.txt file that was distributed with this source code.
- *
- *  (c) 2021 
- *
- ***/
-/**
- * The repository for MenuGroups
- */
-class MenuGroupRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
-{
-}
diff --git a/Classes/Domain/Repository/MenuRepository.php b/Classes/Domain/Repository/MenuRepository.php
index 12eb34c..91cc711 100644
--- a/Classes/Domain/Repository/MenuRepository.php
+++ b/Classes/Domain/Repository/MenuRepository.php
@@ -1,4 +1,6 @@
 <?php
+declare(strict_types=1);
+
 namespace NL\NlMenubuilder\Domain\Repository;
 
 
diff --git a/Classes/Hooks/ItemsProcFunc.php b/Classes/Hooks/ItemsProcFunc.php
index e265887..376f258 100644
--- a/Classes/Hooks/ItemsProcFunc.php
+++ b/Classes/Hooks/ItemsProcFunc.php
@@ -2,7 +2,6 @@
 
 namespace NL\NlMenubuilder\Hooks;
 
-use TYPO3\CMS\Core\Utility\DebugUtility;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Extbase\Object\ObjectManager;
 use TYPO3\CMS\Fluid\View\TemplatePaths;
@@ -11,7 +10,7 @@ class ItemsProcFunc
 {
     protected $extensionKey = 'nl_menubuilder';
 
-    protected $langPrefix = 'LLL:EXT:nl_menubuilder/Resources/Private/Language/locallang_db.xlf:tx_nlmenubuilder_domain_model_menugroup.template.I.';
+    protected $langPrefix = 'LLL:EXT:nl_menubuilder/Resources/Private/Language/locallang_db.xlf:tx_nlmenubuilder_domain_model_menu.template.I.';
 
     /**
      * @var ObjectManager
@@ -44,7 +43,7 @@ class ItemsProcFunc
         $templates = [];
 
         foreach ($paths[TemplatePaths::CONFIG_TEMPLATEROOTPATHS] as $templatePath) {
-            $templatePath .= 'ViewHelpers' . DIRECTORY_SEPARATOR . 'Widget'. DIRECTORY_SEPARATOR . 'Show';
+            $templatePath .= 'ViewHelpers' . DIRECTORY_SEPARATOR . 'Menu'. DIRECTORY_SEPARATOR . 'Render';
             $foundTemplates = GeneralUtility::getFilesInDir($templatePath, 'html');
 
             $templates = array_merge($templates, $foundTemplates);
diff --git a/Classes/ViewHelpers/Menu/Controller/RenderController.php b/Classes/ViewHelpers/Menu/Controller/RenderController.php
new file mode 100644
index 0000000..b23855c
--- /dev/null
+++ b/Classes/ViewHelpers/Menu/Controller/RenderController.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace NL\NlMenubuilder\ViewHelpers\Menu\Controller;
+
+use NL\NlMenubuilder\Domain\Model\Menu;
+use NL\NlMenubuilder\Domain\Repository\MenuRepository;
+use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetController;
+
+class RenderController extends AbstractWidgetController
+{
+    /**
+     * @var MenuRepository
+     */
+    protected $menuRepository;
+
+    /**
+     * Inject menu repository
+     *
+     * @param MenuRepository $repository
+     */
+    public function injectMenuRepository(MenuRepository $repository)
+    {
+        $this->menuRepository = $repository;
+    }
+
+    /**
+     * @return string
+     */
+    public function indexAction(): string
+    {
+        /** @var Menu $menu */
+        $menu = $this->menuRepository->findByIdentifier($this->widgetConfiguration['uid']);
+
+        $this->view->assign('menu', $menu);
+
+        return $this->view->render($menu ? $menu->getTemplate() : Menu::DEFAULT_TEMPLATE);
+    }
+}
diff --git a/Classes/ViewHelpers/GetViewHelper.php b/Classes/ViewHelpers/Menu/GetViewHelper.php
similarity index 89%
rename from Classes/ViewHelpers/GetViewHelper.php
rename to Classes/ViewHelpers/Menu/GetViewHelper.php
index 8ad70e6..a2339f9 100644
--- a/Classes/ViewHelpers/GetViewHelper.php
+++ b/Classes/ViewHelpers/Menu/GetViewHelper.php
@@ -1,7 +1,6 @@
 <?php
 
-
-namespace NL\NlMenubuilder\ViewHelpers;
+namespace NL\NlMenubuilder\ViewHelpers\Menu;
 
 use FluidTYPO3\Vhs\Traits\TemplateVariableViewHelperTrait;
 use NL\NlMenubuilder\Domain\Repository\MenuRepository;
@@ -11,7 +10,6 @@ use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface;
 use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractViewHelper;
 use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic;
 
-
 class GetViewHelper extends AbstractViewHelper
 {
     use CompileWithRenderStatic;
@@ -33,7 +31,7 @@ class GetViewHelper extends AbstractViewHelper
     public function initializeArguments(): void
     {
         $this->registerAsArgument();
-        $this->registerArgument('uuid', 'int', 'UUID of the menu', true, 0);
+        $this->registerArgument('uid', 'int', 'UID of the menu', true, 0);
     }
 
     /**
@@ -52,12 +50,10 @@ class GetViewHelper extends AbstractViewHelper
         $menuRepository = $objectManager->get(MenuRepository::class);
 
         return static::renderChildrenWithVariableOrReturnInputStatic(
-            $menuRepository->findByUid($arguments['uuid'] ?? 0),
+            $menuRepository->findByUid($arguments['uid'] ?? 0),
             $arguments['as'],
             $renderingContext,
             $renderChildrenClosure
         );
-
-
     }
 }
diff --git a/Classes/ViewHelpers/Menu/RenderViewHelper.php b/Classes/ViewHelpers/Menu/RenderViewHelper.php
new file mode 100644
index 0000000..58bedd5
--- /dev/null
+++ b/Classes/ViewHelpers/Menu/RenderViewHelper.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace NL\NlMenubuilder\ViewHelpers\Menu;
+
+use NL\NlMenubuilder\ViewHelpers\Menu\Controller\RenderController;
+use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetViewHelper;
+
+class RenderViewHelper extends AbstractWidgetViewHelper
+{
+    /**
+     * @var RenderController
+     */
+    protected $controller;
+
+    /**
+     * Inject controller
+     *
+     * @param RenderController $controller
+     */
+    public function injectController(RenderController $controller): void
+    {
+        $this->controller = $controller;
+    }
+
+    /**
+     * Initialize arguments
+     *
+     * @return void
+     */
+    public function initializeArguments(): void
+    {
+        $this->registerArgument('uid', 'int', 'UID of the menu', true);
+    }
+
+    /**
+     * @return \TYPO3\CMS\Extbase\Mvc\ResponseInterface
+     */
+    public function render(): \TYPO3\CMS\Extbase\Mvc\ResponseInterface
+    {
+        return $this->initiateSubRequest();
+    }
+}
diff --git a/Classes/ViewHelpers/Widget/Controller/ShowController.php b/Classes/ViewHelpers/Widget/Controller/ShowController.php
deleted file mode 100644
index b34c6e7..0000000
--- a/Classes/ViewHelpers/Widget/Controller/ShowController.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-namespace NL\NlMenubuilder\ViewHelpers\Widget\Controller;
-
-use NL\NlMenubuilder\Domain\Model\Menu;
-use NL\NlMenubuilder\Domain\Repository\MenuRepository;
-use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetController;
-
-class ShowController extends AbstractWidgetController
-{
-    /**
-     * Model object instance of root menu.
-     *
-     * @var Menu
-     */
-    protected $menu;
-
-    /**
-     * Menu group template.
-     *
-     * @var string
-     */
-    protected $template;
-
-    /**
-     * @var MenuRepository
-     */
-    protected $menuRepository;
-
-    /**
-     * Inject menu repository
-     *
-     * @param MenuRepository $controller
-     */
-    public function injectMenuRepository(MenuRepository $menuRepository)
-    {
-        $this->menuRepository = $menuRepository;
-    }
-
-    /**
-     * Main action
-     */
-    public function indexAction()
-    {
-        $this->view->assign('menu', $this->menu);
-
-        return $this->view->render($this->template);
-    }
-
-    /**
-     * @return array
-     */
-    public function initializeAction()
-    {
-        $uuid = $this->widgetConfiguration['uuid'] ?? 0;
-        $menu = $this->menuRepository->findByUid($uuid);
-
-        if (!is_null($menu)) {
-            $this->menu = $menu;
-            $this->template = $this->menu->getMenuGroup()->getTemplate();
-        }
-    }
-}
diff --git a/Classes/ViewHelpers/Widget/ShowViewHelper.php b/Classes/ViewHelpers/Widget/ShowViewHelper.php
deleted file mode 100644
index 28e979f..0000000
--- a/Classes/ViewHelpers/Widget/ShowViewHelper.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-namespace NL\NlMenubuilder\ViewHelpers\Widget;
-
-use NL\NlMenubuilder\ViewHelpers\Widget\Controller\ShowController;
-use TYPO3\CMS\Fluid\Core\Widget\AbstractWidgetViewHelper;
-
-class ShowViewHelper extends AbstractWidgetViewHelper
-{
-    /**
-     * @var ShowController
-     */
-    protected $controller;
-
-    /**
-     * Inject controller
-     *
-     * @param ShowController $controller
-     */
-    public function injectController(ShowController $controller)
-    {
-        $this->controller = $controller;
-    }
-
-    /**
-     * Initialize arguments
-     *
-     * @return void
-     */
-    public function initializeArguments()
-    {
-        $this->registerArgument('uuid', 'int', 'UUID of the menu', true, 0);
-    }
-
-    /**
-     * Render everything
-     *
-     * @param \TYPO3\CMS\Extbase\Persistence\QueryResultInterface $objects
-     * @param int $uuid
-     * @param string $as
-     * @return string
-     */
-    public function render()
-    {
-        return $this->initiateSubRequest();
-    }
-}
diff --git a/Configuration/Extbase/Persistence/Classes.php b/Configuration/Extbase/Persistence/Classes.php
new file mode 100644
index 0000000..10f7bf4
--- /dev/null
+++ b/Configuration/Extbase/Persistence/Classes.php
@@ -0,0 +1,34 @@
+<?php
+
+declare(strict_types = 1);
+
+return [
+    \NL\NlMenubuilder\Domain\Model\Page::class => [
+        'tableName' => 'pages',
+    ],
+    \NL\NlMenubuilder\Domain\Model\MenuItem::class => [
+        'tableName' => 'tx_nlmenubuilder_domain_model_menuitem',
+        'subclasses' => [
+            \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_PAGE => \NL\NlMenubuilder\Domain\Model\MenuItemPage::class,
+            \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_CONTENT => \NL\NlMenubuilder\Domain\Model\MenuItemContent::class,
+            \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_LINK => \NL\NlMenubuilder\Domain\Model\MenuItemLink::class,
+            \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_SUBMENU => \NL\NlMenubuilder\Domain\Model\MenuItemSubmenu::class,
+        ]
+    ],
+    \NL\NlMenubuilder\Domain\Model\MenuItemPage::class => [
+        'tableName' => 'tx_nlmenubuilder_domain_model_menuitem',
+        'recordType' => \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_PAGE
+    ],
+    \NL\NlMenubuilder\Domain\Model\MenuItemContent::class => [
+        'tableName' => 'tx_nlmenubuilder_domain_model_menuitem',
+        'recordType' => \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_CONTENT
+    ],
+    \NL\NlMenubuilder\Domain\Model\MenuItemLink::class => [
+        'tableName' => 'tx_nlmenubuilder_domain_model_menuitem',
+        'recordType' => \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_LINK
+    ],
+    \NL\NlMenubuilder\Domain\Model\MenuItemSubmenu::class => [
+        'tableName' => 'tx_nlmenubuilder_domain_model_menuitem',
+        'recordType' => \NL\NlMenubuilder\Domain\Model\MenuItem::TYPE_SUBMENU
+    ],
+];
diff --git a/Configuration/TCA/tx_nlmenubuilder_domain_model_menu.php b/Configuration/TCA/tx_nlmenubuilder_domain_model_menu.php
index 2d0d3d1..1a2d499 100644
--- a/Configuration/TCA/tx_nlmenubuilder_domain_model_menu.php
+++ b/Configuration/TCA/tx_nlmenubuilder_domain_model_menu.php
@@ -16,17 +16,15 @@ return [
         'delete' => 'deleted',
         'enablecolumns' => [
             'disabled' => 'hidden',
-            'starttime' => 'starttime',
-            'endtime' => 'endtime',
         ],
-        'searchFields' => 'title',
+        'searchFields' => 'title,template',
         'iconfile' => 'EXT:nl_menubuilder/Resources/Public/Icons/tx_nlmenubuilder_domain_model_menu.gif'
     ],
     'interface' => [
-        'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, menu_group, menu_item',
+        'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, template, items',
     ],
     'types' => [
-        '1' => ['showitem' => "menu_group, title, --div--;$ll:menu.tabs.menu_item, menu_item, --div--;$ll:tabs.access, starttime, endtime, sys_language_uid, l10n_parent, l10n_diffsource, hidden"],
+        '1' => ['showitem' => "title, template, --div--;$ll:menu.tabs.menu_item, items, --div--;$ll:tabs.access, starttime, endtime, sys_language_uid, l10n_parent, l10n_diffsource, hidden"],
     ],
     'columns' => [
         'sys_language_uid' => [
@@ -44,7 +42,8 @@ return [
                     ]
                 ],
                 'default' => 0,
-            ],],
+            ],
+        ],
         'l10n_parent' => [
             'displayCond' => 'FIELD:sys_language_uid:>:0',
             'exclude' => true,
@@ -88,35 +87,6 @@ return [
                 ],
             ],
         ],
-        'starttime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
-        'endtime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'range' => [
-                    'upper' => mktime(0, 0, 0, 1, 1, 2038)
-                ],
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
 
         'title' => [
             'exclude' => false,
@@ -127,39 +97,36 @@ return [
                 'eval' => 'trim,required'
             ],
         ],
-        'menu_group' => [
+        'template' => [
             'exclude' => false,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menu.menu_group",
+            'label' => "$ll:tx_nlmenubuilder_domain_model_menu.template",
             'config' => [
                 'type' => 'select',
                 'renderType' => 'selectSingle',
-                'foreign_table' => 'tx_nlmenubuilder_domain_model_menugroup',
-                'default' => 0,
-                'minitems' => 0,
-                'maxitems' => 1,
-                'eval' => 'required'
+                'items' => [],
+                'itemsProcFunc' => 'NL\NlMenubuilder\Hooks\ItemsProcFunc->loadMenuGroupTemplates'
             ],
 
         ],
-        'menu_item' => [
-            'exclude' => true,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menu.menu_item",
+        'items' => [
+            'exclude' => false,
+            'label' => "$ll:tx_nlmenubuilder_domain_model_menu.items",
             'config' => [
                 'type' => 'inline',
-                'allowed' => 'menuitem',
                 'foreign_table' => 'tx_nlmenubuilder_domain_model_menuitem',
+                'foreign_field' => 'menuitem',
                 'foreign_sortby' => 'sorting',
-                'foreign_field' => 'menu',
-                'minitems' => 0,
+                'minitems' => 1,
                 'maxitems' => 99,
                 'appearance' => [
                     'collapseAll' => true,
                     'expandSingle' => true,
                     'levelLinksPosition' => 'bottom',
                     'useSortable' => true,
-                    'showSynchronizationLink' => 1,
-                    'showPossibleLocalizationRecords' => 1,
-                    'showAllLocalizationLink' => 1,
+                    'showPossibleLocalizationRecords' => true,
+                    'showRemovedLocalizationRecords' => true,
+                    'showAllLocalizationLink' => true,
+                    'showSynchronizationLink' => true,
                     'enabledControls' => [
                         'info' => false,
                     ]
@@ -168,10 +135,5 @@ return [
 
         ],
 
-        'menuitem' => [
-            'config' => [
-                'type' => 'passthrough',
-            ],
-        ],
     ],
 ];
diff --git a/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php b/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php
deleted file mode 100644
index 016fdad..0000000
--- a/Configuration/TCA/tx_nlmenubuilder_domain_model_menugroup.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-
-$ll = 'LLL:EXT:nl_menubuilder/Resources/Private/Language/locallang_db.xlf';
-
-return [
-    'ctrl' => [
-        'title' => "$ll:tx_nlmenubuilder_domain_model_menugroup",
-        'label' => 'title',
-        'tstamp' => 'tstamp',
-        'crdate' => 'crdate',
-        'cruser_id' => 'cruser_id',
-        'versioningWS' => true,
-        'languageField' => 'sys_language_uid',
-        'transOrigPointerField' => 'l10n_parent',
-        'transOrigDiffSourceField' => 'l10n_diffsource',
-        'delete' => 'deleted',
-        'enablecolumns' => [
-            'disabled' => 'hidden',
-            'starttime' => 'starttime',
-            'endtime' => 'endtime',
-        ],
-        'searchFields' => 'title',
-        'iconfile' => 'EXT:nl_menubuilder/Resources/Public/Icons/tx_nlmenubuilder_domain_model_menugroup.gif'
-    ],
-    'interface' => [
-        'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, title, template',
-    ],
-    'types' => [
-        '1' => ['showitem' => "title, template, --div--;$ll:tabs.access, starttime, endtime, sys_language_uid, l10n_parent, l10n_diffsource, hidden"],
-    ],
-    'columns' => [
-        'sys_language_uid' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.language',
-            'config' => [
-                'type' => 'select',
-                'renderType' => 'selectSingle',
-                'special' => 'languages',
-                'items' => [
-                    [
-                        'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.allLanguages',
-                        -1,
-                        'flags-multiple'
-                    ]
-                ],
-                'default' => 0,
-            ],
-        ],
-        'l10n_parent' => [
-            'displayCond' => 'FIELD:sys_language_uid:>:0',
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.l18n_parent',
-            'config' => [
-                'type' => 'select',
-                'renderType' => 'selectSingle',
-                'default' => 0,
-                'items' => [
-                    ['', 0],
-                ],
-                'foreign_table' => 'tx_nlmenubuilder_domain_model_menugroup',
-                'foreign_table_where' => 'AND {#tx_nlmenubuilder_domain_model_menugroup}.{#pid}=###CURRENT_PID### AND {#tx_nlmenubuilder_domain_model_menugroup}.{#sys_language_uid} IN (-1,0)',
-            ],
-        ],
-        'l10n_diffsource' => [
-            'config' => [
-                'type' => 'passthrough',
-            ],
-        ],
-        't3ver_label' => [
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.versionLabel',
-            'config' => [
-                'type' => 'input',
-                'size' => 30,
-                'max' => 255,
-            ],
-        ],
-        'hidden' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.visible',
-            'config' => [
-                'type' => 'check',
-                'renderType' => 'checkboxToggle',
-                'items' => [
-                    [
-                        0 => '',
-                        1 => '',
-                        'invertStateDisplay' => true
-                    ]
-                ],
-            ],
-        ],
-        'starttime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
-        'endtime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'range' => [
-                    'upper' => mktime(0, 0, 0, 1, 1, 2038)
-                ],
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
-
-        'title' => [
-            'exclude' => false,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menugroup.title",
-            'config' => [
-                'type' => 'input',
-                'size' => 30,
-                'eval' => 'trim,required'
-            ],
-        ],
-
-        'template' => [
-            'exclude' => false,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menugroup.template",
-            'config' => [
-                'type' => 'select',
-                'renderType' => 'selectSingle',
-                'items' => [
-                    ['-', '']
-                ],
-                'itemsProcFunc' => 'NL\NlMenubuilder\Hooks\ItemsProcFunc->loadMenuGroupTemplates'
-            ],
-        ],
-
-    ],
-];
diff --git a/Configuration/TCA/tx_nlmenubuilder_domain_model_menuitem.php b/Configuration/TCA/tx_nlmenubuilder_domain_model_menuitem.php
index e538760..08384b1 100644
--- a/Configuration/TCA/tx_nlmenubuilder_domain_model_menuitem.php
+++ b/Configuration/TCA/tx_nlmenubuilder_domain_model_menuitem.php
@@ -17,26 +17,37 @@ return [
         'delete' => 'deleted',
         'enablecolumns' => [
             'disabled' => 'hidden',
-            'starttime' => 'starttime',
-            'endtime' => 'endtime',
         ],
-        'searchFields' => 'title,subtitle,page,link,content',
+        'searchFields' => 'title,subtitle,link,content',
         'iconfile' => 'EXT:nl_menubuilder/Resources/Public/Icons/tx_nlmenubuilder_domain_model_menuitem.gif',
         'type' => 'type',
         'typeicon_column' => 'type',
         'typeicon_classes' => [
             'default' => 'ext-menubuilder-menuitem-type-page',
+            '0' => 'ext-menubuilder-menuitem-type-page',
             '1' => 'ext-menubuilder-menuitem-type-link',
             '2' => 'ext-menubuilder-menuitem-type-content',
             '3' => 'ext-menubuilder-menuitem-type-submenu',
         ],
+        'hideTable' => 1,
+    ],
+    'interface' => [
+        'showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, type, title, subtitle, image, link, content, items, page',
     ],
-    'interface' => ['showRecordFieldList' => 'sys_language_uid, l10n_parent, l10n_diffsource, hidden, type, title, subtitle, image, page, link, content'],
     'types' => [
-        '0' => ['showitem' => "type, title, subtitle, page, image, $accessTab"],    // page
-        '1' => ['showitem' => "type, title, subtitle, image, link, $accessTab"],    // link
+        '0' => [
+            'showitem' => "type, title, page, subtitle, image, $accessTab",
+            'columnsOverrides' => [
+                'title' => [
+                    'config' => [
+                        'eval' => 'trim',
+                    ],
+                ],
+            ],
+        ],    // page
+        '1' => ['showitem' => "type, title, link, subtitle, image, $accessTab"],    // link
         '2' => ['showitem' => "type, title, content, $accessTab"],                  // content
-        '3' => ['showitem' => "type, title, submenu, $accessTab"],                  // submenu
+        '3' => ['showitem' => "type, title, items, $accessTab"],                  // submenu
     ],
     'columns' => [
         'sys_language_uid' => [
@@ -99,35 +110,7 @@ return [
                 ],
             ],
         ],
-        'starttime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.starttime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
-        'endtime' => [
-            'exclude' => true,
-            'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_general.xlf:LGL.endtime',
-            'config' => [
-                'type' => 'input',
-                'renderType' => 'inputDateTime',
-                'eval' => 'datetime,int',
-                'default' => 0,
-                'range' => [
-                    'upper' => mktime(0, 0, 0, 1, 1, 2038)
-                ],
-                'behaviour' => [
-                    'allowLanguageSynchronization' => true
-                ]
-            ],
-        ],
+
         'type' => [
             'exclude' => false,
             'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.type",
@@ -220,25 +203,6 @@ return [
             ),
 
         ],
-        'page' => [
-            'exclude' => false,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.page",
-            'config' => [
-                'type' => 'group',
-                'internal_type' => 'db',
-                'allowed' => 'pages',
-                'maxitems' => 1,
-                'minitems' => 1,
-                'size' => 1,
-                'default' => 0,
-                'suggestOptions' => [
-                    'default' => [
-                        'additionalSearchFields' => 'nav_title, alias, url',
-                        'addWhere' => 'AND pages.doktype IN (1, 3, 4)'
-                    ]
-                ]
-            ],
-        ],
         'link' => [
             'exclude' => false,
             'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.link",
@@ -280,32 +244,49 @@ return [
                     ]
                 ],
             ],
-
         ],
-        'submenu' => [
-            'exclude' => true,
-            'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.submenu",
+        'items' => [
+            'exclude' => false,
+            'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.items",
             'config' => [
-                'type' => 'select',
-                'renderType' => 'selectMultipleSideBySide',
-                'foreign_table' => 'tx_nlmenubuilder_domain_model_menu',
-                'size' => 10,
-                'autoSizeMax' => 30,
-                'maxitems' => 1,
+                'type' => 'inline',
+                'foreign_table' => 'tx_nlmenubuilder_domain_model_menuitem',
+                'foreign_field' => 'menuitem',
+                'foreign_sortby' => 'sorting',
                 'minitems' => 1,
-                'multiple' => 0,
-                'fieldControl' => [
-                    'editPopup' => [
-                        'disabled' => false,
-                    ],
-                    'addRecord' => [
-                        'disabled' => false,
-                    ],
-                    'listModule' => [
-                        'disabled' => true,
-                    ],
+                'maxitems' => 99,
+                'appearance' => [
+                    'collapseAll' => true,
+                    'expandSingle' => true,
+                    'levelLinksPosition' => 'bottom',
+                    'useSortable' => true,
+                    'showPossibleLocalizationRecords' => true,
+                    'showRemovedLocalizationRecords' => true,
+                    'showAllLocalizationLink' => true,
+                    'showSynchronizationLink' => true,
+                    'enabledControls' => [
+                        'info' => false,
+                    ]
                 ],
-                'enableMultiSelectFilterTextfield' => true,
+            ],
+        ],
+        'page' => [
+            'exclude' => false,
+            'label' => "$ll:tx_nlmenubuilder_domain_model_menuitem.page",
+            'config' => [
+                'type' => 'group',
+                'internal_type' => 'db',
+                'allowed' => 'pages',
+                'maxitems' => 1,
+                'minitems' => 1,
+                'size' => 1,
+                'default' => 0,
+                'suggestOptions' => [
+                    'default' => [
+                        'additionalSearchFields' => 'nav_title, alias, url',
+                        'addWhere' => 'AND pages.doktype IN (1, 3, 4)'
+                    ]
+                ]
             ],
 
         ],
@@ -315,5 +296,10 @@ return [
                 'type' => 'passthrough',
             ],
         ],
+        'menuitem' => [
+            'config' => [
+                'type' => 'passthrough',
+            ],
+        ],
     ],
 ];
diff --git a/ExtensionBuilder.json b/ExtensionBuilder.json
index a3b783c..de7b5e4 100644
--- a/ExtensionBuilder.json
+++ b/ExtensionBuilder.json
@@ -3,8 +3,8 @@
         {
             "config": {
                 "position": [
-                    982,
-                    274
+                    339,
+                    152
                 ]
             },
             "name": "New Model Object",
@@ -21,7 +21,7 @@
                 "objectsettings": {
                     "addDeletedField": true,
                     "addHiddenField": true,
-                    "addStarttimeEndtimeFields": true,
+                    "addStarttimeEndtimeFields": false,
                     "aggregateRoot": true,
                     "categorizable": false,
                     "description": "",
@@ -43,6 +43,17 @@
                             "propertyName": "title",
                             "propertyType": "String",
                             "uid": "1605171702573"
+                        },
+                        {
+                            "allowedFileTypes": "",
+                            "maxItems": "1",
+                            "propertyDescription": "",
+                            "propertyIsExcludeField": false,
+                            "propertyIsL10nModeExclude": false,
+                            "propertyIsRequired": true,
+                            "propertyName": "template",
+                            "propertyType": "String",
+                            "uid": "1234520526980"
                         }
                     ]
                 },
@@ -53,18 +64,7 @@
                             "lazyLoading": false,
                             "propertyIsExcludeField": false,
                             "relationDescription": "",
-                            "relationName": "menuGroup",
-                            "relationType": "manyToOne",
-                            "relationWire": "[wired]",
-                            "renderType": "selectSingle",
-                            "uid": "910633819500"
-                        },
-                        {
-                            "foreignRelationClass": "",
-                            "lazyLoading": false,
-                            "propertyIsExcludeField": false,
-                            "relationDescription": "",
-                            "relationName": "menuItem",
+                            "relationName": "items",
                             "relationType": "zeroToMany",
                             "relationWire": "[wired]",
                             "renderType": "inline",
@@ -77,59 +77,8 @@
         {
             "config": {
                 "position": [
-                    1258,
-                    14
-                ]
-            },
-            "name": "New Model Object",
-            "value": {
-                "actionGroup": {
-                    "_default0_list": false,
-                    "_default1_show": false,
-                    "_default2_new_create": false,
-                    "_default3_edit_update": false,
-                    "_default4_delete": false,
-                    "customActions": []
-                },
-                "name": "MenuGroup",
-                "objectsettings": {
-                    "addDeletedField": true,
-                    "addHiddenField": true,
-                    "addStarttimeEndtimeFields": true,
-                    "aggregateRoot": true,
-                    "categorizable": false,
-                    "description": "",
-                    "mapToTable": "",
-                    "parentClass": "",
-                    "sorting": false,
-                    "type": "Entity",
-                    "uid": "908718443858"
-                },
-                "propertyGroup": {
-                    "properties": [
-                        {
-                            "allowedFileTypes": "",
-                            "maxItems": "1",
-                            "propertyDescription": "Name of the menu group",
-                            "propertyIsExcludeField": false,
-                            "propertyIsL10nModeExclude": false,
-                            "propertyIsRequired": false,
-                            "propertyName": "title",
-                            "propertyType": "String",
-                            "uid": "1499991436488"
-                        }
-                    ]
-                },
-                "relationGroup": {
-                    "relations": []
-                }
-            }
-        },
-        {
-            "config": {
-                "position": [
-                    471,
-                    365
+                    337,
+                    384
                 ]
             },
             "name": "New Model Object",
@@ -146,8 +95,8 @@
                 "objectsettings": {
                     "addDeletedField": true,
                     "addHiddenField": true,
-                    "addStarttimeEndtimeFields": true,
-                    "aggregateRoot": true,
+                    "addStarttimeEndtimeFields": false,
+                    "aggregateRoot": false,
                     "categorizable": false,
                     "description": "",
                     "mapToTable": "",
@@ -175,7 +124,7 @@
                             "propertyDescription": "Name of the menu item",
                             "propertyIsExcludeField": false,
                             "propertyIsL10nModeExclude": false,
-                            "propertyIsRequired": true,
+                            "propertyIsRequired": false,
                             "propertyName": "title",
                             "propertyType": "String",
                             "uid": "1275033111048"
@@ -202,17 +151,6 @@
                             "propertyType": "Image",
                             "uid": "232675499137"
                         },
-                        {
-                            "allowedFileTypes": "",
-                            "maxItems": "1",
-                            "propertyDescription": "",
-                            "propertyIsExcludeField": false,
-                            "propertyIsL10nModeExclude": false,
-                            "propertyIsRequired": false,
-                            "propertyName": "page",
-                            "propertyType": "String",
-                            "uid": "1319275530787"
-                        },
                         {
                             "allowedFileTypes": "",
                             "maxItems": "1",
@@ -232,7 +170,7 @@
                             "propertyIsL10nModeExclude": false,
                             "propertyIsRequired": false,
                             "propertyName": "content",
-                            "propertyType": "RichText",
+                            "propertyType": "String",
                             "uid": "1242707690455"
                         }
                     ]
@@ -242,15 +180,99 @@
                         {
                             "foreignRelationClass": "",
                             "lazyLoading": false,
-                            "propertyIsExcludeField": true,
+                            "propertyIsExcludeField": false,
                             "relationDescription": "",
-                            "relationName": "submenu",
+                            "relationName": "items",
                             "relationType": "zeroToMany",
                             "relationWire": "[wired]",
                             "renderType": "inline",
-                            "uid": "1611042414700"
+                            "uid": "16209433090"
+                        },
+                        {
+                            "foreignRelationClass": "",
+                            "lazyLoading": false,
+                            "propertyIsExcludeField": false,
+                            "relationDescription": "",
+                            "relationName": "page",
+                            "relationType": "zeroToOne",
+                            "relationWire": "[wired]",
+                            "renderType": "inline",
+                            "uid": "148645428661"
+                        }
+                    ]
+                }
+            }
+        },
+        {
+            "config": {
+                "position": [
+                    40,
+                    407
+                ]
+            },
+            "name": "New Model Object",
+            "value": {
+                "actionGroup": {
+                    "_default0_list": false,
+                    "_default1_show": false,
+                    "_default2_new_create": false,
+                    "_default3_edit_update": false,
+                    "_default4_delete": false,
+                    "customActions": []
+                },
+                "name": "Page",
+                "objectsettings": {
+                    "addDeletedField": false,
+                    "addHiddenField": false,
+                    "addStarttimeEndtimeFields": false,
+                    "aggregateRoot": false,
+                    "categorizable": false,
+                    "description": "",
+                    "mapToTable": "",
+                    "parentClass": "",
+                    "sorting": false,
+                    "type": "Entity",
+                    "uid": "1421122549998"
+                },
+                "propertyGroup": {
+                    "properties": [
+                        {
+                            "allowedFileTypes": "",
+                            "maxItems": "1",
+                            "propertyDescription": "",
+                            "propertyIsExcludeField": false,
+                            "propertyIsL10nModeExclude": false,
+                            "propertyIsRequired": false,
+                            "propertyName": "title",
+                            "propertyType": "String",
+                            "uid": "927540777152"
+                        },
+                        {
+                            "allowedFileTypes": "",
+                            "maxItems": "1",
+                            "propertyDescription": "",
+                            "propertyIsExcludeField": false,
+                            "propertyIsL10nModeExclude": false,
+                            "propertyIsRequired": false,
+                            "propertyName": "navTitle",
+                            "propertyType": "String",
+                            "uid": "880413159436"
+                        },
+                        {
+                            "allowedFileTypes": "",
+                            "maxItems": "1",
+                            "propertyDescription": "",
+                            "propertyIsExcludeField": false,
+                            "propertyIsL10nModeExclude": false,
+                            "propertyIsRequired": false,
+                            "propertyName": "subtitle",
+                            "propertyType": "String",
+                            "uid": "68317247955"
                         }
                     ]
+                },
+                "relationGroup": {
+                    "relations": []
                 }
             }
         }
@@ -267,7 +289,7 @@
             "skipGenerateDocumentationTemplate": false,
             "sourceLanguage": "en",
             "state": "alpha",
-            "targetVersion": "9.5.0-9.5.99",
+            "targetVersion": "10.4.0-10.4.99",
             "version": "1.0.0"
         },
         "extensionKey": "nl_menubuilder",
@@ -282,44 +304,44 @@
         {
             "src": {
                 "moduleId": 0,
-                "terminal": "relationWire_1",
+                "terminal": "relationWire_0",
                 "uid": "498399672732"
             },
             "tgt": {
-                "moduleId": 2,
+                "moduleId": 1,
                 "terminal": "SOURCES",
                 "uid": "461753844786"
             }
         },
         {
             "src": {
-                "moduleId": 0,
+                "moduleId": 1,
                 "terminal": "relationWire_0",
-                "uid": "910633819500"
+                "uid": "16209433090"
             },
             "tgt": {
                 "moduleId": 1,
                 "terminal": "SOURCES",
-                "uid": "908718443858"
+                "uid": "461753844786"
             }
         },
         {
             "src": {
-                "moduleId": 2,
-                "terminal": "relationWire_0",
-                "uid": "1611042414700"
+                "moduleId": 1,
+                "terminal": "relationWire_1",
+                "uid": "148645428661"
             },
             "tgt": {
-                "moduleId": 0,
+                "moduleId": 2,
                 "terminal": "SOURCES",
-                "uid": "782096674115"
+                "uid": "1421122549998"
             }
         }
     ],
     "storagePath": "\/var\/www\/html\/public\/typo3conf\/ext\/",
     "log": {
-        "last_modified": "2021-04-23 09:51",
-        "extension_builder_version": "9.10.3",
-        "be_user": " (1)"
+        "last_modified": "2021-05-05 01:13",
+        "extension_builder_version": "9.11.0",
+        "be_user": " (4)"
     }
 }
\ No newline at end of file
diff --git a/Resources/Private/Language/locallang.xlf b/Resources/Private/Language/locallang.xlf
index ce843a2..d422e49 100644
--- a/Resources/Private/Language/locallang.xlf
+++ b/Resources/Private/Language/locallang.xlf
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <xliff version="1.0">
-	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang" date="2021-04-23T09:51:09Z" product-name="nl_menubuilder">
+	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang" date="2021-05-05T13:13:18Z" product-name="nl_menubuilder">
 		<header/>
 		<body>
 			<trans-unit id="tx_nlmenubuilder_domain_model_menu" resname="tx_nlmenubuilder_domain_model_menu">
@@ -9,21 +9,12 @@
 			<trans-unit id="tx_nlmenubuilder_domain_model_menu.title" resname="tx_nlmenubuilder_domain_model_menu.title">
 				<source>Title</source>
 			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menu.menu_group" resname="tx_nlmenubuilder_domain_model_menu.menu_group">
-				<source>Menu Group</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menu.menu_item" resname="tx_nlmenubuilder_domain_model_menu.menu_item">
-				<source>Menu Item</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup" resname="tx_nlmenubuilder_domain_model_menugroup">
-				<source>Menu Group</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.title" resname="tx_nlmenubuilder_domain_model_menugroup.title">
-				<source>Title</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.template" resname="tx_nlmenubuilder_domain_model_menugroup.template">
+			<trans-unit id="tx_nlmenubuilder_domain_model_menu.template" resname="tx_nlmenubuilder_domain_model_menu.template">
 				<source>Template</source>
 			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_menu.items" resname="tx_nlmenubuilder_domain_model_menu.items">
+				<source>Items</source>
+			</trans-unit>
 			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem" resname="tx_nlmenubuilder_domain_model_menuitem">
 				<source>Menu Item</source>
 			</trans-unit>
@@ -51,6 +42,21 @@
 			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem.submenu" resname="tx_nlmenubuilder_domain_model_menuitem.submenu">
 				<source>Submenu</source>
 			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem.items" resname="tx_nlmenubuilder_domain_model_menuitem.items">
+				<source>Items</source>
+			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page" resname="tx_nlmenubuilder_domain_model_page">
+				<source>Page</source>
+			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.title" resname="tx_nlmenubuilder_domain_model_page.title">
+				<source>Title</source>
+			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.nav_title" resname="tx_nlmenubuilder_domain_model_page.nav_title">
+				<source>Nav Title</source>
+			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.subtitle" resname="tx_nlmenubuilder_domain_model_page.subtitle">
+				<source>Subtitle</source>
+			</trans-unit>
 		</body>
 	</file>
 </xliff>
diff --git a/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menu.xlf b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menu.xlf
index 27093ba..eef14fa 100644
--- a/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menu.xlf
+++ b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menu.xlf
@@ -1,16 +1,16 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <xliff version="1.0">
-	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_csh" date="2021-04-23T09:51:09Z" product-name="nl_menubuilder">
+	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_csh" date="2021-05-05T13:13:18Z" product-name="nl_menubuilder">
 		<header/>
 		<body>
 			<trans-unit id="title.description" resname="title.description">
 				<source>Name of the menu</source>
 			</trans-unit>
-			<trans-unit id="menu_group.description" resname="menu_group.description">
-				<source>menuGroup</source>
+			<trans-unit id="template.description" resname="template.description">
+				<source>template</source>
 			</trans-unit>
-			<trans-unit id="menu_item.description" resname="menu_item.description">
-				<source>menuItem</source>
+			<trans-unit id="items.description" resname="items.description">
+				<source>items</source>
 			</trans-unit>
 		</body>
 	</file>
diff --git a/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menuitem.xlf b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menuitem.xlf
index 121cf96..0ced5ec 100644
--- a/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menuitem.xlf
+++ b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menuitem.xlf
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <xliff version="1.0">
-	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_csh" date="2021-04-23T09:51:09Z" product-name="nl_menubuilder">
+	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_csh" date="2021-05-05T13:13:18Z" product-name="nl_menubuilder">
 		<header/>
 		<body>
 			<trans-unit id="type.description" resname="type.description">
@@ -15,17 +15,17 @@
 			<trans-unit id="image.description" resname="image.description">
 				<source>Optional link image</source>
 			</trans-unit>
-			<trans-unit id="page.description" resname="page.description">
-				<source>page</source>
-			</trans-unit>
 			<trans-unit id="link.description" resname="link.description">
 				<source>link</source>
 			</trans-unit>
 			<trans-unit id="content.description" resname="content.description">
 				<source>content</source>
 			</trans-unit>
-			<trans-unit id="submenu.description" resname="submenu.description">
-				<source>submenu</source>
+			<trans-unit id="items.description" resname="items.description">
+				<source>items</source>
+			</trans-unit>
+			<trans-unit id="page.description" resname="page.description">
+				<source>page</source>
 			</trans-unit>
 		</body>
 	</file>
diff --git a/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_page.xlf b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_page.xlf
new file mode 100644
index 0000000..77e943a
--- /dev/null
+++ b/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_page.xlf
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<xliff version="1.0">
+	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_csh" date="2021-05-05T13:13:18Z" product-name="nl_menubuilder">
+		<header/>
+		<body>
+			<trans-unit id="title.description" resname="title.description">
+				<source>title</source>
+			</trans-unit>
+			<trans-unit id="nav_title.description" resname="nav_title.description">
+				<source>navTitle</source>
+			</trans-unit>
+			<trans-unit id="subtitle.description" resname="subtitle.description">
+				<source>subtitle</source>
+			</trans-unit>
+		</body>
+	</file>
+</xliff>
diff --git a/Resources/Private/Language/locallang_db.xlf b/Resources/Private/Language/locallang_db.xlf
index 31a1067..09afb8e 100644
--- a/Resources/Private/Language/locallang_db.xlf
+++ b/Resources/Private/Language/locallang_db.xlf
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <xliff version="1.0">
-	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_db" date="2021-04-23T09:51:09Z" product-name="nl_menubuilder">
+	<file source-language="en" datatype="plaintext" original="EXT:nl_menubuilder/Resources/Private/Language/locallang_db" date="2021-05-05T13:13:18Z" product-name="nl_menubuilder">
 		<header/>
 		<body>
 			<trans-unit id="tx_nlmenubuilder_domain_model_menu" resname="tx_nlmenubuilder_domain_model_menu">
@@ -9,21 +9,12 @@
 			<trans-unit id="tx_nlmenubuilder_domain_model_menu.title" resname="tx_nlmenubuilder_domain_model_menu.title">
 				<source>Title</source>
 			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menu.menu_group" resname="tx_nlmenubuilder_domain_model_menu.menu_group">
-				<source>Menu Group</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menu.menu_item" resname="tx_nlmenubuilder_domain_model_menu.menu_item">
-				<source>Menu Item</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup" resname="tx_nlmenubuilder_domain_model_menugroup">
-				<source>Menu Group</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.title" resname="tx_nlmenubuilder_domain_model_menugroup.title">
-				<source>Title</source>
-			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.template" resname="tx_nlmenubuilder_domain_model_menugroup.template">
+			<trans-unit id="tx_nlmenubuilder_domain_model_menu.template" resname="tx_nlmenubuilder_domain_model_menu.template">
 				<source>Template</source>
 			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_menu.items" resname="tx_nlmenubuilder_domain_model_menu.items">
+				<source>Items</source>
+			</trans-unit>
 			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem" resname="tx_nlmenubuilder_domain_model_menuitem">
 				<source>Menu Item</source>
 			</trans-unit>
@@ -51,19 +42,24 @@
 			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem.submenu" resname="tx_nlmenubuilder_domain_model_menuitem.submenu">
 				<source>Submenu</source>
 			</trans-unit>
-			<trans-unit id="tabs.access" resname="tabs.access">
-				<source>Access</source>
+			<trans-unit id="tx_nlmenubuilder_domain_model_menuitem.items" resname="tx_nlmenubuilder_domain_model_menuitem.items">
+				<source>Items</source>
 			</trans-unit>
-			<trans-unit id="menu.tabs.menu_item" resname="menu.tabs.menu_item">
-				<source>Menu Items</source>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page" resname="tx_nlmenubuilder_domain_model_page">
+				<source>Page</source>
+			</trans-unit>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.title" resname="tx_nlmenubuilder_domain_model_page.title">
+				<source>Title</source>
 			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.template.I.Index" resname="tx_nlmenubuilder_domain_model_menugroup.template.I.Index">
-				<source>Index</source>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.nav_title" resname="tx_nlmenubuilder_domain_model_page.nav_title">
+				<source>Nav Title</source>
 			</trans-unit>
-			<trans-unit id="tx_nlmenubuilder_domain_model_menugroup.template.I.Show" resname="tx_nlmenubuilder_domain_model_menugroup.template.I.Show">
-				<source>Show</source>
+			<trans-unit id="tx_nlmenubuilder_domain_model_page.subtitle" resname="tx_nlmenubuilder_domain_model_page.subtitle">
+				<source>Subtitle</source>
+			</trans-unit>
+			<trans-unit id="menu.tabs.menu_item" resname="menu.tabs.menu_item">
+				<source>Menu Items</source>
 			</trans-unit>
-
 		</body>
 	</file>
 </xliff>
diff --git a/Resources/Private/Partials/Menu.html b/Resources/Private/Partials/Menu.html
index ebd4fd7..21cd475 100644
--- a/Resources/Private/Partials/Menu.html
+++ b/Resources/Private/Partials/Menu.html
@@ -1,10 +1,14 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
 <div class="menu-builder menu">
     <div class="menu-builder menu-title" hidden>{menu.title}</div>
     <div class="menu-builder menu-item-group">
-        <f:for each="{menu.menuItem}" as="menuItem">
+        <f:for each="{menu.items}" as="menuItem">
             <div class="menu-builder menu-item">
-                <f:render partial="MenuItem/{menuItem.typeName}" arguments="{menuItem:menuItem}" />
+                <f:render partial="MenuItem/{menuItem.typeName}" arguments="{menuItem: menuItem}" />
             </div>
         </f:for>
     </div>
 </div>
+
+</html>
diff --git a/Resources/Private/Partials/MenuItem/Content.html b/Resources/Private/Partials/MenuItem/Content.html
index 7da59a8..8f62e1b 100644
--- a/Resources/Private/Partials/MenuItem/Content.html
+++ b/Resources/Private/Partials/MenuItem/Content.html
@@ -4,3 +4,5 @@
     <div class="menu-builder menu-item-title">{menuItem.title}</div>
     <f:cObject typoscriptObjectPath="lib.tx_nlmenubuilder.contentElementRendering">{menuItem.content}</f:cObject>
 </div>
+
+</html>
diff --git a/Resources/Private/Partials/MenuItem/Link.html b/Resources/Private/Partials/MenuItem/Link.html
index 09fec57..37786f0 100644
--- a/Resources/Private/Partials/MenuItem/Link.html
+++ b/Resources/Private/Partials/MenuItem/Link.html
@@ -3,3 +3,5 @@
 <div class="menu-builder menu-item-link">
     <f:link.typolink parameter="{menuItem.link}">{menuItem.title}</f:link.typolink>
 </div>
+
+</html>
diff --git a/Resources/Private/Partials/MenuItem/Page.html b/Resources/Private/Partials/MenuItem/Page.html
index 8015bb3..f19ac94 100644
--- a/Resources/Private/Partials/MenuItem/Page.html
+++ b/Resources/Private/Partials/MenuItem/Page.html
@@ -1,5 +1,7 @@
 <html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
 
 <div class="menu-builder menu-item-page">
-    <f:link.page pageUid="{menuItem.page}">{menuItem.title}</f:link.page>
+    <f:link.page pageUid="{menuItem.page.uid}">{menuItem.title}</f:link.page>
 </div>
+
+</html>
diff --git a/Resources/Private/Partials/MenuItem/Submenu.html b/Resources/Private/Partials/MenuItem/Submenu.html
index 462732b..a86e17e 100644
--- a/Resources/Private/Partials/MenuItem/Submenu.html
+++ b/Resources/Private/Partials/MenuItem/Submenu.html
@@ -2,6 +2,7 @@
 
 <div class="menu-builder menu-item-submenu">
     <div class="menu-builder menu-item-title">{menuItem.title}</div>
-
-    <f:render partial="Menu" arguments="{menu:menuItem.submenu}" />
+    <f:render partial="Menu" arguments="{menu: menuItem}" />
 </div>
+
+</html>
diff --git a/Resources/Private/Templates/ViewHelpers/Menu/Render/Index.html b/Resources/Private/Templates/ViewHelpers/Menu/Render/Index.html
new file mode 100644
index 0000000..cf6847e
--- /dev/null
+++ b/Resources/Private/Templates/ViewHelpers/Menu/Render/Index.html
@@ -0,0 +1,10 @@
+<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
+
+<div class="menu-builder menu">
+    <div>[DEV]Index Template[DEV]</div>
+    <div class="menu-builder menu-title" hidden>{menu.title}</div>
+
+    <f:render partial="Menu" arguments="{menu: menu}" />
+</div>
+
+</html>
diff --git a/Resources/Private/Templates/ViewHelpers/Widget/Show/Index.html b/Resources/Private/Templates/ViewHelpers/Widget/Show/Index.html
deleted file mode 100644
index 82456c6..0000000
--- a/Resources/Private/Templates/ViewHelpers/Widget/Show/Index.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
-
-<div class="menu-builder menu-group">
-    <div>[DEV]Index Template[DEV]</div>
-    <div class="menu-builder menu-group-title" hidden>{menu.menuGroup.title}</div>
-
-    <f:render partial="Menu" arguments="{menu:menu}" />
-
-</div>
diff --git a/Resources/Private/Templates/ViewHelpers/Widget/Show/Show.html b/Resources/Private/Templates/ViewHelpers/Widget/Show/Show.html
deleted file mode 100644
index fc5006d..0000000
--- a/Resources/Private/Templates/ViewHelpers/Widget/Show/Show.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<html xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers" data-namespace-typo3-fluid="true">
-
-<div class="menu-builder menu-group">
-    <div>[DEV]Show Template[DEV]</div>
-    <div class="menu-builder menu-group-title" hidden>{menu.menuGroup.title}</div>
-
-    <f:render partial="Menu" arguments="{menu:menu}" />
-
-</div>
diff --git a/Resources/Public/Icons/tx_nlmenubuilder_domain_model_menugroup.gif b/Resources/Public/Icons/tx_nlmenubuilder_domain_model_menugroup.gif
deleted file mode 100644
index 4013d7a6ea57d909a3d8d073195b548f09256155..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 5236
zcmZ?wbhEHbY+$ru{J;POia%KxK}^N}+!4M33NDEyi4nd5Hue<-iOJciB??KY>6v-9
z>hE{&S69ePu~iQ@^)>J<a8Aw0^r$LI4X*MFNv_IHwoFmCx8t&@u&T%{$W1LtRH(?!
z$t$+1uvJe?$xlkP$}6@43G1sXfR&VF+p2r!CZ?xaS-DnZriJ9^=O`E&=^2=)+i}?x
zrKDK}xwt`%C`w7QRnI6XDX`MlFE20GD>v55FG|-pw6wI;H!#vSGSV$dNz*N^%qvN(
z(9J7WR=4BgQUIIbl3JWxlvz-cnV+WsGBYtLzqG_wU7bq-YII3v8p7<nVm+`^^^)^*
z^+7WFhI$72>ULZT3N|3Fm48uYYF<eq$T&Mg8?X`-F)jrgeULRs*4lAFgo0e$KuoaL
zLBRkrRDtGzi{>^cC@73tLQ*J?2G?kCkrV<XDIQH-qrpW|2#}<BG<A&z7fB&Nl4AO#
zE=0RFH7~_hy<FYij`9D$zkh!J`uXGgx36D5fBN|0{kyksUcY+z;`y_uPaZ#d_~8D%
zyLWEix_RUJwX0VyU%GhV{JFDdPM<n?;`p(nM-Cr4cwqm&y?b`=+PP!<wyj$>Z`!zF
z{kpYlR<ByQV)?SAOBOF$xM2RgxpQXEnmJ?ow5d}jPntNPzpuBayQ{OKy{)ySxv8<C
zzOJ^Wx~j6GysWgOxTvroKQA{YJ1a9IJuNjQIVmwAJ}x#UIw~?EJS;RMI4Cf{-_O^_
z+so6#-Obg-*~!tt-p<y>+RD<x+|1O(*vQa8Ur$#@TT4?zT}@R*SxHerUQSj<T1rwv
zTuf9%SV&NSpO2S^n~Rf!osE@+nTe5sK?l_S2XzV<nEti&uRQ&hUzvN$t?teD_Wb5=
zd*m_gS?98;N4CA=R(|Dk{af$zD!K3f^lx&uA6fKq2ea06`z4<_d%a4}tP(Xko3;JU
z+ppYaCC8s^iWKz=KmTUi@3nou?|s=7t95?=yFdH>FB6ye;vSLlLUG26f)h6?R&cC*
zVBwi5URfEia;Ilo=SfZ}si!|Rv#MsfRCS)Z)wOKbD=q8ajITYrXYWoref#xqZk=!;
zpO~DQo;jA2&fIzPN5-AW);BiyuR`tGy=Qyp+~t+ilhZcJtLx+YHuv1UcXAv5>Dj-R
z^RMsc&zpb#KL6hL`U@PA7}%w3JXR?jYUTN=k;7rQXllEVc2tYw$3@5f_3|1O{rPcG
z`NTvq*GV=vFQ}ZF$`-n*=H_|TGc&)WT-tN<oZ7j$&q_Z1xp`Lo!oq7ULbkuotdNTJ
zajp$qwQgm|a-Ri$bGoK#39Js?Ty=L#%j!w%Q%rkf(^jv!<r#f(RTTI1z}rO|9^KNt
zawPZA?wX%Zmj2$hKEbNqd5LV#4Bte7c42F|%{#*G9-p%J%*EZ?H>GJz6g0iZbIap7
z-(IKLYDTk~*I!;!8N(K{YwMeE+aq>!d!;|i-Sw!p7RkE3y&&g6CBJ=L>W%EfCuX~w
zo>SWK`Pr##=lOlL-%BfQZ>~NbB=hb2$BT!J)%)jFmp^)RdH3{`c^`lO{BT`=lfQlS
zSBXpiK0m(GFIe}_l6^thbKW0uje1|&6@0k19Y|=_v5knU7OHc9s2~=%BEDu)p+{WX
zD_M?3<w{N46FaX|zL?piw#j2ww?5a72KSwJS2#+jZ*os!viNr+DZ*e?nDPX-V-;e(
zU%ytQO!ipjwxsltrDy7tpk*r_HiqWSd|YI!_d;xXQXIomw$wC*V>7aX9xSa1Keat=
zPX4Zw_l*iqMJ}IYcdPRGtjZ)yrR3UQk_+Y;@pNTO5a64cv6xYWOQWmLZx{EBHZAAO
zWfSUlW-ObM=cT@4o|4w8MQnYuGFJMpifZop@n(n0a?xdvUfFDTSD87>=}OdOpY47I
zEbF)ZI;FvT=+x(b+RG+>@;JKjtH5k+h832xg}0o(w_SVd8<o|sx5~1v&b7MZ75#?i
zVORFrHIZi3dHyfks#ayc?K6J2qdm=fy~WpQ-qHJh?fLz1{+nOYA_ta5d1)WK^G5pZ
z7B2mq534>t`cQDN>elKv2Smk1H%?t6wR@u(Pc^sBKE-h3O}iRTRU4UV9`4?7OjrHt
z#+kW6Hk(hImRqWyv;4o=c$PWyC*up^pJzK=belZK@XTDbH6=#+?0+`y3^X_XdeHxL
zO{rm|w~X=WSn1DOj|&UieltwHeaHA#X0@ydTl%-(Wd_-wbvE26{a>{GLhkJi=6Br9
zdGa0{_@ev$LW6W&#hnzbds>fctpDX5yyNM;PwMH^XK#(4&0iT~ba~^ew?B1fZRWH*
zvDDve$BP|Kd#g0pHlNdZxzV}l$K!hUy4^1~Tia@1->W{U`svDOTN}%D$#>R%IQjpZ
z_0@F!e>U%y+gI7#y~-Z+=UHg>{#v=ai}&q*^{}{p?^BIA{x!dD#-FqMa$0$B-JegF
z?RI@hEYJHN^lp0po_{~}tD?B)y=AEoWopXJW_L*l7s=T6cjwv0?TrezEzBLc)C%fa
zjAyc$ckI93YEW|S_kv$N>IYe+Ce*8mOk(}`&GyIE4~;S<clRck9~Q34k3H~Mk-PYZ
z-Ce_gdgn6=0*o)VE3LZF?q-w3)4JmjlhMQ~KOUujTvH_+b!M&al8AY<-KxV`FH5j3
z_)L<>N{wSLX9`A}<=o=G9C3_$USY3xwX%$=sgt?a#y;OY$!|M;9JhV6v9V4ik$?Y<
zW6uOPP53FCGVwr!lbhM4?lzVb8D@=>4ndzLcB)KgH|{)PqjhOgjf=8|_RABVmkKA8
z*({YaU+HDJs<3-qkE*2iPA}h2>!!^SS*mXR(je}ZQD^a#RIYN(Gt$2%RqpRuqJ6yG
zR^^nz%=KrU8VIYO{S_EIv)x5i$9d<8V5i{rGfy5_tj%c3?b<MVZ;HC~T+MU;O9f}%
zwn;bhU*MNF>C)_LEb5s`PaLZ6ZJznN=Q(%h&m)0#!IPM#E_3?#`(!|+-1=GDebSuW
zH=heh`?M(iVY+MU$%`foB8`ey1Gk*fyqGa(OP6YGpZ@zBm$>$c^cnh|^O_qGEFdN_
z#WMD=Z~u*8sa?g3HDw?8T$TtCmkaIj^t}`mSQU`d^?tcS&a0Str!Fn(nzG7ri<aeQ
z&x`&0idT54YAf&UI+yWGc<pzU`%zo7F8MiaZHtgy9CG#KwaTuo(<*Bp@vXdhJyJ<z
zLqX}vNN&j+$?v|-Y@PZt@$Za?-A)_l^=@4mvsvouNvW?J4c4ylGnKk{CN5ASW^Q6i
zw`D|k)wSi*kG{-m-4(p3>)ZP1T-|{9=xaCHuC*y&eeQHVYx2Feuj{6mhGa(m`x$+N
z?fSMAs(Oj~q2WiDi7l~v_$K_ISHNAq%T;IIt_tj_w12Dhec3G0mV&q8=gyQ~-}0PS
zKclfa=DzFpRd46Ms*0X*@5Y_$EkB>S)}Ft9|9q$TrvITY>+B^GuARNU`{UHRO*d~R
zJdG4z$$IZigSGTSkB}WzoP1{*O>aCrV<WL&y6<(z&*-GXaWj@_mc8lHoRj!&p2R`j
zZEt!UV;-MZn|{DB%%v|`Jn5(3jFt9nZ>x|0PUQU_(coD2VZ!sOWL0&`1+M4bPOP*^
zmDk@{?>p^7cjuneFR3$6hL*jWY-pYKxy`aJc3RPtm3z{D@0+<Kb>FL*vC`?6mPzg{
z-KQ6ETPNbN^?kGRZ1;?RGptPwk$f57#U`{^x_7a=vz7Uzd0%q0ax<^J(7rsKkA1my
z?@Ryuwzx%Ry}P|^UllK~y1FXvYx1h6uMX}}zSbluw)XL-RngN`6?V<*vf*N2um%8H
CGk3E9

diff --git a/Resources/Public/Icons/tx_nlmenubuilder_domain_model_page.gif b/Resources/Public/Icons/tx_nlmenubuilder_domain_model_page.gif
new file mode 100644
index 0000000000000000000000000000000000000000..37ba37b9b3a220018e3a291bf2ee413d0da30ce0
GIT binary patch
literal 230
zcmZ?wbh9u|6krfwIKlt|GBPr{y1EAX`lY3%Jv}|Mz+f2|Yy*R1U~nA_UV_1QFkoO{
zC<YmT4=es;VPs$sVbB370@=yHnylbzxrBMHfbu#e<-Hq@NaRQ#);qgPs7kBt!8=n9
zjy{WNO&L2pMZA^??~3wbV-@Mq+QikvbZA;@1?MbtmYY3&E5lPy-ux-1=*QF`m(X-Y
alg+M4z)H!HgNuuYr<23UbixEh25SHoqD|5O

literal 0
HcmV?d00001

diff --git a/ext_emconf.php b/ext_emconf.php
index e732351..902effd 100644
--- a/ext_emconf.php
+++ b/ext_emconf.php
@@ -3,7 +3,7 @@
 /***************************************************************
  * Extension Manager/Repository config file for ext: "nl_menubuilder"
  *
- * Auto generated by Extension Builder 2021-04-23
+ * Auto generated by Extension Builder 2021-05-05
  *
  * Manual updates:
  * Only the data in the array - anything else is removed by next write.
diff --git a/ext_tables.php b/ext_tables.php
index 41d074a..a3d04b5 100644
--- a/ext_tables.php
+++ b/ext_tables.php
@@ -10,11 +10,11 @@ call_user_func(
         \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_nlmenubuilder_domain_model_menu', 'EXT:nl_menubuilder/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menu.xlf');
         \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_nlmenubuilder_domain_model_menu');
 
-        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_nlmenubuilder_domain_model_menugroup', 'EXT:nl_menubuilder/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menugroup.xlf');
-        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_nlmenubuilder_domain_model_menugroup');
-
         \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_nlmenubuilder_domain_model_menuitem', 'EXT:nl_menubuilder/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_menuitem.xlf');
         \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_nlmenubuilder_domain_model_menuitem');
 
+        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addLLrefForTCAdescr('tx_nlmenubuilder_domain_model_page', 'EXT:nl_menubuilder/Resources/Private/Language/locallang_csh_tx_nlmenubuilder_domain_model_page.xlf');
+        \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::allowTableOnStandardPages('tx_nlmenubuilder_domain_model_page');
+
     }
 );
diff --git a/ext_tables.sql b/ext_tables.sql
index 9372867..ccd7f98 100644
--- a/ext_tables.sql
+++ b/ext_tables.sql
@@ -1,41 +1,23 @@
-#
-# Table structure for table 'tx_nlmenubuilder_domain_model_menu'
-#
 CREATE TABLE tx_nlmenubuilder_domain_model_menu (
 
-	menuitem int(11) unsigned DEFAULT '0' NOT NULL,
-
-	title varchar(255) DEFAULT '' NOT NULL,
-	menu_group int(11) unsigned DEFAULT '0',
-	menu_item int(11) unsigned DEFAULT '0' NOT NULL
-
-);
-
-#
-# Table structure for table 'tx_nlmenubuilder_domain_model_menugroup'
-#
-CREATE TABLE tx_nlmenubuilder_domain_model_menugroup (
-
 	title varchar(255) DEFAULT '' NOT NULL,
-    template varchar(255) DEFAULT '' NOT NULL
+	template varchar(255) DEFAULT '' NOT NULL,
+	items int(11) unsigned DEFAULT '0' NOT NULL
 
 );
 
-#
-# Table structure for table 'tx_nlmenubuilder_domain_model_menuitem'
-#
 CREATE TABLE tx_nlmenubuilder_domain_model_menuitem (
 
 	menu int(11) unsigned DEFAULT '0' NOT NULL,
+	menuitem int(11) unsigned DEFAULT '0' NOT NULL,
 
-    sorting int(11) NOT NULL DEFAULT '0',
 	type int(11) DEFAULT '0' NOT NULL,
 	title varchar(255) DEFAULT '' NOT NULL,
 	subtitle varchar(255) DEFAULT '' NOT NULL,
 	image int(11) unsigned NOT NULL default '0',
-	page varchar(255) DEFAULT '' NOT NULL,
 	link varchar(255) DEFAULT '' NOT NULL,
 	content varchar(255) DEFAULT '' NOT NULL,
-	submenu int(11) unsigned DEFAULT '0' NOT NULL
+	items int(11) unsigned DEFAULT '0' NOT NULL,
+	page int(11) unsigned DEFAULT '0'
 
 );
-- 
GitLab