diff --git a/ajax/backend/independent/get.php b/ajax/backend/independent/get.php
index bf177742c557a228d777ecd6677e7c6363f4b54f..f7ec12162f7fc70bd02cc1ebfe7d46ace24ed36f 100644
--- a/ajax/backend/independent/get.php
+++ b/ajax/backend/independent/get.php
@@ -20,6 +20,10 @@ function parseChildren(&$data)
             }
 
             foreach ($data['children'] as $key => $entry) {
+                if (!class_exists($entry['type'])) {
+                    continue;
+                }
+
                 /* @var $Item \QUI\Menu\Independent\Items\AbstractMenuItem */
                 $Item = new $entry['type']($entry);
                 $icon = QUI\Menu\Independent\Items\Site::itemIcon(); // default
diff --git a/bin/Controls/Independent/Items/Anchor.html b/bin/Controls/Independent/Items/Anchor.html
new file mode 100644
index 0000000000000000000000000000000000000000..9cbb3eac11b649a8bc5088cd61f7857abd3fd1ed
--- /dev/null
+++ b/bin/Controls/Independent/Items/Anchor.html
@@ -0,0 +1,59 @@
+<form>
+
+    <table class="data-table data-table-flexbox site-data">
+        <tbody>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Titel
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="title"
+                           data-qui="controls/lang/InputMultiLang"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Name
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="name"
+                           data-qui="controls/lang/InputMultiLang"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Icon
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="icon"
+                           data-qui="controls/projects/project/media/Input"
+                           data-qui-options-cssclasses="1"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Anker
+                    </span>
+                    <input class="field-container-field" type="text" name="url"/>
+                </label>
+            </td>
+        </tr>
+    </table>
+</form>
diff --git a/bin/Controls/Independent/Items/Anchor.js b/bin/Controls/Independent/Items/Anchor.js
index e39ede9cfdb2b891c1e2881ff79a42200e0dc143..fb02007389a7f29274b46592f96c331faf3c7866 100644
--- a/bin/Controls/Independent/Items/Anchor.js
+++ b/bin/Controls/Independent/Items/Anchor.js
@@ -5,9 +5,12 @@
 define('package/quiqqer/menu/bin/Controls/Independent/Items/Anchor', [
 
     'qui/QUI',
-    'qui/controls/Control'
+    'qui/controls/Control',
+    'Mustache',
 
-], function (QUI, QUIControl) {
+    'text!package/quiqqer/menu/bin/Controls/Independent/Items/Anchor.html'
+
+], function (QUI, QUIControl, Mustache, template) {
     "use strict";
 
     return new Class({
@@ -28,8 +31,65 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Anchor', [
         },
 
         $onInject: function () {
-            this.getElm().addClass();
             this.getElm().set('data-qui', this.getType());
+            this.getElm().set('html', Mustache.render(template, {}));
+
+            let title = this.getAttribute('title');
+            let icon = this.getAttribute('icon');
+            let data = this.getAttribute('data');
+
+            try {
+                title = JSON.decode(title);
+            } catch (e) {
+            }
+
+            try {
+                data = JSON.decode(data);
+            } catch (e) {
+            }
+
+            if (!data) {
+                data = {};
+            }
+
+            if (typeof data.url === 'undefined') {
+                data.url = '';
+            }
+
+            if (typeof data.name === 'undefined') {
+                data.name = '';
+            }
+
+            this.getElm().getElement('[name="icon"]').set('value', icon);
+            this.getElm().getElement('[name="url"]').set('value', data.url);
+
+            QUI.parse(this.getElm()).then(() => {
+                this.$Title = QUI.Controls.getById(
+                    this.getElm().getElement('[name="title"]').get('data-quiid')
+                );
+
+                this.$Name = QUI.Controls.getById(
+                    this.getElm().getElement('[name="name"]').get('data-quiid')
+                );
+
+                this.$Title.setData(title);
+                this.$Name.setData(data.name);
+                
+                this.fireEvent('load');
+            });
+        },
+
+        save: function () {
+            const Form = this.getElm().getElement('form');
+
+            return {
+                title: this.$Title.getValue(),
+                icon : Form.elements.icon.value,
+                data : {
+                    url : Form.elements.url.value,
+                    name: this.$Name.getValue()
+                }
+            };
         }
     });
 });
\ No newline at end of file
diff --git a/bin/Controls/Independent/Items/Custom.js b/bin/Controls/Independent/Items/Custom.js
index 76f1a77eaba13959f045db7a26883b65c1804ba3..430d69523f24a73797720d0439f596e8893e7a48 100644
--- a/bin/Controls/Independent/Items/Custom.js
+++ b/bin/Controls/Independent/Items/Custom.js
@@ -1,6 +1,8 @@
 /**
  * @module package/quiqqer/menu/bin/Controls/Independent/Items/Custom
  * @author www.pcsg.de
+ *
+ * @todo click speichern -> js + textarea
  */
 define('package/quiqqer/menu/bin/Controls/Independent/Items/Custom', [
 
diff --git a/bin/Controls/Independent/Items/Url.html b/bin/Controls/Independent/Items/Url.html
new file mode 100644
index 0000000000000000000000000000000000000000..a9b2a084e980b0ff2dba6f4a7b3a334bd49b0808
--- /dev/null
+++ b/bin/Controls/Independent/Items/Url.html
@@ -0,0 +1,59 @@
+<form>
+
+    <table class="data-table data-table-flexbox site-data">
+        <tbody>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Titel
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="title"
+                           data-qui="controls/lang/InputMultiLang"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Name
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="name"
+                           data-qui="controls/lang/InputMultiLang"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        Icon
+                    </span>
+                    <input class="field-container-field"
+                           type="text"
+                           name="icon"
+                           data-qui="controls/projects/project/media/Input"
+                           data-qui-options-cssclasses="1"
+                    />
+                </label>
+            </td>
+        </tr>
+        <tr>
+            <td>
+                <label class="field-container">
+                    <span class="field-container-item">
+                        URL
+                    </span>
+                    <input class="field-container-field" type="text" name="url"/>
+                </label>
+            </td>
+        </tr>
+    </table>
+</form>
diff --git a/bin/Controls/Independent/Items/Url.js b/bin/Controls/Independent/Items/Url.js
index 34abf6cad34de04a9d5ade3558f96d8ce0737dfe..c61c5c3f83ae9cad6b4e9668fdd9071a43f7a65f 100644
--- a/bin/Controls/Independent/Items/Url.js
+++ b/bin/Controls/Independent/Items/Url.js
@@ -5,9 +5,12 @@
 define('package/quiqqer/menu/bin/Controls/Independent/Items/Url', [
 
     'qui/QUI',
-    'qui/controls/Control'
+    'qui/controls/Control',
+    'Mustache',
 
-], function (QUI, QUIControl) {
+    'text!package/quiqqer/menu/bin/Controls/Independent/Items/Url.html'
+
+], function (QUI, QUIControl, Mustache, template) {
     "use strict";
 
     return new Class({
@@ -28,9 +31,65 @@ define('package/quiqqer/menu/bin/Controls/Independent/Items/Url', [
         },
 
         $onInject: function () {
-            this.getElm().addClass();
             this.getElm().set('data-qui', this.getType());
-        }
+            this.getElm().set('html', Mustache.render(template, {}));
+
+            let title = this.getAttribute('title');
+            let icon = this.getAttribute('icon');
+            let data = this.getAttribute('data');
+
+            try {
+                title = JSON.decode(title);
+            } catch (e) {
+            }
+
+            try {
+                data = JSON.decode(data);
+            } catch (e) {
+            }
+
+            if (!data) {
+                data = {};
+            }
+
+            if (typeof data.url === 'undefined') {
+                data.url = '';
+            }
+
+            if (typeof data.name === 'undefined') {
+                data.name = '';
+            }
+
+            this.getElm().getElement('[name="icon"]').set('value', icon);
+            this.getElm().getElement('[name="url"]').set('value', data.url);
 
+            QUI.parse(this.getElm()).then(() => {
+                this.$Title = QUI.Controls.getById(
+                    this.getElm().getElement('[name="title"]').get('data-quiid')
+                );
+
+                this.$Name = QUI.Controls.getById(
+                    this.getElm().getElement('[name="name"]').get('data-quiid')
+                );
+
+                this.$Title.setData(title);
+                this.$Name.setData(data.name);
+
+                this.fireEvent('load');
+            });
+        },
+
+        save: function () {
+            const Form = this.getElm().getElement('form');
+
+            return {
+                title: this.$Title.getValue(),
+                icon : Form.elements.icon.value,
+                data : {
+                    url : Form.elements.url.value,
+                    name: this.$Name.getValue()
+                }
+            };
+        }
     });
 });
\ No newline at end of file
diff --git a/database.xml b/database.xml
new file mode 100644
index 0000000000000000000000000000000000000000..555e4fbfd0bf9ffd3a9dc38d12faa81af8c40cad
--- /dev/null
+++ b/database.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<database>
+    <global>
+        <table name="menus">
+            <field type="BIGINT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY">id</field>
+            <field type="TEXT DEFAULT NULL">title</field>
+            <field type="TEXT DEFAULT NULL">workingTitle</field>
+            <field type="TEXT NULL">data</field>
+        </table>
+    </global>
+</database>
diff --git a/src/QUI/Menu/Independent/Items/Anchor.php b/src/QUI/Menu/Independent/Items/Anchor.php
index 451e99b87556e1c4d803b2d2980adcc1e4f0830c..862f3d830a6e7c5ac84b4ff8700f620b3dd69f15 100644
--- a/src/QUI/Menu/Independent/Items/Anchor.php
+++ b/src/QUI/Menu/Independent/Items/Anchor.php
@@ -4,8 +4,50 @@
 
 use QUI;
 
+use function is_array;
+
+/**
+ * menu item to an anchor
+ */
 class Anchor extends AbstractMenuItem
 {
+    //region frontend item methods
+
+    /**
+     * @return string
+     */
+    public function getUrl(): string
+    {
+        $data = $this->getCustomData();
+
+        if (is_array($data) && isset($data['url'])) {
+            return $data['url'];
+        }
+
+        return '';
+    }
+
+    /**
+     * @return string
+     */
+    public function getName(): string
+    {
+        $data = $this->getCustomData();
+
+        if (is_array($data) && isset($data['name'])) {
+            return $data['name'];
+        }
+
+        return '';
+    }
+
+    //endregion
+    
+    //region type stuff
+
+    /**
+     * @return string
+     */
     public static function itemTitle(): string
     {
         return QUI::getLocale()->get('quiqqer/menu', 'item.anchor.title');
@@ -19,8 +61,13 @@ public static function itemIcon(): string
         return 'fa fa-anchor';
     }
 
+    /**
+     * @return string
+     */
     public static function itemJsControl(): string
     {
         return 'package/quiqqer/menu/bin/Controls/Independent/Items/Anchor';
     }
+
+    //endregion
 }
diff --git a/src/QUI/Menu/Independent/Items/Site.php b/src/QUI/Menu/Independent/Items/Site.php
index 69bd0eb0474fbfb18f9aefe6ade3b2fa9387a6f4..31af78a7b3edf2d41b461fead8ed759f95a638d3 100644
--- a/src/QUI/Menu/Independent/Items/Site.php
+++ b/src/QUI/Menu/Independent/Items/Site.php
@@ -7,7 +7,7 @@
 use function is_array;
 
 /**
- *
+ * menu item which gets its data from a site
  */
 class Site extends AbstractMenuItem
 {
diff --git a/src/QUI/Menu/Independent/Items/Url.php b/src/QUI/Menu/Independent/Items/Url.php
index c632f1953d5091f8e640ee0a7a9b30a6d41ce64a..53b5402a3eeb548441a285911b0a4aa879ec1791 100644
--- a/src/QUI/Menu/Independent/Items/Url.php
+++ b/src/QUI/Menu/Independent/Items/Url.php
@@ -4,8 +4,14 @@
 
 use QUI;
 
+/**
+ * menu item to an external url
+ */
 class Url extends AbstractMenuItem
 {
+    /**
+     * @return string
+     */
     public static function itemTitle(): string
     {
         return QUI::getLocale()->get('quiqqer/menu', 'item.url.title');
@@ -19,6 +25,9 @@ public static function itemIcon(): string
         return 'fa fa-globe';
     }
 
+    /**
+     * @return string
+     */
     public static function itemJsControl(): string
     {
         return 'package/quiqqer/menu/bin/Controls/Independent/Items/Url';