diff --git a/.github/workflows/nexus-release.yml b/.github/workflows/nexus-release.yml
index 4379ba25459..24db11a46d7 100644
--- a/.github/workflows/nexus-release.yml
+++ b/.github/workflows/nexus-release.yml
@@ -36,12 +36,20 @@ jobs:
     steps:
       - uses: actions/checkout@v4
 
+      - name: DEBUG PRINT
+        run: echo "$MAVEN_USERNAME / $MAVEN_PASSWORD"
+        shell: bash
+        env:
+          MAVEN_USERNAME: ${{ secrets.NEXUS_USERNAME }}
+          MAVEN_PASSWORD: ${{ secrets.NEXUS_PASSWORD }}
+
+
       - name: Set up Maven Central Repository
         uses: actions/setup-java@v4
         with:
           java-version: 21
           distribution: 'temurin'
-          server-id: netgrif-nexus-snapshots
+          server-id: netgrif-nexus-releases
           server-username: MAVEN_USERNAME
           server-password: MAVEN_PASSWORD
 
diff --git a/application-engine/CHANGELOG.md b/application-engine/CHANGELOG.md
index 0af63a40d09..9737f2b3917 100644
--- a/application-engine/CHANGELOG.md
+++ b/application-engine/CHANGELOG.md
@@ -5,7 +5,20 @@ All notable changes to this project will be documented in this file.
 The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres
 to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
 
-Full Changelog: [https://github.com/netgrif/application-engine/commits/v7.0.0](https://github.com/netgrif/application-engine/commits/v7.0.0)
+- Full Changelog: [https://github.com/netgrif/application-engine/commits/v6.5.0](https://github.com/netgrif/application-engine/commits/v6.5.0)
+
+## [6.5.0](https://github.com/netgrif/application-engine/releases/tag/v6.5.0) (2025-02-18)
+
+### Added
+- [NAE-2033] Welcome dashboard
+
+### Changed
+- [NAE-2034] Open first view
+- [NAE-2051] Implement configurable view in menu items
+- [NAE-2039] Search in workflow view
+- [NAE-2052] Integrate ticket view with menu items
+
+- Full Changelog: [https://github.com/netgrif/application-engine/commits/v7.0.0](https://github.com/netgrif/application-engine/commits/v7.0.0)
 
 ## [7.0.0](https://github.com/netgrif/application-engine/releases/tag/v7.0.0) (2024-11-22)
 
diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy
index 871426f7ff1..a387bf2c2b5 100644
--- a/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy
+++ b/application-engine/src/main/groovy/com/netgrif/application/engine/petrinet/domain/dataset/logic/action/ActionDelegate.groovy
@@ -1,6 +1,5 @@
 package com.netgrif.application.engine.petrinet.domain.dataset.logic.action
 
-
 import com.netgrif.application.engine.AsyncRunner
 import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService
 import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase
@@ -29,8 +28,14 @@ import com.netgrif.application.engine.mail.interfaces.IMailAttemptService
 import com.netgrif.application.engine.mail.interfaces.IMailService
 import com.netgrif.application.engine.objects.auth.domain.AbstractUser
 import com.netgrif.application.engine.objects.auth.domain.ActorTransformer
+import com.netgrif.application.engine.menu.services.interfaces.DashboardItemService
+import com.netgrif.application.engine.menu.services.interfaces.DashboardManagementService
+import com.netgrif.application.engine.menu.services.interfaces.IMenuItemService
 import com.netgrif.application.engine.objects.auth.domain.LoggedUser
-import com.netgrif.application.engine.objects.petrinet.domain.*
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString
+import com.netgrif.application.engine.objects.petrinet.domain.PetriNet
+import com.netgrif.application.engine.objects.petrinet.domain.Transition
+import com.netgrif.application.engine.objects.petrinet.domain.UriNode
 import com.netgrif.application.engine.objects.petrinet.domain.dataset.*
 import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.ChangedField
 import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.FieldBehavior
@@ -39,6 +44,7 @@ import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.vali
 import com.netgrif.application.engine.objects.petrinet.domain.dataset.logic.validation.Validation
 import com.netgrif.application.engine.objects.petrinet.domain.roles.ProcessRole
 import com.netgrif.application.engine.objects.petrinet.domain.version.Version
+import com.netgrif.application.engine.objects.utils.MenuItemUtils
 import com.netgrif.application.engine.objects.workflow.domain.Case
 import com.netgrif.application.engine.objects.workflow.domain.Task
 import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.EventOutcome
@@ -47,9 +53,15 @@ import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.data
 import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.dataoutcomes.SetDataEventOutcome
 import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.AssignTaskEventOutcome
 import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.taskoutcomes.TaskEventOutcome
+import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody
 import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody
 import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemConstants
-import com.netgrif.application.engine.objects.workflow.service.InitValueExpressionEvaluator
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.TabbedCaseViewBody
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.TabbedSingleTaskViewBody
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.TabbedTaskViewBody
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.ViewBody
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemBody
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody
 import com.netgrif.application.engine.pdf.generator.config.PdfResourceConfigurationProperties
 import com.netgrif.application.engine.pdf.generator.service.interfaces.IPdfGenerator
 import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService
@@ -59,6 +71,7 @@ import com.netgrif.application.engine.startup.runner.DefaultFiltersRunner
 import com.netgrif.application.engine.startup.runner.FilterRunner
 import com.netgrif.application.engine.utils.FullPageRequest
 import com.netgrif.application.engine.workflow.service.FileFieldInputStream
+import com.netgrif.application.engine.workflow.service.InitValueExpressionEvaluator
 import com.netgrif.application.engine.workflow.service.TaskService
 import com.netgrif.application.engine.workflow.service.interfaces.*
 import com.netgrif.application.engine.workflow.web.responsebodies.MessageResource
@@ -77,7 +90,6 @@ import org.springframework.data.domain.Page
 import org.springframework.data.domain.PageRequest
 import org.springframework.data.domain.Pageable
 
-import java.text.Normalizer
 import java.time.ZoneId
 import java.util.stream.Collectors
 
@@ -190,6 +202,15 @@ class ActionDelegate {
     @Autowired
     SecurityConfigurationProperties.WebProperties webProperties
 
+    @Autowired
+    IMenuItemService menuItemService
+
+    @Autowired
+    DashboardManagementService dashboardManagementService
+
+    @Autowired
+    DashboardItemService dashboardItemService
+
     FrontendActionOutcome Frontend
 
     ModuleHolder NaeModule
@@ -586,7 +607,7 @@ class ActionDelegate {
         },
          where: { Closure<Predicate> closure ->
              [with: { Map dataSet ->
-                 executeTasks(dataSet, taskId, closure)
+                 executeTasks(dataSet, task.stringId, closure)
              }]
          }]
     }
@@ -909,6 +930,10 @@ class ActionDelegate {
         return workflowService.searchOne(predicate(qCase))
     }
 
+    Case findCase(String stringId) {
+        return workflowService.findOne(stringId)
+    }
+
     Case createCase(String identifier, String title = null, String color = "", AbstractUser author = userService.loggedOrSystem, Locale locale = LocaleContextHolder.getLocale(), Map<String, String> params = [:]) {
         return workflowService.createCaseByIdentifier(identifier, title, color, ActorTransformer.toLoggedUser(author), locale, params).getCase()
     }
@@ -1591,36 +1616,15 @@ class ActionDelegate {
     @NamedVariant
     Case createFilter(def title, String query, String type, List<String> allowedNets,
                       String icon, String visibility, def filterMetadata) {
-        if (type == null || type.length() == 0) {
-            throw new IllegalArgumentException("Filter type cannot be null or empty");
-        }
-        type = type.toLowerCase().capitalize()
-        Case filterCase = createCase(FilterRunner.FILTER_PETRI_NET_IDENTIFIER, title as String)
-        filterCase.setIcon(icon)
-        filterCase.dataSet[DefaultFiltersRunner.FILTER_I18N_TITLE_FIELD_ID].value = (title instanceof I18nString) ? title : new I18nString(title as String)
-        filterCase = workflowService.save(filterCase)
-        Task newFilterTask = taskService.findOne(filterCase.tasks.find { it.transition == DefaultFiltersRunner.AUTO_CREATE_TRANSITION }.task)
-        assignTask(newFilterTask)
-
-        def setDataMap = [
-                (DefaultFiltersRunner.FILTER_TYPE_FIELD_ID)      : [
-                        "type" : "enumeration_map",
-                        "value": type
-                ],
-                (DefaultFiltersRunner.FILTER_VISIBILITY_FIELD_ID): [
-                        "type" : "enumeration_map",
-                        "value": visibility
-                ],
-                (DefaultFiltersRunner.FILTER_FIELD_ID)           : [
-                        "type"          : "filter",
-                        "value"         : query,
-                        "allowedNets"   : allowedNets,
-                        "filterMetadata": filterMetadata ?: defaultFilterMetadata(type)
-                ]
-        ]
-        setData(newFilterTask, setDataMap)
-        finishTask(newFilterTask)
-        return workflowService.findOne(filterCase.stringId)
+        FilterBody body = new FilterBody()
+        body.setTitle((title instanceof I18nString) ? title : new I18nString(title as String))
+        body.setQuery(query)
+        body.setType(type)
+        body.setAllowedNets(allowedNets)
+        body.setIcon(icon)
+        body.setVisibility(visibility)
+        body.setMetadata(filterMetadata)
+        return menuItemService.createFilter(body)
     }
 
     /**
@@ -1697,7 +1701,7 @@ class ActionDelegate {
 
     /**
      * deletes filter instance
-     * Note: do not call this method if given instance is referenced in any preference_item instance
+     * Note: do not call this method if given instance is referenced in any menu_item instance
      * @param filter
      * @return
      */
@@ -1723,15 +1727,14 @@ class ActionDelegate {
                 filter.dataSet[FILTER_FIELD_I18N_FILTER_NAME].value as I18nString,
                 null
         )
-        body.setFilter(filter)
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
         body.setUseCustomView(false)
-        body.setCaseRequireTitleInCreation(true)
+        body.setUseTabbedView(true)
+
+        body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
 
-        return createMenuItem(body)
+        return menuItemService.createMenuItem(body)
     }
 
     /**
@@ -1752,15 +1755,15 @@ class ActionDelegate {
                 filter.dataSet[FILTER_FIELD_I18N_FILTER_NAME].value as I18nString,
                 null
         )
-        body.setFilter(filter)
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
+
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
         body.setUseCustomView(false)
-        body.setCaseRequireTitleInCreation(true)
+        body.setUseTabbedView(true)
+
+        body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
 
-        return createMenuItem(body)
+        return menuItemService.createMenuItem(body)
     }
 
     /**
@@ -1782,15 +1785,15 @@ class ActionDelegate {
                 filter.dataSet[FILTER_FIELD_I18N_FILTER_NAME].value as I18nString,
                 null
         )
-        body.setFilter(filter)
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
+
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
         body.setUseCustomView(false)
-        body.setCaseRequireTitleInCreation(true)
+        body.setUseTabbedView(true)
+
+        body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
 
-        return createMenuItem(body)
+        return menuItemService.createMenuItem(body)
     }
 
     /**
@@ -1811,15 +1814,15 @@ class ActionDelegate {
                 filter.dataSet[FILTER_FIELD_I18N_FILTER_NAME].value as I18nString,
                 null
         )
-        body.setFilter(filter)
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
+
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
         body.setUseCustomView(false)
-        body.setCaseRequireTitleInCreation(true)
+        body.setUseTabbedView(true)
 
-        return createMenuItem(body)
+        body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
+
+        return menuItemService.createMenuItem(body)
     }
 
     /**
@@ -1837,7 +1840,7 @@ class ActionDelegate {
      * @param caseDefaultHeaders List of headers displayed in case view
      * @param taskDefaultHeaders List of headers displayed in task view
      *
-     * @return created Case of preference_item
+     * @return created Case of menu_item
      * */
     @NamedVariant
     Case createMenuItem(String uri, String identifier, def name, String icon = "filter_none", Case filter = null,
@@ -1849,59 +1852,38 @@ class ActionDelegate {
                 (name instanceof I18nString) ? name : new I18nString(name as String),
                 icon
         )
-        body.setFilter(filter)
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
+
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
         body.setUseCustomView(false)
-        body.setCaseRequireTitleInCreation(true)
+        body.setUseTabbedView(true)
 
-        return createMenuItem(body)
+        body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
+
+        return menuItemService.createMenuItem(body)
     }
 
     /**
-     * Changes data of provided preference_item instance. These attributes can be changed:
+     * Changes data of provided menu_item instance. These attributes can be changed:
      * <ul>
      * <li> <code>changeMenuItem item allowedRoles { ["role_1":"my_process_id"] }</code>
      * <li> <code>changeMenuItem item bannedRoles { ["role_1":"my_process_id"] }</code>
-     * <li> <code>changeMenuItem item caseDefaultHeaders { ["meta-title","meta-visualId"] }</code>
-     * <li> <code>changeMenuItem item taskDefaultHeaders { ["meta-title","meta-caseId"] }</code>
-     * <li> <code>changeMenuItem item filter { filterCase }</code>
      * <li> <code>changeMenuItem item uri { "/my_node1/my_node2" }</code>
      * <li> <code>changeMenuItem item title { new I18nString("New title") }</code>
      * <li> <code>changeMenuItem item title { "New title" }</code>
      * <li> <code>changeMenuItem item menuIcon { "filter_alt" }</code>
      * <li> <code>changeMenuItem item tabIcon { "filter_none" }</code>
      * </ul>
-     * @param item {@link Case} instance of preference_item.xml
+     * @param item {@link Case} instance of menu_item.xml
      */
     def changeMenuItem(Case item) {
-        [allowedRoles          : { cl ->
-            updateMenuItemRoles(item, cl as Closure, MenuItemConstants.PREFERENCE_ITEM_FIELD_ALLOWED_ROLES.value)
+        [allowedRoles      : { cl ->
+            updateMenuItemRoles(item, cl as Closure, MenuItemConstants.FIELD_ALLOWED_ROLES)
         },
-         bannedRoles           : { cl ->
-             updateMenuItemRoles(item, cl as Closure, MenuItemConstants.PREFERENCE_ITEM_FIELD_BANNED_ROLES.value)
-         },
-         caseDefaultHeaders    : { cl ->
-             String defaultHeaders = cl() as String
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_DEFAULT_HEADERS.value): ["type": "text", "value": defaultHeaders]
-             ])
-         },
-         taskDefaultHeaders    : { cl ->
-             String defaultHeaders = cl() as String
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_DEFAULT_HEADERS.value): ["type": "text", "value": defaultHeaders]
-             ])
+         bannedRoles       : { cl ->
+             updateMenuItemRoles(item, cl as Closure, MenuItemConstants.FIELD_BANNED_ROLES)
          },
-         filter                : { cl ->
-             def filter = cl() as Case
-             setData("change_filter", item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_NEW_FILTER_ID.value): ["type": "text", "value": filter.stringId]
-             ])
-         },
-         uri                   : { cl ->
+         uri               : { cl ->
              def uri = cl() as String
              def aCase = useCase
              if (useCase == null || item.stringId != useCase.stringId) {
@@ -1909,41 +1891,35 @@ class ActionDelegate {
              }
              moveMenuItem(aCase, uri)
          },
-         title                 : { cl ->
+         title             : { cl ->
              def value = cl()
              I18nString newName = (value instanceof I18nString) ? value : new I18nString(value as String)
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME.value): ["type": "i18n", "value": newName]
-             ])
-         },
-         menuIcon              : { cl ->
-             def value = cl()
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_ICON.value): ["type": "text", "value": value]
+             setData(MenuItemConstants.TRANS_SETTINGS_ID, item, [
+                     (MenuItemConstants.FIELD_MENU_NAME): ["type": "i18n", "value": newName]
              ])
          },
-         tabIcon               : { cl ->
+         menuIcon          : { cl ->
              def value = cl()
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_TAB_ICON.value): ["type": "text", "value": value]
+             setData(MenuItemConstants.TRANS_SETTINGS_ID, item, [
+                     (MenuItemConstants.FIELD_MENU_ICON): ["type": "text", "value": value]
              ])
          },
-         requireTitleInCreation: { cl ->
+         tabIcon           : { cl ->
              def value = cl()
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_REQUIRE_TITLE_IN_CREATION.value): ["type": "boolean", "value": value]
+             setData(MenuItemConstants.TRANS_SETTINGS_ID, item, [
+                     (MenuItemConstants.FIELD_TAB_ICON): ["type": "text", "value": value]
              ])
          },
-         useCustomView         : { cl ->
+         useCustomView     : { cl ->
              def value = cl()
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_USE_CUSTOM_VIEW.value): ["type": "boolean", "value": value]
+             setData(MenuItemConstants.TRANS_SETTINGS_ID, item, [
+                     (MenuItemConstants.FIELD_USE_CUSTOM_VIEW): ["type": "boolean", "value": value]
              ])
          },
-         customViewSelector    : { cl ->
+         customViewSelector: { cl ->
              def value = cl()
-             setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, [
-                     (MenuItemConstants.PREFERENCE_ITEM_FIELD_CUSTOM_VIEW_SELECTOR.value): ["type": "text", "value": value]
+             setData(MenuItemConstants.TRANS_SETTINGS_ID, item, [
+                     (MenuItemConstants.FIELD_CUSTOM_VIEW_SELECTOR): ["type": "text", "value": value]
              ])
          }]
 
@@ -1996,7 +1972,14 @@ class ActionDelegate {
                             List<String> defaultHeaders = [],
                             String icon = "",
                             String visibility = DefaultFiltersRunner.FILTER_VISIBILITY_PRIVATE) {
-        Case filter = createFilter(title, query, type, allowedNets, icon, visibility, null)
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle((title instanceof I18nString) ? title : new I18nString(title as String))
+        filterBody.setQuery(query)
+        filterBody.setType(type)
+        filterBody.setAllowedNets(allowedNets)
+        filterBody.setIcon(icon)
+        filterBody.setVisibility(visibility)
+        Case filter = menuItemService.createFilter(filterBody)
         Case menuItem = createMenuItem(uri, identifier, filter, groupName, allowedRoles, bannedRoles, defaultHeaders)
         return menuItem
     }
@@ -2024,13 +2007,20 @@ class ActionDelegate {
                             String icon = "",
                             String visibility = DefaultFiltersRunner.FILTER_VISIBILITY_PRIVATE,
                             Case orgGroup = null) {
-        Case filter = createFilter(title, query, type, allowedNets, icon, visibility, null)
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle((title instanceof I18nString) ? title : new I18nString(title as String))
+        filterBody.setQuery(query)
+        filterBody.setType(type)
+        filterBody.setAllowedNets(allowedNets)
+        filterBody.setIcon(icon)
+        filterBody.setVisibility(visibility)
+        Case filter = menuItemService.createFilter(filterBody)
         Case menuItem = createMenuItem(uri, identifier, filter, allowedRoles, bannedRoles, orgGroup, defaultHeaders)
         return menuItem
     }
 
     /**
-     * Creates filter and preference_item instances with given parameters.
+     * Creates filter and menu_item instances with given parameters.
      *
      * @param uri resource where the item is located in
      * @param itemIdentifier unique identifier of item
@@ -2050,7 +2040,7 @@ class ActionDelegate {
      * @param itemTaskDefaultHeaders List of headers displayed in task view
      * @param filterMetadata metadata for filter. If no value is provided, then default value is used: {@link #defaultFilterMetadata(String)}
      *
-     * @return created {@link Case} instance of preference_item
+     * @return created {@link Case} instance of menu_item
      * */
     @NamedVariant
     Case createFilterInMenu(String uri, String itemIdentifier, def itemAndFilterName, String filterQuery,
@@ -2058,13 +2048,22 @@ class ActionDelegate {
                             String itemAndFilterIcon = "filter_none", Map<String, String> itemAllowedRoles = [:],
                             Map<String, String> itemBannedRoles = [:], List<String> itemCaseDefaultHeaders = [],
                             List<String> itemTaskDefaultHeaders = [], def filterMetadata = null) {
-        Case filter = createFilter(itemAndFilterName, filterQuery, filterType, filterAllowedNets, itemAndFilterIcon, filterVisibility, filterMetadata)
-        Case menuItem = createMenuItem(uri, itemIdentifier, itemAndFilterName, itemAndFilterIcon, filter, itemAllowedRoles, itemBannedRoles, itemCaseDefaultHeaders, itemTaskDefaultHeaders)
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle((itemAndFilterName instanceof I18nString) ? itemAndFilterName : new I18nString(itemAndFilterName as String))
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(itemAndFilterIcon)
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+        Case filter = menuItemService.createFilter(filterBody)
+        Case menuItem = createMenuItem(uri, itemIdentifier, itemAndFilterName, itemAndFilterIcon, filter, itemAllowedRoles,
+                itemBannedRoles, itemCaseDefaultHeaders, itemTaskDefaultHeaders)
         return menuItem
     }
 
     /**
-     * Creates filter and preference_item instances with given parameters.
+     * Creates filter and menu_item instances with given parameters.
      *
      * @param body configuration class for menu item creation
      * @param filterQuery elastic query for filter
@@ -2075,115 +2074,157 @@ class ActionDelegate {
      * @param filterAllowedNets List of allowed nets. Element of list is process identifier
      * @param filterMetadata metadata for filter. If no value is provided, then default value is used: {@link #defaultFilterMetadata(String)}
      *
-     * @return created {@link Case} instance of preference_item
+     * @return created {@link Case} instance of menu_item
      * */
     Case createFilterInMenu(MenuItemBody body, String filterQuery, String filterType, String filterVisibility,
                             List<String> filterAllowedNets = [], def filterMetadata = null) {
-        Case filter = createFilter(body.menuName, filterQuery, filterType, filterAllowedNets, body.menuIcon, filterVisibility, filterMetadata)
-        body.filter = filter
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(body.menuName)
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(body.menuIcon)
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+
+        body.setView(createLegacyMenuItemViews(filterBody))
+        body.setUseTabbedView(true)
+
         Case menuItem = createMenuItem(body)
         return menuItem
     }
 
     Case createMenuItem(MenuItemBody body) {
-        String sanitizedIdentifier = sanitize(body.identifier)
-
-        if (existsMenuItem(sanitizedIdentifier)) {
-            throw new IllegalArgumentException("Menu item identifier $sanitizedIdentifier is not unique!")
-        }
+        return menuItemService.createMenuItem(body)
+    }
 
-        Case parentItemCase = getOrCreateFolderItem(body.path)
-        I18nString newName = body.menuName ?: (body.filter?.dataSet[FILTER_FIELD_I18N_FILTER_NAME].value as I18nString)
+    Case getOrCreateMenuItem(MenuItemBody body) {
+        String identifier = MenuItemUtils.sanitize(body.getIdentifier())
 
-        Case menuItemCase = createCase(FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER, newName?.defaultValue)
-        menuItemCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_ALLOWED_ROLES.value].options = body.allowedRoles
-        menuItemCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_BANNED_ROLES.value].options = body.bannedRoles
-        if (parentItemCase != null) {
-            parentItemCase = appendChildCaseIdAndSave(parentItemCase, menuItemCase.stringId)
+        if (menuItemService.existsMenuItem(identifier)) {
+            return menuItemService.findMenuItem(identifier)
+        }
+        return menuItemService.createMenuItem(body)
+    }
+
+    protected static ViewBody createSingleTaskViewBody(MenuItemBody body, String filterQuery, String transitionId, List<String> filterAllowedNets = [],
+                                                       List<String> defaultHeaders = null, String filterType = "Case",
+                                                       String filterVisibility = "private", def filterMetadata = null) {
+        ViewBody caseViewBody = new TabbedCaseViewBody()
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(body.menuName)
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(body.menuIcon)
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+        caseViewBody.setFilterBody(filterBody)
+        caseViewBody.setAllowHeaderTableMode(true)
+        caseViewBody.setShowCreateCaseButton(false)
+        caseViewBody.setShowMoreMenu(true)
+
+        TabbedSingleTaskViewBody taskViewBody = new TabbedSingleTaskViewBody()
+        taskViewBody.setTransitionId(transitionId)
+        caseViewBody.setChainedView(taskViewBody)
+
+        FilterBody filterTaskBody = new FilterBody()
+        filterTaskBody.setTitle(body.menuName)
+        filterTaskBody.setQuery("") // TODO case id and transition id
+        filterTaskBody.setType("Task")
+        filterTaskBody.setAllowedNets(filterAllowedNets)
+        filterTaskBody.setIcon(body.menuIcon)
+        filterTaskBody.setVisibility(filterVisibility)
+        filterTaskBody.setMetadata(filterMetadata as Map<String, Object>)
+        taskViewBody.setFilterBody(filterTaskBody)
+
+        return caseViewBody
+    }
+
+    protected static ViewBody createDefaultViewBody(MenuItemBody body, String filterQuery, List<String> filterAllowedNets = [],
+                                                    List<String> defaultHeaders = null, String filterType = "Case",
+                                                    String filterVisibility = "private", def filterMetadata = null) {
+
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(body.menuName)
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(body.menuIcon)
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+
+        TabbedTaskViewBody taskViewBody = new TabbedTaskViewBody()
+        taskViewBody.setShowMoreMenu(false)
+        taskViewBody.setViewSearchType("hidden")
+        taskViewBody.setUseDefaultHeaders(false)
+        taskViewBody.setDefaultHeaders(["meta-caseTitleSortable", "meta-title", "meta-user", "meta-assign-date"])
+
+        ViewBody caseViewBody = new TabbedCaseViewBody()
+        caseViewBody.setChainedView(taskViewBody)
+        caseViewBody.setFilterBody(filterBody)
+        caseViewBody.setAllowHeaderTableMode(true)
+        caseViewBody.setShowCreateCaseButton(false)
+        caseViewBody.setShowMoreMenu(true)
+
+        if (defaultHeaders == null) {
+            caseViewBody.setUseDefaultHeaders(false)
+        } else {
+            caseViewBody.setUseDefaultHeaders(true)
+            caseViewBody.setDefaultHeaders(defaultHeaders)
         }
-        menuItemCase = workflowService.save(menuItemCase)
-        Task newItemTask = taskService.findOne(menuItemCase.tasks.find { it.transition == MenuItemConstants.PREFERENCE_ITEM_FIELD_INIT_TRANS_ID.value }.task)
-        String nodePath = createNodePath(body.path, sanitizedIdentifier)
-
-        newItemTask = assignTask(newItemTask)
-        setData(newItemTask, body.toDataSet(parentItemCase.stringId, nodePath))
-        finishTask(newItemTask)
 
-        return workflowService.findOne(menuItemCase.stringId)
+        return caseViewBody
     }
 
-    protected String sanitize(String input) {
-        return Normalizer.normalize(input.trim(), Normalizer.Form.NFD)
-                .replaceAll("[^\\p{ASCII}]", "")
-                .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
-                .replaceAll("[\\W-]+", "-")
-                .toLowerCase()
+    protected ViewBody createLegacyMenuItemViews(Case filterCase, List<String> caseDefaultHeaders = null,
+                                                 List<String> taskDefaultHeaders = null) {
+        FilterBody body = new FilterBody(filterCase)
+        body.setType((String) filterCase?.getFieldValue("filter_type"))
+        return createLegacyMenuItemViews(body, caseDefaultHeaders, taskDefaultHeaders)
     }
 
-    protected String createNodePath(String path, String identifier) {
-        String normalized = path.endsWith(MenuItemConstants.PATH_SEPARATOR.value) && path != MenuItemConstants.PATH_SEPARATOR.value
-                    ? path.substring(0, path.length() - 1)
-                    : path
-        return normalized + MenuItemConstants.PATH_SEPARATOR.value + identifier
-    }
+    protected ViewBody createLegacyMenuItemViews(FilterBody filterBody, List<String> caseDefaultHeaders = null,
+                                                 List<String> taskDefaultHeaders = null) {
+        if (filterBody.getType() == "Case") {
+            ViewBody caseView = new TabbedCaseViewBody()
+            caseView.setFilterBody(filterBody)
+            caseView.setDefaultHeaders(caseDefaultHeaders)
+            caseView.setRequireTitleInCreation(true)
 
-    protected Case getOrCreateFolderItem(String path) {
-        String pathName = path.substring(path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value) + 1);
-        MenuItemBody body = new MenuItemBody(new I18nString(pathName), "folder")
-        return getOrCreateFolderRecursive(path, body)
-    }
+            ViewBody taskView = new TabbedTaskViewBody()
+            taskView.setDefaultHeaders(taskDefaultHeaders)
+            caseView.setChainedView(taskView)
 
-    protected Case getOrCreateFolderRecursive(String path, MenuItemBody body, Case childFolderCase = null) {
-        Case folder = findFolderCase(path)
-        if (folder != null) {
-            if (childFolderCase != null) {
-                folder = appendChildCaseIdAndSave(folder, childFolderCase.stringId)
-                initializeParentId(childFolderCase, folder.stringId)
-            }
-            return folder
+            return caseView
+        } else if (filterBody.getType() == "Task") {
+            ViewBody taskView = new TabbedTaskViewBody()
+            taskView.setFilterBody(filterBody)
+            taskView.setDefaultHeaders(taskDefaultHeaders)
+            return taskView
         }
-
-        folder = createCase(FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER, body.menuName.toString())
-        if (childFolderCase != null) {
-            folder = appendChildCaseIdAndSave(folder, childFolderCase.stringId)
-            initializeParentId(childFolderCase, folder.stringId)
-        } else {
-            folder = workflowService.save(folder)
-        }
-        Task newItemTask = taskService.findOne(folder.tasks.find { it.transition == MenuItemConstants.PREFERENCE_ITEM_FIELD_INIT_TRANS_ID.value }.task)
-        assignTask(newItemTask)
-        setData(newItemTask, body.toDataSet(null, path))
-        finishTask(newItemTask)
-
-        folder = workflowService.findOne(folder.stringId)
-        if (hasParent(path)) {
-            body = new MenuItemBody(new I18nString(nameFromPath(path)), "folder")
-            String parentPath = parentPath(path)
-            getOrCreateFolderRecursive(parentPath, body, folder)
-        }
-
-        return folder
+        return null
     }
 
     protected String nameFromPath(String path) {
-        if (path == null || path == MenuItemConstants.PATH_SEPARATOR.value || path.length() == 0) {
+        if (path == null || path == MenuItemConstants.PATH_SEPARATOR || path.length() == 0) {
             return ""
         }
-        if (path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value) == 0) {
-            return path.replace(MenuItemConstants.PATH_SEPARATOR.value, "")
+        if (path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR) == 0) {
+            return path.replace(MenuItemConstants.PATH_SEPARATOR, "")
         }
-        return path.substring(path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value))
+        return path.substring(path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR))
     }
 
     protected String parentPath(String path) {
-        if (path == null || path == MenuItemConstants.PATH_SEPARATOR.value || path.length() == 0 || path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value) == 0) {
-            return MenuItemConstants.PATH_SEPARATOR.value
+        if (path == null || path == MenuItemConstants.PATH_SEPARATOR || path.length() == 0 || path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR) == 0) {
+            return MenuItemConstants.PATH_SEPARATOR
         }
-        return path.substring(0, path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value))
+        return path.substring(0, path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR))
     }
 
     protected boolean hasParent(String path) {
-        if (path == null || path == MenuItemConstants.PATH_SEPARATOR.value || path.length() == 0) {
+        if (path == null || path == MenuItemConstants.PATH_SEPARATOR || path.length() == 0) {
             return false
         }
         return true
@@ -2194,189 +2235,29 @@ class ActionDelegate {
      * item is moved. Cyclic destination path is forbidden (f.e. from <code>"/my_node"</code> to
      * <code>"/my_node/my_node2"</code>
      *
-     * @param item Instance of preference_item to be moved
+     * @param item Instance of menu_item to be moved
      * @param destUri destination path where the item will be moved. F.e. <code>"/my_new_node"</code>
      * */
     void moveMenuItem(Case item, String destUri) {
-        if (isCyclicNodePath(item, destUri)) {
-            throw new IllegalArgumentException("Cyclic path not supported. Destination path: ${destUri}")
-        }
-
-        List<Case> casesToSave = new ArrayList<>()
-
-        List<String> parentIdList = item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.value].value as ArrayList<String>
-        if (parentIdList != null && parentIdList.size() > 0) {
-            Case oldParent = removeChildItemFromParent(parentIdList[0], item)
-            casesToSave.add(oldParent)
-        }
-
-        Case newParent = getOrCreateFolderItem(destUri)
-        if (newParent != null) {
-            item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.value].value = [newParent.stringId] as ArrayList
-            newParent = appendChildCaseId(newParent, item.stringId)
-            casesToSave.add(newParent)
-        } else {
-            item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.value].value = null
-        }
-
-        item = resolveAndHandleNewNodePath(item, destUri)
-        casesToSave.add(item)
-
-        if (hasChildren(item)) {
-            List<Case> childrenToSave = updateNodeInChildrenFoldersRecursive(item)
-            casesToSave.addAll(childrenToSave)
-        }
-
-        for (aCase in casesToSave) {
-            if (aCase != null) {
-                workflowService.save(aCase)
-            }
-        }
+        menuItemService.moveItem(item, destUri)
     }
 
     /**
-     * Duplicates menu item. It creates new preference_item instance with the same {@link Case#dataSet} as the provided
-     * item instance. The only difference is in title, menu_item_identifier and associations
+     * Duplicates menu item. It creates new menu_item instance with the same dataSet as the provided
+     * item instance. The only difference is in title, menu_item_identifier and associations. Configuration cases are
+     * duplicated as well.
      *
      * @param originItem Menu item instance, which is duplicated
      * @param newTitle Title of menu item, that is displayed in menu and tab. Cannot be empty or null.
      * @param newIdentifier unique menu item identifier
      *
-     * @return duplicated {@link Case} instance of preference_item
+     * @return duplicated {@link Case} instance of menu_item
+     *
+     * @throws IllegalArgumentException if the input data are invalid or the menu item of the new identifier already
+     * exists
      * */
     Case duplicateMenuItem(Case originItem, I18nString newTitle, String newIdentifier) {
-        if (!newIdentifier) {
-            throw new IllegalArgumentException("View item identifier is null!")
-        }
-        if (newTitle == null || newTitle.defaultValue == "") {
-            throw new IllegalArgumentException("Default title is empty")
-        }
-        String sanitizedIdentifier = sanitize(newIdentifier)
-        if (existsMenuItem(sanitizedIdentifier)) {
-            throw new IllegalArgumentException("View item identifier $sanitizedIdentifier is not unique!")
-        }
-
-        Case duplicated = createCase(FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER, newTitle.defaultValue)
-        duplicated.dataSet = originItem.dataSet
-        duplicated.title = newTitle.defaultValue
-        duplicated = workflowService.save(duplicated)
-
-        String newNodePath = createNodePath((String) originItem.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH].value, sanitizedIdentifier)
-
-        Task newItemTask = taskService.findOne(duplicated.tasks.find { it.transition == MenuItemConstants.PREFERENCE_ITEM_FIELD_INIT_TRANS_ID.value }.task)
-        Map updatedDataSet = [
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.value)               : [
-                        "value": null,
-                        "type" : "text"
-                ],
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.value)          : [
-                        "value": null,
-                        "type" : "text"
-                ],
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME.value)                     : [
-                        "value": newTitle,
-                        "type" : "i18n"
-                ],
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_TAB_NAME.value)                      : [
-                        "value": newTitle,
-                        "type" : "i18n"
-                ],
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.value)                     : [
-                        "value": newNodePath,
-                        "type" : "text"
-                ],
-                // Must be reset by button, because we have the same dataSet reference between originItem and duplicated
-                (MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_RESET_CHILD_ITEM_IDS.value): [
-                        "value": 0,
-                        "type" : "button"
-                ],
-        ]
-        assignTask(newItemTask)
-        dataService.setData(newItemTask, ImportHelper.populateDataset(updatedDataSet))
-        finishTask(newItemTask)
-
-        String parentId = (originItem.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.value].value as ArrayList).get(0)
-        if (parentId) {
-            Case parent = workflowService.findOne(parentId)
-            appendChildCaseIdAndSave(parent, duplicated.stringId)
-        }
-        return workflowService.findOne(duplicated.stringId)
-    }
-
-    private List<Case> updateNodeInChildrenFoldersRecursive(Case parentFolder) {
-        List<String> childItemIds = parentFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value as List<String>
-        if (childItemIds == null || childItemIds.isEmpty()) {
-            return new ArrayList<Case>()
-        }
-
-        List<Case> children = workflowService.findAllById(childItemIds)
-
-        List<Case> casesToSave = new ArrayList<>()
-        for (child in children) {
-            child = resolveAndHandleNewNodePath(child, (String) parentFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH].value)
-
-            casesToSave.add(child)
-            casesToSave.addAll(updateNodeInChildrenFoldersRecursive(child))
-        }
-
-        return casesToSave
-    }
-
-    private Case resolveAndHandleNewNodePath(Case folderItem, String destUri) {
-        String newNodePath = resolveNewNodePath(folderItem, destUri)
-        folderItem.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.value].value = newNodePath
-
-        return folderItem
-    }
-
-    private String resolveNewNodePath(Case folderItem, String destUri) {
-        return destUri +
-                MenuItemConstants.PATH_SEPARATOR.value +
-                folderItem.getFieldValue(MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER.value) as String
-    }
-
-    private Case removeChildItemFromParent(String folderId, Case childItem) {
-        Case parentFolder = workflowService.findOne(folderId)
-        (parentFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value as List).remove(childItem.stringId)
-        parentFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_HAS_CHILDREN.value].value = hasChildren(parentFolder)
-        workflowService.save(parentFolder)
-    }
-
-    private boolean isCyclicNodePath(Case folderItem, String destUri) {
-        String oldNodePath = folderItem.getFieldValue(MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.value)
-        return destUri.contains(oldNodePath)
-    }
-
-    private boolean hasChildren(Case folderItem) {
-        List children = folderItem.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value as List
-        return children != null && children.size() > 0
-    }
-
-    private Case appendChildCaseIdAndSave(Case folderCase, String childItemCaseId) {
-        folderCase = appendChildCaseId(folderCase, childItemCaseId)
-        return workflowService.save(folderCase)
-    }
-
-    private Case appendChildCaseId(Case folderCase, String childItemCaseId) {
-        List<String> childIds = folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value as ArrayList<String>
-        if (childIds == null) {
-            folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value = [childItemCaseId] as ArrayList
-        } else {
-            folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value = childIds + [childItemCaseId] as ArrayList
-        }
-
-        folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_HAS_CHILDREN.value].value = hasChildren(folderCase)
-
-        return folderCase
-    }
-
-    private Case initializeParentId(Case childFolderCase, String parentFolderCaseId) {
-        childFolderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.value].value = [parentFolderCaseId] as ArrayList
-        return workflowService.save(childFolderCase)
-    }
-
-    protected Case findFolderCase(String path) {
-        return findCaseElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.nodePath.textValue.keyword:\"$path\"")
+        return menuItemService.duplicateItem(originItem, newTitle, newIdentifier)
     }
 
     /**
@@ -2395,10 +2276,19 @@ class ActionDelegate {
      *
      * @param menuItemIdentifier unique menu item identifier
      *
-     * @return found preference_item instance. Can be null
+     * @return found menu_item instance. Can be null
      */
     Case findMenuItem(String menuItemIdentifier) {
-        return findCaseElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.menu_item_identifier.textValue.keyword:\"$menuItemIdentifier\"" as String)
+        return menuItemService.findMenuItem(menuItemIdentifier)
+    }
+
+    /**
+     * @param path
+     *
+     * @return folder menu item case by provided path
+     * */
+    Case findFolderCase(String path) {
+        return menuItemService.findFolderCase(path)
     }
 
     /**
@@ -2409,7 +2299,7 @@ class ActionDelegate {
      * @return true if the item exists
      * */
     boolean existsMenuItem(String menuItemIdentifier) {
-        return countCasesElastic("processIdentifier:\"$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER\" AND dataSet.menu_item_identifier.fulltextValue.keyword:\"$menuItemIdentifier\"") > 0
+        return menuItemService.existsMenuItem(menuItemIdentifier)
     }
 
     /**
@@ -2418,13 +2308,8 @@ class ActionDelegate {
      * @param name
      * @return
      */
-    Case findMenuItem(String path, String name) {
-        return findCaseElastic("processIdentifier:\"$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER\" AND title.keyword:\"$name\" AND dataSet.nodePath.fulltextValue.keyword:\"$path\"")
-    }
-
-    Case findMenuItemByUriAndIdentifier(String uri, String identifier) {
-        String nodePath = createNodePath(uri, identifier)
-        return findCaseElastic("processIdentifier:\"$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER\" AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.value}.textValue.keyword:\"$nodePath\"")
+    Case findMenuItem(String uri, String name) {
+        return menuItemService.findMenuItem(uri, name)
     }
 
     /**
@@ -2451,32 +2336,55 @@ class ActionDelegate {
         return findMenuItem(uri, name)
     }
 
-    /**
-     * Retrieves filter case from preference_item {@link Case}
-     *
-     * @param item preference_item instance
-     *
-     * @return found filter instance. If not found, <code>null</code> is returned
-     */
-    Case getFilterFromMenuItem(Case item) {
-        String filterId = (item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_FILTER_CASE.value].value as List)[0] as String
-        return filterId ? workflowService.findOne(filterId) : null
+    Case createDashboardManagement(DashboardManagementBody body) {
+        return dashboardManagementService.createDashboardManagement(body)
+    }
+
+    Case createDashboardItem(DashboardItemBody body) {
+        return dashboardItemService.getOrCreate(body)
+    }
+
+    Case findDashboardManagement(String identifier) {
+        return dashboardManagementService.findDashboardManagement(identifier)
+    }
+
+    Case findDashboardItem(String identifier) {
+        return dashboardItemService.findById(identifier)
+    }
+
+    Case updateDashboardManagement(Case managementCase, DashboardManagementBody body) {
+        return dashboardManagementService.updateDashboardManagement(managementCase, body)
+    }
+
+    Case updateDashboardItem(Case itemCase, DashboardItemBody body) {
+        return dashboardItemService.update(itemCase, body)
     }
 
     /**
      * search elastic with string query for first occurrence
-     * @param query
-     * @return
+     * @param query string with search conditions
+     * @return one case which match search condition or null
      */
     Case findCaseElastic(String query) {
         def result = findCasesElastic(query, PageRequest.of(0, 1))
         return result ? result[0] : null
     }
 
+    /**
+     * search elastic with string query for cases and default page size of 100 cases
+     * @param query string with search conditions
+     * @param pageSize optional parameter which decides number of returned elements
+     * @return list of cases (default max 100) which match condition
+     */
+    List<Case> findCasesElastic(String query, int pageSize = 100) {
+        this.findCasesElastic(query, PageRequest.of(0, pageSize))
+    }
+
     /**
      * search elastic with string query for cases
-     * @param query
-     * @return
+     * @param query string with search conditions
+     * @param pageable object which decides page size, page number and order of elements
+     * @return list of cases (size and order depends on pageable object) which match condition
      */
     List<Case> findCasesElastic(String query, Pageable pageable) {
         CaseSearchRequest request = new CaseSearchRequest()
@@ -2485,6 +2393,11 @@ class ActionDelegate {
         return result
     }
 
+    /**
+     * find count of cases which match condition
+     * @param query string with search conditions
+     * @return number of cases which match condition
+     */
     long countCasesElastic(String query) {
         CaseSearchRequest request = new CaseSearchRequest()
         request.query = query
@@ -2497,7 +2410,7 @@ class ActionDelegate {
     }
 
     Map<String, I18nString> collectRolesForPreferenceItem(List<ProcessRole> roles) {
-        return roles.collectEntries { role ->
+        return roles.collectEntries { ProcessRole role ->
             if (role.isGlobal()) {
                 return [(role.importId + ":" + GLOBAL_ROLE), ("$role.name (🌍 Global role)" as String)]
             } else {
@@ -2510,7 +2423,7 @@ class ActionDelegate {
     Map<String, I18nString> collectRolesForPreferenceItem(Map<String, String> roles) {
         Map<String, PetriNet> temp = [:]
         return roles.collectEntries { entry ->
-            if (entry.value.equals(GLOBAL_ROLE)) {
+            if (entry.value == GLOBAL_ROLE) {
                 Set<ProcessRole> findGlobalRole = processRoleService.findAllByImportId(ProcessRole.GLOBAL + entry.key)
                 if (findGlobalRole == null || findGlobalRole.isEmpty()) {
                     return
@@ -2580,25 +2493,24 @@ class ActionDelegate {
     }
 
     @Deprecated
-    Case createOrUpdateMenuItem(String id, String uri, String type, String query, String icon, String title, List<String> allowedNets, Map<String, String> roles = [:], Map<String, String> bannedRoles = [:], Case group = null, List<String> defaultHeaders = []) {
-        Case menuItem = findMenuItem(sanitize(id))
-        if (!menuItem) {
-            Case filter = createFilter(title, query, type, allowedNets, icon, DefaultFiltersRunner.FILTER_VISIBILITY_PRIVATE, null)
-            return createMenuItem(uri, id, title, icon, filter, roles, bannedRoles)
-        } else {
-            Case filter = getFilterFromMenuItem(menuItem)
-            changeFilter filter query { query }
-            changeFilter filter allowedNets { allowedNets }
-            changeFilter filter title { title }
-            changeFilter filter icon { icon }
-            changeMenuItem menuItem allowedRoles { roles }
-            changeMenuItem menuItem bannedRoles { bannedRoles }
-            changeMenuItem menuItem defaultHeaders { defaultHeaders.join(",") }
-            changeMenuItem menuItem uri { uri }
-            changeMenuItem menuItem filter { filter }
-
-            return workflowService.findOne(menuItem.stringId)
-        }
+    Case createOrUpdateMenuItem(String id, String uri, String type, String query, String icon, String title, List<String> allowedNets,
+                                Map<String, String> roles = [:], Map<String, String> bannedRoles = [:], Case group = null,
+                                List<String> defaultHeaders = []) {
+        MenuItemBody body = new MenuItemBody(uri, id, title, icon)
+        body.setAllowedRoles(collectRolesForPreferenceItem(roles))
+        body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
+        body.setUseTabbedView(true)
+
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(new I18nString(title as String))
+        filterBody.setQuery(query)
+        filterBody.setType(type)
+        filterBody.setAllowedNets(allowedNets)
+        filterBody.setIcon(icon)
+        filterBody.setVisibility(DefaultFiltersRunner.FILTER_VISIBILITY_PRIVATE)
+
+        body.setView(createLegacyMenuItemViews(filterBody, defaultHeaders))
+        return menuItemService.createOrUpdateMenuItem(body)
     }
 
     /**
@@ -2618,15 +2530,19 @@ class ActionDelegate {
      *
      * @return created or updated menu item instance
      * */
+    @Deprecated(since = "6.5.0")
     Case createOrUpdateMenuItem(String uri, String identifier, def name, String icon = "filter_none", Case filter = null,
                                 Map<String, String> allowedRoles = [:], Map<String, String> bannedRoles = [:],
                                 List<String> caseDefaultHeaders = [], List<String> taskDefaultHeaders = []) {
         MenuItemBody body = new MenuItemBody(uri, identifier, name, icon)
         body.setAllowedRoles(collectRolesForPreferenceItem(allowedRoles))
         body.setBannedRoles(collectRolesForPreferenceItem(bannedRoles))
-        body.setCaseDefaultHeaders(caseDefaultHeaders)
-        body.setTaskDefaultHeaders(taskDefaultHeaders)
-        body.setFilter(filter)
+        body.setUseTabbedView(true)
+        if (filter == null) {
+            body.setView(createLegacyMenuItemViews(new FilterBody(null), caseDefaultHeaders, taskDefaultHeaders))
+        } else {
+            body.setView(createLegacyMenuItemViews(filter, caseDefaultHeaders, taskDefaultHeaders))
+        }
 
         return createOrUpdateMenuItem(body)
     }
@@ -2656,6 +2572,7 @@ class ActionDelegate {
      *
      * @return created or updated menu item instance along with the actual filter
      * */
+    @Deprecated(since = "6.5.0")
     Case createOrUpdateMenuItemAndFilter(String uri, String itemIdentifier, def itemAndFilterName, String filterQuery,
                                          String filterType, String filterVisibility, List<String> filterAllowedNets = [],
                                          String itemAndFilterIcon = "filter_none", Map<String, String> itemAllowedRoles = [:],
@@ -2664,11 +2581,19 @@ class ActionDelegate {
         MenuItemBody body = new MenuItemBody(uri, itemIdentifier, itemAndFilterName, itemAndFilterIcon)
         body.allowedRoles = collectRolesForPreferenceItem(itemAllowedRoles)
         body.bannedRoles = collectRolesForPreferenceItem(itemBannedRoles)
-        body.caseDefaultHeaders = itemCaseDefaultHeaders
-        body.taskDefaultHeaders = itemTaskDefaultHeaders
+        body.setUseTabbedView(true)
+
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle((itemAndFilterName instanceof I18nString) ? itemAndFilterName : new I18nString(itemAndFilterName as String))
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(itemAndFilterIcon)
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+        body.setView(createLegacyMenuItemViews(filterBody, itemCaseDefaultHeaders, itemTaskDefaultHeaders))
 
-        return createOrUpdateMenuItemAndFilter(body, filterQuery, filterType, filterVisibility, filterAllowedNets,
-                filterMetadata)
+        return menuItemService.createOrUpdateMenuItem(body)
     }
 
     /**
@@ -2679,12 +2604,7 @@ class ActionDelegate {
      * @return created or updated menu item instance
      * */
     Case createOrUpdateMenuItem(MenuItemBody body) {
-        Case item = findMenuItem(sanitize(body.identifier))
-        if (item) {
-            return updateMenuItem(item, body)
-        } else {
-            return createMenuItem(body)
-        }
+        return menuItemService.createOrUpdateMenuItem(body)
     }
 
     /**
@@ -2703,27 +2623,22 @@ class ActionDelegate {
      *
      * @return created or updated menu item instance along with the actual filter
      * */
+    @Deprecated(since = "6.5.0")
     Case createOrUpdateMenuItemAndFilter(MenuItemBody body, String filterQuery, String filterType, String filterVisibility,
                                          List<String> filterAllowedNets = [], def filterMetadata = null) {
-        Case item = findMenuItem(sanitize(body.identifier))
-        if (item) {
-            Case filter = getFilterFromMenuItem(item)
-            if (filter) {
-                changeFilter filter query { filterQuery }
-                changeFilter filter visibility { filterVisibility }
-                changeFilter filter allowedNets { filterAllowedNets }
-                changeFilter filter filterMetadata { filterMetadata ?: defaultFilterMetadata(filterType) }
-                changeFilter filter title { body.menuName }
-                changeFilter filter icon { body.menuIcon }
-            } else {
-                body.filter = createFilter(body.menuName, filterQuery, filterType, filterAllowedNets, body.menuIcon,
-                        filterVisibility, filterMetadata)
-            }
+        body.setUseTabbedView(true)
 
-            return updateMenuItem(item, body)
-        } else {
-            return createFilterInMenu(body, filterQuery, filterType, filterVisibility, filterAllowedNets, filterMetadata)
-        }
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(body.getMenuName())
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(body.getMenuIcon())
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+        body.setView(createLegacyMenuItemViews(filterBody))
+
+        return menuItemService.createOrUpdateMenuItem(body)
     }
 
     /**
@@ -2734,12 +2649,7 @@ class ActionDelegate {
      * @return created or existing menu item instance
      * */
     Case createOrIgnoreMenuItem(MenuItemBody body) {
-        Case item = findMenuItem(body.identifier)
-        if (!item) {
-            return createMenuItem(body)
-        } else {
-            return item
-        }
+        return menuItemService.createOrIgnoreMenuItem(body)
     }
 
     /**
@@ -2750,22 +2660,23 @@ class ActionDelegate {
      *
      * @return created or existing menu item instance
      * */
+    @Deprecated(since = "6.5.0")
     Case createOrIgnoreMenuItemAndFilter(MenuItemBody body, String filterQuery, String filterType, String filterVisibility,
                                          List<String> filterAllowedNets = [], def filterMetadata = null) {
-        Case item = findMenuItem(body.identifier)
-        if (!item) {
-            return createFilterInMenu(body, filterQuery, filterType, filterVisibility, filterAllowedNets, filterMetadata)
-        } else {
-            Case filter = getFilterFromMenuItem(item)
-            if (!filter) {
-                filter = createFilter(body.menuName, filterQuery, filterType, filterAllowedNets, body.menuIcon, filterVisibility,
-                        filterMetadata)
-                changeMenuItem item filter { filter }
-                return workflowService.findOne(item.stringId)
-            } else {
-                return item
-            }
-        }
+        body.setUseTabbedView(true)
+
+        FilterBody filterBody = new FilterBody()
+        filterBody.setTitle(body.getMenuName())
+        filterBody.setQuery(filterQuery)
+        filterBody.setType(filterType)
+        filterBody.setAllowedNets(filterAllowedNets)
+        filterBody.setIcon(body.getMenuIcon())
+        filterBody.setVisibility(filterVisibility)
+        filterBody.setMetadata(filterMetadata as Map<String, Object>)
+
+        body.setView(createLegacyMenuItemViews(filterBody))
+
+        return menuItemService.createOrIgnoreMenuItem(body)
     }
 
     /**
@@ -2777,18 +2688,15 @@ class ActionDelegate {
      * @return updated menu item instance
      * */
     Case updateMenuItem(Case item, MenuItemBody body) {
-        def outcome = setData(MenuItemConstants.PREFERENCE_ITEM_SETTINGS_TRANS_ID.value, item, body.toDataSet())
-        return outcome.case
+        return menuItemService.updateMenuItem(item, body)
     }
 
     static Map defaultFilterMetadata(String type) {
-        return [
-                "searchCategories"       : [],
-                "predicateMetadata"      : [],
-                "filterType"             : type,
-                "defaultSearchCategories": true,
-                "inheritAllowedNets"     : false
-        ]
+        return FilterBody.getDefaultMetadata(type)
+    }
+
+    void removeChildItemFromParent(String folderId, Case childItem) {
+        menuItemService.removeChildItemFromParent(folderId, childItem)
     }
 
     String makeUrl(String publicViewUrl = webProperties.publicWeb.url, String identifier) {
@@ -2803,8 +2711,8 @@ class ActionDelegate {
     }
 
     List<String> splitUriPath(String path) {
-        String rootPath = MenuItemConstants.PATH_SEPARATOR.value
-        String[] splitPath = path.split(MenuItemConstants.PATH_SEPARATOR.value)
+        String rootPath = MenuItemConstants.PATH_SEPARATOR
+        String[] splitPath = path.split(MenuItemConstants.PATH_SEPARATOR)
         if (splitPath.length == 0 && path == rootPath) {
             splitPath = [rootPath]
         } else if (splitPath.length == 0) {
@@ -2824,12 +2732,12 @@ class ActionDelegate {
 
         options.putAll(splitPathList.collectEntries { [(it): new I18nString(it)] })
 
-        Case caseByPath = findCaseElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.nodePath.textValue.keyword:\"$path\"")
-        Set<String> childrenIds = caseByPath.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.value].value as Set
+        Case caseByPath = findCaseElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.nodePath.textValue.keyword:\"$path\"")
+        Set<String> childrenIds = caseByPath.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as Set
         if (!childrenIds.isEmpty()) {
             for (String id : childrenIds) {
                 Case childFolderCase = workflowService.findOne(id)
-                options.put(childFolderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_NAME.value].value as String, new I18nString(childFolderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_NAME.value].value as String))
+                options.put(childFolderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS.value].value as String, new I18nString(childFolderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_NAME.value].value as String))
             }
         }
 
@@ -2841,7 +2749,7 @@ class ActionDelegate {
         if (uncheckedPath == "") {
             return rootPath
         }
-        int lastIdx = uncheckedPath.lastIndexOf(MenuItemConstants.PATH_SEPARATOR.value)
+        int lastIdx = uncheckedPath.lastIndexOf(MenuItemConstants.PATH_SEPARATOR)
         if (lastIdx == -1) {
             return rootPath
         }
diff --git a/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy b/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy
index 17f7a03ad85..93aacd729f5 100644
--- a/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy
+++ b/application-engine/src/main/groovy/com/netgrif/application/engine/startup/ImportHelper.groovy
@@ -248,6 +248,22 @@ class ImportHelper {
         superCreator.setAllToSuperUser()
     }
 
+    Optional<PetriNet> importProcess(String message, String netIdentifier, String netFileName) {
+        PetriNet filter = petriNetService.getNewestVersionByIdentifier(netIdentifier)
+        if (filter != null) {
+            log.info("${message} has already been imported.")
+            return Optional.of(filter)
+        }
+
+        Optional<PetriNet> filterNet = this.createNet(netFileName, VersionType.MAJOR, ActorTransformer.toLoggedUser(userService.getSystem()))
+
+        if (!filterNet.isPresent()) {
+            log.error("Import of ${message} failed!")
+        }
+
+        return filterNet
+    }
+
     static ObjectNode populateDataset(Map<String, Map<String, String>> data) {
         ObjectMapper mapper = new ObjectMapper()
         String json = mapper.writeValueAsString(data)
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java
index d5443d7e297..4b81efac18e 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/ElasticPetriNetService.java
@@ -1,13 +1,39 @@
 package com.netgrif.application.engine.elastic.service;
 
+import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
+import co.elastic.clients.elasticsearch._types.query_dsl.QueryStringQuery;
+import com.netgrif.application.engine.configuration.ElasticsearchConfiguration;
 import com.netgrif.application.engine.elastic.domain.ElasticPetriNetRepository;
 import com.netgrif.application.engine.elastic.service.executors.Executor;
 import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService;
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
 import com.netgrif.application.engine.objects.elastic.domain.ElasticPetriNet;
+import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
+import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch;
+import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
+import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference;
+import com.netgrif.application.engine.utils.FullPageRequest;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.dao.InvalidDataAccessApiUsageException;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageImpl;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.elasticsearch.client.elc.ElasticsearchTemplate;
+import org.springframework.data.elasticsearch.client.elc.NativeQuery;
+import org.springframework.data.elasticsearch.client.elc.NativeQueryBuilder;
+import org.springframework.data.elasticsearch.core.SearchHitSupport;
+import org.springframework.data.elasticsearch.core.SearchHits;
+import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
 import org.springframework.stereotype.Service;
 
+import java.util.*;
+import java.util.function.BinaryOperator;
+import java.util.stream.Collectors;
+
+import static org.springframework.data.elasticsearch.client.elc.Queries.termQuery;
+
 @Service
 @Slf4j
 public class ElasticPetriNetService implements IElasticPetriNetService {
@@ -16,9 +42,23 @@ public class ElasticPetriNetService implements IElasticPetriNetService {
 
     private final Executor executors;
 
-    public ElasticPetriNetService(ElasticPetriNetRepository repository, Executor executors) {
+    private IPetriNetService petriNetService;
+
+    private final ElasticsearchTemplate template;
+
+    protected ElasticsearchConfiguration elasticsearchConfiguration;
+
+    public ElasticPetriNetService(ElasticPetriNetRepository repository, Executor executors, ElasticsearchTemplate template, ElasticsearchConfiguration elasticsearchConfiguration) {
         this.repository = repository;
         this.executors = executors;
+        this.template = template;
+        this.elasticsearchConfiguration = elasticsearchConfiguration;
+    }
+
+    @Lazy
+    @Autowired
+    public void setPetriNetService(IPetriNetService petriNetService) {
+        this.petriNetService = petriNetService;
     }
 
     @Override
@@ -54,4 +94,111 @@ public void remove(String id) {
             log.info("[" + id + "]: PetriNet \"" + id + "\" deleted");
         });
     }
+
+    /**
+     * Method for search of PetriNets in Elastic
+     *
+     * @param requests       - search body, for now only title working
+     * @param user           - logged user
+     * @param pageable       - pageable for paging
+     * @param locale         - internacionalization
+     * @param isIntersection - property for merging filter, not implemented now, use false
+     * @return Page<PetriNetReference> - page of PetriNetReferences
+     */
+    @Override
+    public Page<PetriNetReference> search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection) {
+        if (requests == null) {
+            throw new IllegalArgumentException("Request can not be null!");
+        }
+        log.debug("Searching for PetriNet query with logged user [{}]", user.getId());
+        // TODO: impersonation
+//        LoggedUser loggedOrImpersonated = user.getSelfOrImpersonated();
+        LoggedUser loggedOrImpersonated = user;
+        NativeQuery query = buildQuery(requests, loggedOrImpersonated, pageable, locale, isIntersection);
+        List<PetriNet> netPage;
+        long total;
+        if (query != null) {
+            SearchHits<ElasticPetriNet> hits = template.search(query, ElasticPetriNet.class, IndexCoordinates.of(elasticsearchConfiguration.elasticPetriNetIndex()));
+            Page<ElasticPetriNet> indexedNets = (Page) SearchHitSupport.unwrapSearchHits(SearchHitSupport.searchPageFor(hits, query.getPageable()));
+            netPage = petriNetService.findAllById(indexedNets.get().map(ElasticPetriNet::getStringId).collect(Collectors.toList()));
+            total = indexedNets.getTotalElements();
+            log.debug("Found [{}] total elements of page [{}]", netPage.size(), pageable.getPageNumber());
+        } else {
+            netPage = Collections.emptyList();
+            total = 0;
+        }
+
+        return new PageImpl<>(netPage.stream().map(net -> new PetriNetReference(net, locale)).collect(Collectors.toList()), pageable, total);
+    }
+
+    protected NativeQuery buildQuery(PetriNetSearch request, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection) {
+        List<BoolQuery.Builder> singleQueries = new LinkedList<>();
+        singleQueries.add(buildSingleQuery(request, user, locale));
+
+        if (isIntersection && !singleQueries.stream().allMatch(Objects::nonNull)) {
+            // one of the queries evaluates to empty set => the entire result is an empty set
+            return null;
+        } else if (!isIntersection) {
+            singleQueries = singleQueries.stream().filter(Objects::nonNull).collect(Collectors.toList());
+            if (singleQueries.isEmpty()) {
+                // all queries result in an empty set => the entire result is an empty set
+                return null;
+            }
+        }
+
+        BinaryOperator<BoolQuery.Builder> reductionOperation = isIntersection ? (a, b) -> a.must(b.build()._toQuery()) : (a, b) -> a.should(b.build()._toQuery());
+        BoolQuery.Builder query = singleQueries.stream().reduce(new BoolQuery.Builder(), reductionOperation);
+
+        NativeQueryBuilder builder = new NativeQueryBuilder();
+        return builder
+                .withQuery(query.build()._toQuery())
+                .withPageable(pageable)
+                .build();
+    }
+
+    protected BoolQuery.Builder buildSingleQuery(PetriNetSearch request, LoggedUser user, Locale locale) {
+        BoolQuery.Builder query = new BoolQuery.Builder();
+
+        buildFullTextQuery(request, query);
+        boolean resultAlwaysEmpty = buildGroupQuery(request, user, locale, query);
+        if (resultAlwaysEmpty) {
+            return null;
+        }
+        return query;
+    }
+
+    protected void buildFullTextQuery(PetriNetSearch request, BoolQuery.Builder query) {
+        if (request.getTitle() == null || request.getTitle().isEmpty()) {
+            return;
+        }
+
+        // TODO refactor to properties
+        String searchText = "*" + request.getTitle() + "*";
+        List<String> fullTextFields = List.of(
+                "title.textValue^2",
+                "identifier^1"
+        );
+
+        QueryStringQuery fullTextQuery = QueryStringQuery.of(builder -> builder.fields(fullTextFields).query(searchText));
+        query.must(fullTextQuery._toQuery());
+    }
+
+    protected boolean buildGroupQuery(PetriNetSearch request, LoggedUser user, Locale locale, BoolQuery.Builder query) {
+        if (request.getGroup() == null || request.getGroup().isEmpty()) {
+            return false;
+        }
+
+        PetriNetSearch processQuery = new PetriNetSearch();
+        processQuery.setGroup(request.getGroup());
+        List<PetriNetReference> groupProcesses = this.petriNetService.search(processQuery, user, new FullPageRequest(), locale).getContent();
+        if (groupProcesses.isEmpty())
+            return true;
+
+        BoolQuery.Builder groupQuery = new BoolQuery.Builder();
+        groupProcesses.stream().map(PetriNetReference::getIdentifier)
+                .map(netIdentifier -> termQuery("identifier", netIdentifier))
+                .forEach(termQuery -> groupQuery.should(termQuery._toQuery()));
+        query.filter(groupQuery.build()._toQuery());
+        return false;
+    }
 }
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java
index 7cd005f6c69..00a250ad3b0 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/elastic/service/interfaces/IElasticPetriNetService.java
@@ -1,8 +1,15 @@
 package com.netgrif.application.engine.elastic.service.interfaces;
 
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
 import com.netgrif.application.engine.objects.elastic.domain.ElasticPetriNet;
+import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch;
+import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetReference;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.scheduling.annotation.Async;
 
+import java.util.Locale;
+
 public interface IElasticPetriNetService {
 
     @Async
@@ -11,4 +18,7 @@ public interface IElasticPetriNetService {
     void indexNow(ElasticPetriNet net);
 
     void remove(String id);
+
+    Page<PetriNetReference> search(PetriNetSearch requests, LoggedUser user, Pageable pageable, Locale locale, Boolean isIntersection);
+
 }
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardItemServiceImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardItemServiceImpl.java
new file mode 100644
index 00000000000..c0a5627de03
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardItemServiceImpl.java
@@ -0,0 +1,126 @@
+package com.netgrif.application.engine.menu.services;
+
+
+import com.netgrif.application.engine.auth.service.UserService;
+import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService;
+import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest;
+import com.netgrif.application.engine.menu.services.interfaces.DashboardItemService;
+import com.netgrif.application.engine.objects.auth.domain.AbstractUser;
+import com.netgrif.application.engine.objects.auth.domain.ActorTransformer;
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.utils.MenuItemUtils;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.Task;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemConstants;
+import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
+import com.netgrif.application.engine.startup.ImportHelper;
+import com.netgrif.application.engine.workflow.service.interfaces.IDataService;
+import com.netgrif.application.engine.workflow.service.interfaces.ITaskService;
+import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.Locale;
+import java.util.Map;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DashboardItemServiceImpl implements DashboardItemService {
+
+    protected final IWorkflowService workflowService;
+    protected final UserService userService;
+    protected final ITaskService taskService;
+    protected final IDataService dataService;
+    protected final IPetriNetService petriNetService;
+    protected final IElasticCaseService elasticCaseService;
+
+    /**
+     * Creates a new dashboard item case if it does not already exist.
+     * If a case with the same ID is found, it is returned instead of creating a new one.
+     *
+     * @param body The {@link DashboardItemBody} containing data for the dashboard item.
+     * @return The created or existing {@link Case} representing the dashboard item.
+     * @throws TransitionNotExecutableException if the task transition is not executable.
+     */
+    @Override
+    public Case getOrCreate(DashboardItemBody body) throws TransitionNotExecutableException {
+        MenuItemUtils.sanitize(body.getId());
+        Case itemCase;
+
+        itemCase = findById(body.getId());
+        if (itemCase != null) {
+            log.info("Dashboard item with id:{} already exists", body.getId());
+            return itemCase;
+        }
+
+        LoggedUser loggedUser = ActorTransformer.toLoggedUser(userService.getLoggedOrSystem());
+        itemCase = workflowService.createCase(petriNetService.getNewestVersionByIdentifier(DashboardItemConstants.PROCESS_IDENTIFIER).getStringId(), body.getName().getDefaultValue(), "", loggedUser).getCase();
+        ToDataSetOutcome outcome = body.toDataSet();
+        itemCase = setDataWithExecute(itemCase, DashboardItemConstants.TASK_CONFIGURE, outcome.getDataSet());
+        return itemCase;
+    }
+
+
+    /**
+     * Updates an existing dashboard item case with new data.
+     *
+     * @param itemCase The existing {@link Case} to update.
+     * @param body The {@link DashboardItemBody} containing updated data.
+     * @return The updated {@link Case} representing the dashboard item.
+     * @throws TransitionNotExecutableException if the task transition is not executable.
+     */
+    @Override
+    public Case update(Case itemCase, DashboardItemBody body) throws TransitionNotExecutableException {
+        MenuItemUtils.sanitize(body.getId());
+        ToDataSetOutcome outcome = body.toDataSet();
+        itemCase = setDataWithExecute(itemCase, DashboardItemConstants.TASK_CONFIGURE, outcome.getDataSet());
+        return itemCase;
+    }
+
+    /**
+     * Finds an existing dashboard item case by its identifier.
+     *
+     * @param identifier The unique identifier of the dashboard item.
+     * @return The {@link Case} representing the dashboard item, or null if not found.
+     */
+    @Override
+    public Case findById(String identifier) {
+        String query = String.format("processIdentifier:%s AND dataSet.%s.textValue.keyword:\"%s\"",
+                DashboardItemConstants.PROCESS_IDENTIFIER, DashboardItemConstants.FIELD_ID, identifier);
+        return findCase(DashboardItemConstants.PROCESS_IDENTIFIER, query);
+    }
+
+    protected Case setData(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) {
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        return dataService.setData(taskId, ImportHelper.populateDataset((Map) dataSet)).getCase();
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    protected Case setDataWithExecute(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        Task task = taskService.findOne(taskId);
+        task = taskService.assignTask(task, loggedUser).getTask();
+        task = dataService.setData(task, ImportHelper.populateDataset((Map) dataSet)).getTask();
+        return taskService.finishTask(task, loggedUser).getCase();
+    }
+
+    protected Case findCase(String processIdentifier, String query) {
+        CaseSearchRequest request = CaseSearchRequest.builder()
+                .process(Collections.singletonList(new CaseSearchRequest.PetriNet(processIdentifier)))
+                .query(query)
+                .build();
+        Page<Case> resultPage = elasticCaseService.search(java.util.List.of(request), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()),
+                PageRequest.of(0, 1), Locale.getDefault(), false);
+
+        return resultPage.hasContent() ? resultPage.getContent().get(0) : null;
+    }
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java
new file mode 100644
index 00000000000..f957e82aa1d
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/DashboardManagementServiceImpl.java
@@ -0,0 +1,140 @@
+package com.netgrif.application.engine.menu.services;
+
+
+import com.netgrif.application.engine.auth.service.UserService;
+import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService;
+import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest;
+import com.netgrif.application.engine.menu.services.interfaces.DashboardManagementService;
+import com.netgrif.application.engine.objects.auth.domain.AbstractUser;
+import com.netgrif.application.engine.objects.auth.domain.ActorTransformer;
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.utils.MenuItemUtils;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.Task;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemConstants;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementConstants;
+import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
+import com.netgrif.application.engine.startup.ImportHelper;
+import com.netgrif.application.engine.workflow.service.interfaces.IDataService;
+import com.netgrif.application.engine.workflow.service.interfaces.ITaskService;
+import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class DashboardManagementServiceImpl implements DashboardManagementService {
+
+    protected final IWorkflowService workflowService;
+    protected final UserService userService;
+    protected final ITaskService taskService;
+    protected final IDataService dataService;
+    protected final IPetriNetService petriNetService;
+    protected final IElasticCaseService elasticCaseService;
+
+
+    /**
+     * Creates a new dashboard management case if it does not already exist.
+     * If a case with the same ID is found, it is returned instead of creating a new one.
+     *
+     * @param body The {@link DashboardManagementBody} containing data for the dashboard management.
+     * @return The created or existing {@link Case} representing the dashboard management.
+     */
+    @Override
+    public Case createDashboardManagement(DashboardManagementBody body) throws TransitionNotExecutableException {
+        Case managementCase;
+        MenuItemUtils.sanitize(body.getId());
+
+        managementCase = findDashboardManagement(body.getId());
+        if (managementCase != null) {
+            log.info("Dashboard management with id:{} already exists", body.getId());
+            return managementCase;
+        }
+        addReferencedMenuItems(body);
+        LoggedUser loggedUser = ActorTransformer.toLoggedUser(userService.getLoggedOrSystem());
+        managementCase = workflowService.createCase(petriNetService.getNewestVersionByIdentifier(DashboardManagementConstants.PROCESS_IDENTIFIER).getStringId(), body.getName().getDefaultValue(), "", loggedUser).getCase();
+        ToDataSetOutcome outcome = body.toDataSet();
+        managementCase = setDataWithExecute(managementCase, DashboardItemConstants.TASK_CONFIGURE, outcome.getDataSet());
+        return managementCase;
+    }
+
+    /**
+     * Updates an existing dashboard management case with new data.
+     *
+     * @param managementCase The existing {@link Case} to update.
+     * @param body           The {@link DashboardManagementBody} containing updated data.
+     * @return The updated {@link Case} representing the dashboard management.
+     */
+    @Override
+    public Case updateDashboardManagement(Case managementCase, DashboardManagementBody body) throws TransitionNotExecutableException {
+        MenuItemUtils.sanitize(body.getId());
+        addReferencedMenuItems(body);
+        ToDataSetOutcome outcome = body.toDataSet();
+        managementCase = setDataWithExecute(managementCase, DashboardItemConstants.TASK_CONFIGURE, outcome.getDataSet());
+        return managementCase;
+    }
+
+    /**
+     * Finds an existing dashboard management case by its identifier.
+     *
+     * @param identifier The unique identifier of the dashboard management.
+     * @return The {@link Case} representing the dashboard management, or null if not found.
+     */
+    @Override
+    public Case findDashboardManagement(String identifier) {
+        String query = String.format("processIdentifier:%s AND dataSet.%s.textValue.keyword:\"%s\"",
+                DashboardManagementConstants.PROCESS_IDENTIFIER, DashboardManagementConstants.FIELD_ID, identifier);
+        return findCase(DashboardManagementConstants.PROCESS_IDENTIFIER, query);
+    }
+
+    protected Case setData(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) {
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        return dataService.setData(taskId, ImportHelper.populateDataset((Map) dataSet)).getCase();
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    protected Case setDataWithExecute(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        Task task = taskService.findOne(taskId);
+        task = taskService.assignTask(task, loggedUser).getTask();
+        task = dataService.setData(task, ImportHelper.populateDataset((Map) dataSet)).getTask();
+        return taskService.finishTask(task, loggedUser).getCase();
+    }
+
+    protected Case findCase(String processIdentifier, String query) {
+        CaseSearchRequest request = CaseSearchRequest.builder()
+                .process(Collections.singletonList(new CaseSearchRequest.PetriNet(processIdentifier)))
+                .query(query)
+                .build();
+        Page<Case> resultPage = elasticCaseService.search(java.util.List.of(request), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()),
+                PageRequest.of(0, 1), Locale.getDefault(), false);
+
+        return resultPage.hasContent() ? resultPage.getContent().get(0) : null;
+    }
+
+    private void addReferencedMenuItems(DashboardManagementBody body) {
+        if (body.getDashboardItems() == null || body.getDashboardItems().isEmpty()) {
+            return;
+        }
+        HashMap<String, I18nString> menuItemToDashboardItem = new HashMap<>();
+        body.getDashboardItems().keySet().forEach(dashboardItemId -> {
+            Case dashboardItem = workflowService.findOne(dashboardItemId);
+            menuItemToDashboardItem.put(dashboardItemId, new I18nString(String.valueOf(dashboardItem.getFieldValue(DashboardItemConstants.FIELD_MENU_ITEM_LIST))));
+        });
+        body.setMenuItemsToDashboardItems(menuItemToDashboardItem);
+    }
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java
new file mode 100644
index 00000000000..2aae3741494
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/MenuItemService.java
@@ -0,0 +1,752 @@
+package com.netgrif.application.engine.menu.services;
+
+
+import com.netgrif.application.engine.adapter.spring.workflow.domain.QCase;
+import com.netgrif.application.engine.auth.service.UserService;
+import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseService;
+import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest;
+import com.netgrif.application.engine.menu.services.interfaces.IMenuItemService;
+import com.netgrif.application.engine.objects.auth.domain.AbstractUser;
+import com.netgrif.application.engine.objects.auth.domain.ActorTransformer;
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.utils.MenuItemUtils;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.Task;
+import com.netgrif.application.engine.objects.workflow.domain.TaskPair;
+import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemConstants;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.ViewBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.ViewConstants;
+import com.netgrif.application.engine.startup.ImportHelper;
+import com.netgrif.application.engine.startup.runner.DefaultFiltersRunner;
+import com.netgrif.application.engine.startup.runner.FilterRunner;
+import com.netgrif.application.engine.startup.runner.MenuProcessRunner;
+import com.netgrif.application.engine.workflow.service.interfaces.IDataService;
+import com.netgrif.application.engine.workflow.service.interfaces.ITaskService;
+import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class MenuItemService implements IMenuItemService {
+    protected final IWorkflowService workflowService;
+    protected final ITaskService taskService;
+    protected final IDataService dataService;
+    protected final UserService userService;
+    protected final IElasticCaseService elasticCaseService;
+
+    protected static final String DEFAULT_FOLDER_ICON = "folder";
+
+    /**
+     * Creates new filter case
+     *
+     * @param body filter data used for creation
+     * @return initialized filter case instance with the provided data
+     */
+    @Override
+    public Case createFilter(FilterBody body) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        Case filterCase = createCase(FilterRunner.FILTER_PETRI_NET_IDENTIFIER, body.getTitle().getDefaultValue(), ActorTransformer.toLoggedUser(loggedUser));
+        filterCase.setIcon(body.getIcon());
+        filterCase = workflowService.save(filterCase);
+        ToDataSetOutcome dataSetOutcome = body.toDataSet();
+        filterCase = setDataWithExecute(filterCase, DefaultFiltersRunner.AUTO_CREATE_TRANSITION, dataSetOutcome.getDataSet());
+        log.trace("Created filter case [{}][{}]", filterCase.getStringId(), body.getTitle().getDefaultValue());
+        return filterCase;
+    }
+
+    /**
+     * Updates existing filter case
+     *
+     * @param filterCase filter to be updated
+     * @param body       data values used for update
+     * @return updated filter case instance
+     */
+    @Override
+    public Case updateFilter(Case filterCase, FilterBody body) {
+        filterCase.setIcon(body.getIcon());
+        filterCase = workflowService.save(filterCase);
+        ToDataSetOutcome dataSetOutcome = body.toDataSet();
+        filterCase = setData(filterCase, DefaultFiltersRunner.DETAILS_TRANSITION, dataSetOutcome.getDataSet());
+        log.trace("Updated filter case [{}][{}]", filterCase.getStringId(), body.getTitle().getDefaultValue());
+        return filterCase;
+    }
+
+
+    /**
+     * Creates menu item case and it's configuration cases
+     *
+     * @param body data used for creation
+     * @return initialized menu item instance with the provided data
+     * @throws IllegalArgumentException if the provided menu identifier already exists
+     */
+    @Override
+    public Case createMenuItem(MenuItemBody body) throws TransitionNotExecutableException {
+        log.debug("Creation of menu item case with identifier [{}] started.", body.getIdentifier());
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        String sanitizedIdentifier = MenuItemUtils.sanitize(body.getIdentifier());
+
+        if (existsMenuItem(sanitizedIdentifier)) {
+            throw new IllegalArgumentException(String.format("Menu item identifier %s is not unique!", sanitizedIdentifier));
+        }
+
+        Case parentItemCase = getOrCreateFolderItem(body.getPath());
+
+        I18nString newName = body.getMenuName();
+        if (newName == null) {
+            newName = new I18nString(body.getIdentifier());
+        }
+        Case menuItemCase = createCase(MenuProcessRunner.MENU_NET_IDENTIFIER, newName.getDefaultValue(),
+                ActorTransformer.toLoggedUser(loggedUser));
+        menuItemCase = workflowService.save(menuItemCase);
+
+        parentItemCase = appendChildCaseIdAndSave(parentItemCase, menuItemCase.getStringId());
+
+        Case viewCase = null;
+        if (body.hasView()) {
+            viewCase = createView(body.getView());
+        }
+
+        String nodePath = createNodePath(body.getPath(), sanitizedIdentifier);
+
+        ToDataSetOutcome dataSetOutcome = body.toDataSet(parentItemCase.getStringId(), nodePath, viewCase);
+        menuItemCase = setDataWithExecute(menuItemCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet());
+        log.debug("Created menu item case [{}] with identifier [{}].", menuItemCase.getStringId(), body.getIdentifier());
+        return menuItemCase;
+    }
+
+    /**
+     * Updates menu item case and it's configuration cases
+     *
+     * @param itemCase menu item case to be updated
+     * @param body     data used for update
+     * @return updated menu item case (configuration cases are updated, but not returned)
+     */
+    @Override
+    public Case updateMenuItem(Case itemCase, MenuItemBody body) throws TransitionNotExecutableException {
+        log.debug("Update of menu item case with identifier [{}] started.", body.getIdentifier());
+
+        Case viewCase = findView(itemCase);
+        viewCase = handleView(viewCase, body.getView());
+        ToDataSetOutcome dataSetOutcome = body.toDataSet(viewCase);
+        itemCase = setData(itemCase, MenuItemConstants.TRANS_SYNC_ID, dataSetOutcome.getDataSet());
+        log.debug("Updated menu item case [{}] with identifier [{}].", itemCase.getStringId(), body.getIdentifier());
+        return itemCase;
+    }
+
+    /**
+     * Creates or updates menu item. At first menu item is searched by identifier. If found, then menu item will be
+     * updated. If not, menu item will be created
+     *
+     * @param body data used for the update or creation
+     * @return updated or created menu item case
+     */
+    @Override
+    public Case createOrUpdateMenuItem(MenuItemBody body) throws TransitionNotExecutableException {
+        Case itemCase = findMenuItem(MenuItemUtils.sanitize(body.getIdentifier()));
+        if (itemCase != null) {
+            return updateMenuItem(itemCase, body);
+        } else {
+            return createMenuItem(body);
+        }
+    }
+
+    /**
+     * Creates or ignore menu item. At first menu item is searched by identifier. If found, then nothing will happen.
+     * If not, menu item will be created
+     *
+     * @param body data used for the creation
+     * @return ignored or created menu item case
+     */
+    @Override
+    public Case createOrIgnoreMenuItem(MenuItemBody body) throws TransitionNotExecutableException {
+        Case itemCase = findMenuItem(body.getIdentifier());
+        if (itemCase != null) {
+            log.debug("Ignored creation or update of menu item case [{}] with identifier [{}].", itemCase.getStringId(),
+                    body.getIdentifier());
+            return itemCase;
+        } else {
+            return createMenuItem(body);
+        }
+    }
+
+    /**
+     * Finds menu item by identifier.
+     *
+     * @param identifier identifier of the menu item
+     * @return Found menu item case. If not found, null will be returned
+     */
+    @Override
+    public Case findMenuItem(String identifier) {
+        return findMenuItem(identifier, false);
+    }
+
+    @Override
+    public Case findMenuItem(String identifier, boolean retry) {
+        String query = String.format("processIdentifier:%s AND dataSet.%s.textValue.keyword:\"%s\"",
+                MenuProcessRunner.MENU_NET_IDENTIFIER, MenuItemConstants.FIELD_IDENTIFIER, identifier);
+        return findCase(MenuProcessRunner.MENU_NET_IDENTIFIER, query);
+    }
+
+    /**
+     * Finds menu item by uri and name.
+     *
+     * @param path
+     * @param name name of the menu item
+     * @return Found menu item case. If not found, null will be returned
+     */
+    @Override
+    public Case findMenuItem(String path, String name) {
+//        TODO retry
+        String query = String.format("processIdentifier:%s AND title.keyword:\"%s\" AND nodePath:\"%s\"",
+                MenuProcessRunner.MENU_NET_IDENTIFIER, name, path);
+        return findCase(MenuProcessRunner.MENU_NET_IDENTIFIER, query);
+    }
+
+    /**
+     * Finds folder case by UriNode
+     *
+     * @param path which folder represents
+     * @return Found folder menu item case. If not found, null will be returned
+     */
+    @Override
+    public Case findFolderCase(String path) {
+//        TODO
+        String query = String.format("processIdentifier:%s AND dataSet.%s.textValue.keyword:\"%s\"",
+                MenuProcessRunner.MENU_NET_IDENTIFIER, MenuItemConstants.FIELD_NODE_PATH, path);
+        return findCase(MenuProcessRunner.MENU_NET_IDENTIFIER, query);
+    }
+
+    /**
+     * Checks if the menu item exists
+     *
+     * @param identifier identifier of the menu item
+     * @return true if the menu item exists
+     */
+    @Override
+    public boolean existsMenuItem(String identifier) {
+        //TODO mongo
+        Case menuItem = this.workflowService.searchOne(QCase.case$.processIdentifier.eq("menu_item")
+                .and(QCase.case$.dataSet.get(MenuItemConstants.FIELD_IDENTIFIER).value.eq(identifier)));
+        return menuItem != null;
+//        String query = String.format("processIdentifier:%s AND dataSet.%s.textValue.keyword:\"%s\"",
+//                FilterRunner.MENU_NET_IDENTIFIER, MenuItemConstants.FIELD_IDENTIFIER, identifier);
+//        return countCases(FilterRunner.MENU_NET_IDENTIFIER, query) > 0;
+    }
+
+    /**
+     * Changes location of menu item. If non-existing location is provided, the new location is created and then the
+     * item is moved. Cyclic destination path is forbidden (f.e. from <code>"/my_node"</code> to
+     * <code>"/my_node/my_node2"</code>
+     *
+     * @param itemCase Instance of menu_item to be moved
+     * @param destUri  destination path where the item will be moved. F.e. <code>"/my_new_node"</code>
+     * @throws IllegalArgumentException if the path is forbidden
+     */
+    @Override
+    public void moveItem(Case itemCase, String destUri) throws TransitionNotExecutableException {
+
+        log.debug("Move of menu item case [{}] started. Destination path [{}]", itemCase.getStringId(), destUri);
+        if (MenuItemUtils.isCyclicNodePath(itemCase, destUri)) {
+            throw new IllegalArgumentException(String.format("Cyclic path not supported. Destination path: %s", destUri));
+        }
+        List<Case> casesToSave = new ArrayList<>();
+
+        List<String> parentIdList = MenuItemUtils.getCaseIdsFromCaseRef(itemCase, MenuItemConstants.FIELD_PARENT_ID);
+        if (parentIdList != null && !parentIdList.isEmpty()) {
+            Case oldParent = removeChildItemFromParent(parentIdList.get(0), itemCase);
+            casesToSave.add(oldParent);
+        }
+
+        Case newParent = getOrCreateFolderItem(destUri);
+        if (newParent != null) {
+            itemCase.getDataField(MenuItemConstants.FIELD_PARENT_ID).setValue(List.of(newParent.getStringId()));
+            appendChildCaseIdInMemory(newParent, itemCase.getStringId());
+            casesToSave.add(newParent);
+        } else {
+            itemCase.getDataField(MenuItemConstants.FIELD_PARENT_ID).setValue(null);
+        }
+
+        resolveAndHandleNewNodePath(itemCase, destUri);
+        casesToSave.add(itemCase);
+
+        if (MenuItemUtils.hasFolderChildren(itemCase)) {
+            List<Case> childrenToSave = updateNodeInChildrenFoldersRecursive(itemCase);
+            casesToSave.addAll(childrenToSave);
+        }
+
+        for (Case useCase : casesToSave) {
+            if (useCase != null) {
+                workflowService.save(useCase);
+            }
+        }
+        log.debug("Moved menu item case [{}]. Destination path was [{}]", itemCase.getStringId(), destUri);
+    }
+
+    /**
+     * Duplicates menu item. It creates new menu_item instance with the same dataSet as the provided
+     * item instance. The only difference is in title, menu_item_identifier and associations. Configuration cases are
+     * duplicated as well.
+     *
+     * @param originItem    Menu item instance, which is duplicated
+     * @param newTitle      Title of menu item, that is displayed in menu and tab. Cannot be empty or null.
+     * @param newIdentifier unique menu item identifier
+     * @return duplicated {@link Case} instance of menu_item
+     * @throws IllegalArgumentException if the input data are invalid or the menu item of the new identifier already
+     *                                  exists
+     */
+    @Override
+    public Case duplicateItem(Case originItem, I18nString newTitle, String newIdentifier) throws TransitionNotExecutableException {
+        log.debug("Duplication of menu item case [{}] started.", originItem.getStringId());
+        if (newIdentifier == null || newIdentifier.isEmpty()) {
+            throw new IllegalArgumentException("View item identifier is null or empty!");
+        }
+        if (newTitle == null || newTitle.getDefaultValue().isEmpty()) {
+            throw new IllegalArgumentException("Default title is null or empty");
+        }
+        String sanitizedIdentifier = MenuItemUtils.sanitize(newIdentifier);
+        if (existsMenuItem(sanitizedIdentifier)) {
+            throw new IllegalArgumentException(String.format("View item identifier %s is not unique!", sanitizedIdentifier));
+        }
+
+        Case duplicatedViewCase = null;
+        if (MenuItemUtils.hasView(originItem)) {
+            String originViewId = MenuItemUtils.getCaseIdFromCaseRef(originItem, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID);
+            Case originViewCase = workflowService.findOne(originViewId);
+            duplicatedViewCase = duplicateView(originViewCase);
+        }
+        Case duplicated = createCase(MenuProcessRunner.MENU_NET_IDENTIFIER, newTitle.getDefaultValue(),
+                ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()));
+        duplicated.setDataSet(originItem.getDataSet());
+        duplicated.setTitle(newTitle.getDefaultValue());
+        duplicated = workflowService.save(duplicated);
+
+        parentPath(String.valueOf(originItem.getDataSet().get(MenuItemConstants.FIELD_NODE_PATH)));
+        String newNodePath = createNodePath(parentPath(String.valueOf(originItem.getDataSet().get(MenuItemConstants.FIELD_NODE_PATH))), sanitizedIdentifier);
+
+        Map<String, Map<String, Object>> dataSet = new HashMap<>();
+        dataSet.put(MenuItemConstants.FIELD_DUPLICATE_TITLE, Map.of("type", FieldType.I18N.getName(), "value",
+                new I18nString("")));
+        dataSet.put(MenuItemConstants.FIELD_DUPLICATE_IDENTIFIER, Map.of("type", FieldType.TEXT.getName(),
+                "value", ""));
+        dataSet.put(MenuItemConstants.FIELD_MENU_NAME, Map.of("type", FieldType.I18N.getName(),
+                "value", newTitle));
+        dataSet.put(MenuItemConstants.FIELD_TAB_NAME, Map.of("type", FieldType.I18N.getName(),
+                "value", newTitle));
+        dataSet.put(MenuItemConstants.FIELD_NODE_PATH, Map.of("type", FieldType.TEXT.getName(),
+                "value", newNodePath));
+        // Must be reset by button, because we have the same dataSet reference between originItem and duplicated
+        dataSet.put(MenuItemConstants.FIELD_DUPLICATE_RESET_CHILD_ITEM_IDS, Map.of("type", FieldType.BUTTON.getName(),
+                "value", 0));
+        if (duplicatedViewCase != null) {
+            addConfigurationIntoDataSet(duplicatedViewCase, dataSet);
+        }
+
+        setDataWithExecute(duplicated, MenuItemConstants.TRANS_INIT_ID, dataSet);
+
+        List<String> parentIdAsList = MenuItemUtils.getCaseIdsFromCaseRef(originItem, MenuItemConstants.FIELD_PARENT_ID);
+        if (parentIdAsList != null && !parentIdAsList.isEmpty()) {
+            Case parent = workflowService.findOne(parentIdAsList.get(0));
+            appendChildCaseIdAndSave(parent, duplicated.getStringId());
+        }
+        log.debug("Duplicated menu item case [{}]. New title [{}] and new identifier [{}].", originItem.getStringId(),
+                newTitle.getDefaultValue(), newIdentifier);
+        return workflowService.findOne(duplicated.getStringId());
+    }
+
+    /**
+     * Removes child menu item from the dataSet of the folder menu item case
+     *
+     * @param folderId  menu item identifier of the folder case
+     * @param childItem menu item case of the child item to be removed
+     * @return updated folder menu item case
+     */
+    @Override
+    public Case removeChildItemFromParent(String folderId, Case childItem) {
+        Case parentFolder = workflowService.findOne(folderId);
+        List<String> childIds = MenuItemUtils.getCaseIdsFromCaseRef(parentFolder, MenuItemConstants.FIELD_CHILD_ITEM_IDS);
+        if (childIds == null || childIds.isEmpty()) {
+            return parentFolder;
+        }
+        childIds.remove(childItem.getStringId());
+        parentFolder.getDataField(MenuItemConstants.FIELD_CHILD_ITEM_IDS).setValue(childIds);
+        parentFolder.getDataField(MenuItemConstants.FIELD_HAS_CHILDREN).setValue(MenuItemUtils.hasFolderChildren(parentFolder));
+        return workflowService.save(parentFolder);
+    }
+
+    protected Case findCase(String processIdentifier, String query) {
+        CaseSearchRequest request = CaseSearchRequest.builder()
+                .process(Collections.singletonList(new CaseSearchRequest.PetriNet(processIdentifier)))
+                .query(query)
+                .build();
+        Page<Case> resultPage = elasticCaseService.search(List.of(request), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()),
+                PageRequest.of(0, 1), Locale.getDefault(), false);
+
+        return resultPage.hasContent() ? resultPage.getContent().get(0) : null;
+    }
+
+    protected long countCases(String processIdentifier, String query) {
+        CaseSearchRequest request = CaseSearchRequest.builder()
+                .process(Collections.singletonList(new CaseSearchRequest.PetriNet(processIdentifier)))
+                .query(query)
+                .build();
+        return elasticCaseService.count(List.of(request), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()),
+                Locale.getDefault(), false);
+    }
+
+    protected Case duplicateView(Case viewCase) throws TransitionNotExecutableException {
+        Case duplicatedAssociatedViewCase = null;
+        if (MenuItemUtils.hasView(viewCase)) {
+            String originViewId = MenuItemUtils.getCaseIdFromCaseRef(viewCase, ViewConstants.FIELD_VIEW_CONFIGURATION_ID);
+            Case originViewCase = workflowService.findOne(originViewId);
+            duplicatedAssociatedViewCase = duplicateView(originViewCase);
+        }
+
+        Case duplicatedViewCase = createCase(viewCase.getProcessIdentifier(), viewCase.getTitle(),
+                ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()));
+        duplicatedViewCase.setDataSet(viewCase.getDataSet());
+        workflowService.save(duplicatedViewCase);
+
+        Map<String, Map<String, Object>> dataSet = new HashMap<>();
+        if (duplicatedAssociatedViewCase != null) {
+            addConfigurationIntoDataSet(duplicatedAssociatedViewCase, dataSet);
+        }
+
+        return setDataWithExecute(duplicatedViewCase, MenuItemConstants.TRANS_INIT_ID, dataSet);
+    }
+
+    protected Case findView(Case itemOrViewCase) {
+        return findCaseInCaseRef(itemOrViewCase, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID);
+    }
+
+    protected Case findFilter(Case viewCase) {
+        return findCaseInCaseRef(viewCase, ViewConstants.FIELD_VIEW_FILTER_CASE);
+    }
+
+    protected Case findCaseInCaseRef(Case useCase, String caseRefId) {
+        try {
+            String caseId = MenuItemUtils.getCaseIdFromCaseRef(useCase, caseRefId);
+            return workflowService.findOne(caseId);
+        } catch (IllegalArgumentException | NullPointerException ignore) {
+            return null;
+        }
+    }
+
+    protected Case handleView(Case existingViewCase, ViewBody body) throws TransitionNotExecutableException {
+        if (mustUpdateView(existingViewCase, body)) {
+            return updateView(existingViewCase, body);
+        } else if (mustCreateView(existingViewCase, body)) {
+            return createView(body);
+        } else if (mustRemoveView(existingViewCase, body)) {
+            removeView(existingViewCase);
+            return null;
+        } else if (mustRemoveAndCreateView(existingViewCase, body)) {
+            removeView(existingViewCase);
+            return createView(body);
+        } else {
+            return null;
+        }
+    }
+
+    protected Case createView(ViewBody body) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        Case viewCase = createCase(body.getViewProcessIdentifier(), body.getViewProcessIdentifier(),
+                ActorTransformer.toLoggedUser(loggedUser));
+
+        Case associatedViewCase = null;
+        if (body.hasAssociatedView()) {
+            associatedViewCase = createView(body.getAssociatedViewBody());
+        }
+        Case filterCase = null;
+        if (body.getFilterBody() != null) {
+            if (body.getFilterBody().getFilter() != null) {
+                filterCase = body.getFilterBody().getFilter();
+            } else {
+                filterCase = createFilter(body.getFilterBody());
+            }
+        }
+        ToDataSetOutcome dataSetOutcome = body.toDataSet(associatedViewCase, filterCase);
+        viewCase = setDataWithExecute(viewCase, ViewConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet());
+
+        log.trace("Created configuration view case [{}] of identifier [{}]", viewCase.getStringId(),
+                body.getViewProcessIdentifier());
+        return viewCase;
+    }
+
+    protected Case updateView(Case viewCase, ViewBody body) throws TransitionNotExecutableException {
+        Case filterCase = findFilter(viewCase);
+        filterCase = handleFilter(filterCase, body.getFilterBody());
+
+        Case associatedViewCase = findView(viewCase);
+        associatedViewCase = handleView(associatedViewCase, body.getAssociatedViewBody());
+
+        ToDataSetOutcome outcome = body.toDataSet(associatedViewCase, filterCase);
+        viewCase = setData(viewCase, ViewConstants.TRANS_SYNC_ID, outcome.getDataSet());
+
+        log.trace("Updated configuration view case [{}] of identifier [{}]", viewCase.getStringId(),
+                body.getViewProcessIdentifier());
+        return viewCase;
+    }
+
+    protected void removeView(Case viewCase) {
+        workflowService.deleteCase(viewCase);
+        log.trace("Removed configuration view case [{}].", viewCase.getStringId());
+    }
+
+    protected Case handleFilter(Case filterCase, FilterBody body) throws TransitionNotExecutableException {
+        if (mustCreateFilter(filterCase, body)) {
+            return createFilter(body);
+        } else if (mustUpdateFilter(filterCase, body)) {
+            return updateFilter(filterCase, body);
+        } else {
+            return filterCase;
+        }
+    }
+
+    protected boolean mustUpdateView(Case useCase, ViewBody body) {
+        return body != null && useCase != null && useCase.getProcessIdentifier().equals(body.getViewProcessIdentifier());
+    }
+
+    protected boolean mustRemoveAndCreateView(Case useCase, ViewBody body) {
+        return body != null && useCase != null && !useCase.getProcessIdentifier().equals(body.getViewProcessIdentifier());
+    }
+
+    protected boolean mustRemoveView(Case useCase, ViewBody body) {
+        return body == null && useCase != null;
+    }
+
+    protected boolean mustCreateView(Case useCase, ViewBody body) {
+        return body != null && useCase == null;
+    }
+
+    protected boolean mustCreateFilter(Case filterCase, FilterBody body) {
+        return filterCase == null && body != null;
+    }
+
+    protected boolean mustUpdateFilter(Case filterCase, FilterBody body) {
+        return filterCase != null && body != null;
+    }
+
+    protected List<Case> updateNodeInChildrenFoldersRecursive(Case parentFolder) {
+        List<String> childItemIds = MenuItemUtils.getCaseIdsFromCaseRef(parentFolder, MenuItemConstants.FIELD_CHILD_ITEM_IDS);
+        if (childItemIds == null || childItemIds.isEmpty()) {
+            return new ArrayList<>();
+        }
+
+        List<Case> children = workflowService.findAllById(childItemIds);
+
+        List<Case> casesToSave = new ArrayList<>();
+        for (Case childCase : children) {
+            resolveAndHandleNewNodePath(childCase, (String) parentFolder.getFieldValue(MenuItemConstants.FIELD_NODE_PATH));
+
+            casesToSave.add(childCase);
+            casesToSave.addAll(updateNodeInChildrenFoldersRecursive(childCase));
+        }
+
+        return casesToSave;
+    }
+
+    protected void resolveAndHandleNewNodePath(Case folderItem, String destUri) {
+        String newNodePath = resolveNewNodePath(folderItem, destUri);
+        folderItem.getDataField(MenuItemConstants.FIELD_NODE_PATH).setValue(newNodePath);
+    }
+
+    protected String resolveNewNodePath(Case folderItem, String destUri) {
+        return destUri +
+                MenuItemConstants.PATH_SEPARATOR +
+                folderItem.getFieldValue(MenuItemConstants.FIELD_IDENTIFIER);
+    }
+
+    protected String createNodePath(String path, String identifier) {
+        if (Objects.equals(path, MenuItemConstants.PATH_SEPARATOR)) {
+            return path + identifier;
+        } else {
+            return path + MenuItemConstants.PATH_SEPARATOR + identifier;
+        }
+    }
+
+    protected Case getOrCreateFolderItem(String path) throws TransitionNotExecutableException {
+        String pathName = path.substring(path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR) + 1);
+        com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody body = new com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody(new I18nString(pathName), "folder");
+        return getOrCreateFolderRecursive(path, body);
+    }
+
+    protected Case getOrCreateFolderRecursive(String path, MenuItemBody body) throws TransitionNotExecutableException {
+        return getOrCreateFolderRecursive(path, body, null);
+    }
+
+    protected Case getOrCreateFolderRecursive(String path, MenuItemBody body, Case childFolderCase) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        Case folderCase = findFolderCase(path);
+        if (folderCase != null) {
+            if (childFolderCase != null) {
+                folderCase = appendChildCaseIdAndSave(folderCase, childFolderCase.getStringId());
+            }
+            return folderCase;
+        }
+
+        folderCase = createCase(MenuProcessRunner.MENU_NET_IDENTIFIER, body.getMenuName().getDefaultValue(),
+                ActorTransformer.toLoggedUser(loggedUser));
+
+        ToDataSetOutcome dataSetOutcome = body.toDataSet(null, path, null);
+        if (childFolderCase != null) {
+            appendChildCaseIdInDataSet(folderCase, childFolderCase.getStringId(), dataSetOutcome.getDataSet());
+            initializeParentId(childFolderCase, folderCase.getStringId());
+        }
+
+        if (hasParent(path)) {
+            body = new com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody(new I18nString(nameFromPath(path)), "folder");
+            String parentPath = parentPath(path);
+            Case parentFolderCase = getOrCreateFolderRecursive(parentPath, body, folderCase);
+            dataSetOutcome.putDataSetEntry(MenuItemConstants.FIELD_PARENT_ID, FieldType.CASE_REF, List.of(parentFolderCase.getStringId()));
+
+        }
+        folderCase = setDataWithExecute(folderCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet());
+
+        log.trace("Created folder menu item [{}] with identifier [{}]", folderCase.getStringId(), body.getIdentifier());
+        return folderCase;
+    }
+
+    protected Case getOrCreateFolderRecursive2(String path, MenuItemBody body, Case childFolderCase) throws TransitionNotExecutableException {
+        Case folderCase = findFolderCase(path);
+        if (folderCase != null) {
+            if (childFolderCase != null) {
+                folderCase = appendChildCaseIdAndSave(folderCase, childFolderCase.getStringId());
+                initializeParentId(childFolderCase, folderCase.getStringId());
+            }
+            return folderCase;
+        }
+
+        folderCase = createCase(MenuProcessRunner.MENU_NET_IDENTIFIER, body.getMenuName().toString(), ActorTransformer.toLoggedUser(userService.getLoggedOrSystem()));
+        if (childFolderCase != null) {
+            folderCase = appendChildCaseIdAndSave(folderCase, childFolderCase.getStringId());
+            initializeParentId(childFolderCase, folderCase.getStringId());
+        } else {
+            folderCase = workflowService.save(folderCase);
+        }
+
+        Optional<TaskPair> newItemTask = folderCase.getTasks().stream().filter(taskPair -> taskPair.getTransition().equals(MenuItemConstants.TRANS_INIT_ID)).findFirst();
+
+        ToDataSetOutcome dataSetOutcome = body.toDataSet(null, path, null);
+        if (childFolderCase != null) {
+            appendChildCaseIdInDataSet(folderCase, childFolderCase.getStringId(), dataSetOutcome.getDataSet());
+        }
+
+        if (newItemTask.isPresent()) {
+            setDataWithExecute(folderCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet());
+        }
+
+        if (hasParent(path)) {
+            body = new com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody(new I18nString(nameFromPath(path)), "folder");
+            String parentPath = parentPath(path);
+            getOrCreateFolderRecursive(parentPath, body, folderCase);
+        }
+
+        folderCase = setDataWithExecute(folderCase, MenuItemConstants.TRANS_INIT_ID, dataSetOutcome.getDataSet());
+
+        return folderCase;
+    }
+
+
+    private Case initializeParentId(Case childFolderCase, String parentFolderCaseId) {
+        childFolderCase.getDataField(MenuItemConstants.FIELD_PARENT_ID).setValue(Collections.singletonList(parentFolderCaseId));
+        return workflowService.save(childFolderCase);
+    }
+
+    protected void appendChildCaseIdInDataSet(Case folderCase, String childItemCaseId, Map<String, Map<String, Object>> dataSet) {
+        List<String> childIds = MenuItemUtils.getCaseIdsFromCaseRef(folderCase, MenuItemConstants.FIELD_CHILD_ITEM_IDS);
+        if (childIds == null || childIds.isEmpty()) {
+            childIds = List.of(childItemCaseId);
+        } else {
+            childIds.add(childItemCaseId);
+        }
+
+        dataSet.put(MenuItemConstants.FIELD_CHILD_ITEM_IDS, Map.of("type", FieldType.CASE_REF.getName(),
+                "value", childIds));
+        dataSet.put(MenuItemConstants.FIELD_HAS_CHILDREN, Map.of("type", FieldType.BOOLEAN.getName(),
+                "value", !childIds.isEmpty()));
+    }
+
+    protected void appendChildCaseIdInMemory(Case folderCase, String childItemCaseId) {
+        List<String> childIds = MenuItemUtils.getCaseIdsFromCaseRef(folderCase, MenuItemConstants.FIELD_CHILD_ITEM_IDS);
+        if (childIds == null || childIds.isEmpty()) {
+            folderCase.getDataField(MenuItemConstants.FIELD_CHILD_ITEM_IDS).setValue(List.of(childItemCaseId));
+        } else {
+            childIds.add(childItemCaseId);
+            folderCase.getDataField(MenuItemConstants.FIELD_CHILD_ITEM_IDS).setValue(childIds);
+        }
+        folderCase.getDataField(MenuItemConstants.FIELD_HAS_CHILDREN).setValue(MenuItemUtils.hasFolderChildren(folderCase));
+    }
+
+    protected Case appendChildCaseIdAndSave(Case folderCase, String childItemCaseId) {
+        Map<String, Map<String, Object>> dataSet = new HashMap<>();
+        appendChildCaseIdInDataSet(folderCase, childItemCaseId, dataSet);
+        return setData(folderCase, MenuItemConstants.TRANS_SYNC_ID, dataSet);
+    }
+
+    protected void addConfigurationIntoDataSet(Case configurationCase, Map<String, Map<String, Object>> dataSet) {
+        dataSet.put(MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID, Map.of("type", FieldType.CASE_REF.getName(),
+                "value", List.of(configurationCase.getStringId())));
+        String taskId = MenuItemUtils.findTaskIdInCase(configurationCase, ViewConstants.TRANS_SETTINGS_ID);
+        dataSet.put(MenuItemConstants.FIELD_VIEW_CONFIGURATION_FORM, Map.of("type", FieldType.TASK_REF.getName(),
+                "value", List.of(taskId)));
+    }
+
+    protected Case createCase(String identifier, String title, LoggedUser loggedUser) {
+        return workflowService.createCaseByIdentifier(identifier, title, "", loggedUser).getCase();
+    }
+
+    protected Case setData(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) {
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        return setData(taskId, dataSet);
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    protected Case setData(String taskId, Map<String, Map<String, Object>> dataSet) {
+        return dataService.setData(taskId, ImportHelper.populateDataset((Map) dataSet)).getCase();
+    }
+
+    @SuppressWarnings({"unchecked", "rawtypes"})
+    protected Case setDataWithExecute(Case useCase, String transId, Map<String, Map<String, Object>> dataSet) throws TransitionNotExecutableException {
+        AbstractUser loggedUser = userService.getLoggedOrSystem();
+        String taskId = MenuItemUtils.findTaskIdInCase(useCase, transId);
+        Task task = taskService.findOne(taskId);
+        task = taskService.assignTask(task, loggedUser).getTask();
+        task = dataService.setData(task, ImportHelper.populateDataset((Map) dataSet)).getTask();
+        return taskService.finishTask(task, loggedUser).getCase();
+    }
+
+    protected String nameFromPath(String path) {
+        if (path == null || path.equals(MenuItemConstants.PATH_SEPARATOR) || path.isEmpty()) {
+            return "";
+        }
+        if (path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR) == 0) {
+            return path.replace(MenuItemConstants.PATH_SEPARATOR, "");
+        }
+        return path.substring(path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR));
+    }
+
+    protected String parentPath(String path) {
+        if (path == null || path.equals(MenuItemConstants.PATH_SEPARATOR) || path.isEmpty() || path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR) == 0) {
+            return MenuItemConstants.PATH_SEPARATOR;
+        }
+        return path.substring(0, path.lastIndexOf(MenuItemConstants.PATH_SEPARATOR));
+    }
+
+    protected boolean hasParent(String path) {
+        return path != null && !path.equals(MenuItemConstants.PATH_SEPARATOR) && !path.isEmpty();
+    }
+
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardItemService.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardItemService.java
new file mode 100644
index 00000000000..dd7da773fae
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardItemService.java
@@ -0,0 +1,14 @@
+package com.netgrif.application.engine.menu.services.interfaces;
+
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardItemBody;
+
+public interface DashboardItemService {
+
+    Case getOrCreate(DashboardItemBody body) throws TransitionNotExecutableException;
+
+    Case update(Case itemCase, DashboardItemBody body) throws TransitionNotExecutableException;
+
+    Case findById(String identifier);
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardManagementService.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardManagementService.java
new file mode 100644
index 00000000000..9ea0682e69d
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/DashboardManagementService.java
@@ -0,0 +1,39 @@
+package com.netgrif.application.engine.menu.services.interfaces;
+
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody;
+
+/**
+ * Service interface for managing dashboard management cases.
+ */
+public interface DashboardManagementService {
+
+    /**
+     * Creates a new dashboard management case.
+     *
+     * @param body the dashboard management configuration
+     * @return the created dashboard management case
+     * @throws TransitionNotExecutableException if the creation workflow transition fails
+     */
+    Case createDashboardManagement(DashboardManagementBody body) throws TransitionNotExecutableException;
+
+    /**
+     * Updates an existing dashboard management case.
+     *
+     * @param managementCase the existing dashboard management case to update
+     * @param body           the updated dashboard management configuration
+     * @return the updated dashboard management case
+     * @throws TransitionNotExecutableException if the update workflow transition fails
+     */
+    Case updateDashboardManagement(Case managementCase, DashboardManagementBody body) throws TransitionNotExecutableException;
+
+    /**
+     * Finds a dashboard management case by identifier.
+     *
+     * @param identifier the dashboard identifier to search for
+     * @return the dashboard management case, or null if not found
+     */
+    Case findDashboardManagement(String identifier);
+
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/IMenuItemService.java b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/IMenuItemService.java
new file mode 100644
index 00000000000..192974e13d1
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/menu/services/interfaces/IMenuItemService.java
@@ -0,0 +1,74 @@
+package com.netgrif.application.engine.menu.services.interfaces;
+
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public interface IMenuItemService {
+
+    Case createFilter(FilterBody body) throws TransitionNotExecutableException;
+
+    Case updateFilter(Case filterCase, FilterBody body);
+
+    Case createMenuItem(MenuItemBody body) throws TransitionNotExecutableException;
+
+    Case updateMenuItem(Case itemCase, MenuItemBody body) throws TransitionNotExecutableException;
+
+    Case createOrUpdateMenuItem(MenuItemBody body) throws TransitionNotExecutableException;
+
+    Case createOrIgnoreMenuItem(MenuItemBody body) throws TransitionNotExecutableException;
+
+    Case findMenuItem(String identifier);
+
+    Case findMenuItem(String identifier, boolean retry);
+
+    Case findMenuItem(String uri, String name);
+
+    Case findFolderCase(String path);
+
+    boolean existsMenuItem(String identifier);
+
+    void moveItem(Case item, String destUri) throws TransitionNotExecutableException;
+
+    Case duplicateItem(Case originItem, I18nString newTitle, String newIdentifier) throws TransitionNotExecutableException;
+
+    Case removeChildItemFromParent(String folderId, Case childItem);
+
+    /**
+     * Gets all tabbed or non-tabbed views
+     *
+     * @param isTabbed  if true, only tabbed views will be returned
+     * @param isPrimary if true, only views accessible directly from the menu_item will be returned
+     * @return All available views defined in {@link MenuItemView} in consideration of input value. Views are returned as
+     * options for {@link MapOptionsField}
+     */
+    default Map<String, I18nString> getAvailableViewsAsOptions(boolean isTabbed, boolean isPrimary) {
+        return MenuItemView.findAllByIsTabbedAndIsPrimary(isTabbed, isPrimary).stream()
+                .collect(Collectors.toMap(MenuItemView::getIdentifier, MenuItemView::getName));
+    }
+
+    /**
+     * Gets all tabbed or non-tabbed views
+     *
+     * @param isTabbed       if true, only tabbed views will be returned
+     * @param viewIdentifier identifier of view (defined in {@link MenuItemView}), which is parent to returned views
+     * @return All available views defined in {@link MenuItemView} in consideration of input values. Views are returned as
+     * options for {@link MapOptionsField}
+     */
+    default Map<String, I18nString> getAvailableViewsAsOptions(boolean isTabbed, String viewIdentifier) {
+        int index = viewIdentifier.lastIndexOf("_configuration");
+        if (index > 0) {
+            viewIdentifier = viewIdentifier.substring(0, index);
+        }
+        return MenuItemView.findAllByIsTabbedAndParentIdentifier(isTabbed, viewIdentifier).stream()
+                .collect(Collectors.toMap(MenuItemView::getIdentifier, MenuItemView::getName));
+    }
+
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java
index 3c7acc286dd..2cc3e4edff2 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/PetriNetController.java
@@ -1,22 +1,20 @@
 package com.netgrif.application.engine.petrinet.web;
 
 import com.netgrif.application.engine.AsyncRunner;
-import com.netgrif.application.engine.petrinet.web.responsebodies.PetriNetImportReference;
-import com.netgrif.application.engine.petrinet.web.responsebodies.ProcessRolesResource;
-import com.netgrif.application.engine.petrinet.web.responsebodies.TransitionReferencesResource;
-import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
+import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService;
+import com.netgrif.application.engine.elastic.service.interfaces.IElasticPetriNetService;
 import com.netgrif.application.engine.eventoutcomes.LocalisedEventOutcomeFactory;
 import com.netgrif.application.engine.importer.service.Importer;
-import com.netgrif.application.engine.importer.service.throwable.MissingIconKeyException;
+import com.netgrif.application.engine.objects.auth.domain.LoggedUser;
 import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
 import com.netgrif.application.engine.objects.petrinet.domain.PetriNetSearch;
 import com.netgrif.application.engine.objects.petrinet.domain.VersionType;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingIconKeyException;
 import com.netgrif.application.engine.objects.petrinet.domain.throwable.MissingPetriNetMetaDataException;
+import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome;
 import com.netgrif.application.engine.petrinet.domain.version.StringToVersionConverter;
 import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
-import com.netgrif.application.engine.adapter.spring.petrinet.service.ProcessRoleService;
 import com.netgrif.application.engine.petrinet.web.responsebodies.*;
-import com.netgrif.application.engine.objects.workflow.domain.eventoutcomes.petrinetoutcomes.ImportPetriNetEventOutcome;
 import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessage;
 import com.netgrif.application.engine.workflow.domain.eventoutcomes.response.EventOutcomeWithMessageResource;
 import com.netgrif.application.engine.workflow.web.responsebodies.MessageResource;
@@ -25,6 +23,7 @@
 import io.swagger.v3.oas.annotations.responses.ApiResponses;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,7 +35,10 @@
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.web.PagedResourcesAssembler;
 import org.springframework.hateoas.EntityModel;
+import org.springframework.hateoas.Link;
 import org.springframework.hateoas.MediaTypes;
+import org.springframework.hateoas.PagedModel;
+import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -44,7 +46,6 @@
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
-import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
@@ -69,6 +70,9 @@ public class PetriNetController {
     @Autowired
     private IPetriNetService service;
 
+    @Autowired
+    private IElasticPetriNetService elasticService;
+
     @Autowired
     private ProcessRoleService roleService;
 
@@ -193,6 +197,23 @@ ResponseEntity<Page<PetriNetReferenceResource>> searchPetriNets(@RequestBody Pet
         return ResponseEntity.ok(new PageImpl<>(nets.stream().map(PetriNetReferenceResource::new).toList(), pageable, nets.getTotalElements()));
     }
 
+    @Operation(summary = "Search elastic processes", security = {@SecurityRequirement(name = "BasicAuth")})
+    @PostMapping(value = "/search_elastic", produces = MediaTypes.HAL_JSON_VALUE)
+    public @ResponseBody
+    PagedModel<PetriNetReferenceResource> searchElasticPetriNets(@RequestBody PetriNetSearch criteria, Authentication auth, Pageable pageable, PagedResourcesAssembler<PetriNetReference> assembler, Locale locale) {
+        LoggedUser user = (LoggedUser) auth.getPrincipal();
+        // TODO: add Merge Filters and its operations
+
+        Page<PetriNetReference> nets = elasticService.search(criteria, user, pageable, locale, false);
+        Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(PetriNetController.class)
+                .searchElasticPetriNets(criteria, auth, pageable, assembler, locale)).withRel("search_elastic");
+
+//        TODO doriesit linky pista ich zakomentoval
+        PagedModel<PetriNetReferenceResource> resources = assembler.toModel(nets, new PetriNetReferenceResourceAssembler(), selfLink);
+        PetriNetReferenceResourceAssembler.buildLinks(resources);
+        return resources;
+    }
+
     @PreAuthorize("@petriNetAuthorizationService.canCallProcessDelete(#auth.getPrincipal(), #processId)")
     @Operation(summary = "Delete process",
             description = "Caller must have the ADMIN role. Removes the specified process, along with it's cases, tasks and process roles.",
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java
index e64befb85f0..e8f2b0e16a5 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/petrinet/web/responsebodies/PetriNetReferenceResourceAssembler.java
@@ -1,9 +1,7 @@
 package com.netgrif.application.engine.petrinet.web.responsebodies;
 
-import com.netgrif.application.engine.petrinet.web.PetriNetController;
 import org.springframework.hateoas.CollectionModel;
 import org.springframework.hateoas.server.RepresentationModelAssembler;
-import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;
 
 public class PetriNetReferenceResourceAssembler implements RepresentationModelAssembler<PetriNetReference, PetriNetReferenceResource> {
     public static void buildLinks(CollectionModel resources) {
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java
new file mode 100644
index 00000000000..eeab8452199
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardManagementRunner.java
@@ -0,0 +1,32 @@
+package com.netgrif.application.engine.startup.runner;
+
+import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
+import com.netgrif.application.engine.startup.ImportHelper;
+import com.netgrif.application.engine.startup.annotation.RunnerOrder;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+@Slf4j
+@Component
+@RunnerOrder(141)
+@RequiredArgsConstructor
+@ConditionalOnProperty(value = "netgrif.engine.dashboard.enabled", havingValue = "true", matchIfMissing = false)
+public class DashboardManagementRunner implements ApplicationEngineStartupRunner {
+
+    private final ImportHelper helper;
+
+    public static final String DASHBOARD_MANAGEMENT_NET_IDENTIFIER = "dashboard_management";
+    private static final String DASHBOARD_MANAGEMENT_FILE_NAME = "engine-processes/dashboard_management.xml";
+
+    public static final String DASHBOARD_ITEM_NET_IDENTIFIER = "dashboard_item";
+    private static final String DASHBOARD_ITEM_FILE_NAME = "engine-processes/dashboard_item.xml";
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        helper.importProcess("Petri net for dashboard management", DASHBOARD_MANAGEMENT_NET_IDENTIFIER, DASHBOARD_MANAGEMENT_FILE_NAME);
+        helper.importProcess("Petri net for dashboard items", DASHBOARD_ITEM_NET_IDENTIFIER, DASHBOARD_ITEM_FILE_NAME);
+    }
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java
index 94a2e38e1c6..ef803c4f3e4 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DashboardRunner.java
@@ -1,64 +1,34 @@
 package com.netgrif.application.engine.startup.runner;
 
-import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
-import com.netgrif.application.engine.objects.petrinet.domain.VersionType;
-import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
 import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
 import com.netgrif.application.engine.startup.ImportHelper;
 import com.netgrif.application.engine.startup.annotation.RunnerOrder;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Component;
 
-import java.util.Optional;
-
 @Slf4j
 @Component
 @RunnerOrder(140)
 @RequiredArgsConstructor
-@ConditionalOnProperty(value = "netgrif.engine.dashboard.enabled", matchIfMissing = false)
+@ConditionalOnProperty(value = "netgrif.engine.dashboard.enabled", havingValue = "true", matchIfMissing = false)
 public class DashboardRunner implements ApplicationEngineStartupRunner {
 
+    private final ImportHelper helper;
+
     public static final String DASHBOARD_NET_IDENTIFIER = "dashboard";
+    private static final String DASHBOARD_FILE_NAME = "engine-processes/dashboard.xml";
+
     public static final String DASHBOARD_TILE_NET_IDENTIFIER = "dashboard_tile";
     private static final String DASHBOARD_TILE_FILE_NAME = "engine-processes/dashboard_tile.xml";
-    private static final String DASHBOARD_FILE_NAME = "engine-processes/dashboard.xml";
 
-    private final IPetriNetService petriNetService;
-    private final ImportHelper helper;
-    private final SystemUserRunner systemCreator;
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
-        createDashboardNet();
-        createDashboardTileNet();
-    }
-
-    public Optional<PetriNet> createDashboardNet() {
-        return importProcess("Petri net for filters", DASHBOARD_NET_IDENTIFIER, DASHBOARD_FILE_NAME);
+        helper.importProcess("Petri net for dashboard", DASHBOARD_NET_IDENTIFIER, DASHBOARD_FILE_NAME);
+        helper.importProcess("Petri net for dashboard tile", DASHBOARD_TILE_NET_IDENTIFIER, DASHBOARD_TILE_FILE_NAME);
     }
-
-    public Optional<PetriNet> createDashboardTileNet() {
-        return importProcess("Petri net for filter preferences", DASHBOARD_TILE_NET_IDENTIFIER, DASHBOARD_TILE_FILE_NAME);
-    }
-
-    public Optional<PetriNet> importProcess(final String message, String netIdentifier, String netFileName) {
-        PetriNet filter = petriNetService.getNewestVersionByIdentifier(netIdentifier);
-        if (filter != null) {
-            log.info("{} has already been imported.", message);
-            return Optional.of(filter);
-        }
-
-        Optional<PetriNet> filterNet = helper.createNet(netFileName, VersionType.MAJOR, systemCreator.getLoggedSystem());
-
-        if (filterNet.isEmpty()) {
-            log.error("Import of {} failed!", message);
-        }
-
-        return filterNet;
-    }
-
-
 }
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultDashboardRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultDashboardRunner.java
new file mode 100644
index 00000000000..c3e5266e41f
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/DefaultDashboardRunner.java
@@ -0,0 +1,42 @@
+package com.netgrif.application.engine.startup.runner;
+
+import com.netgrif.application.engine.menu.services.interfaces.DashboardManagementService;
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.throwable.TransitionNotExecutableException;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody;
+import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
+import com.netgrif.application.engine.startup.annotation.RunnerOrder;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+@Slf4j
+@Component
+@RunnerOrder(142)
+@RequiredArgsConstructor
+@ConditionalOnProperty(value = "netgrif.engine.dashboard.enabled", havingValue = "true", matchIfMissing = false)
+public class DefaultDashboardRunner implements ApplicationEngineStartupRunner {
+
+    private final DashboardManagementService dashboardManagementService;
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        try {
+            createMainDashboardManagementItem();
+        } catch (Exception e) {
+            log.error("Error while creating default dashboard management item", e);
+        }
+    }
+
+    Case createMainDashboardManagementItem() throws TransitionNotExecutableException {
+        DashboardManagementBody dashboardItemBody = new DashboardManagementBody("main_dashboard", new I18nString("Main Dashboard", Map.of("sk", "Hlavný Dashboard", "de", "Haupt-Dashboard")));
+        dashboardItemBody.setLogoutDashboard(true);
+
+        return dashboardManagementService.createDashboardManagement(dashboardItemBody);
+    }
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java
index f001c86b02b..4c4010ff3ab 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/FilterRunner.java
@@ -1,8 +1,5 @@
 package com.netgrif.application.engine.startup.runner;
 
-import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
-import com.netgrif.application.engine.objects.petrinet.domain.VersionType;
-import com.netgrif.application.engine.petrinet.service.interfaces.IPetriNetService;
 import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
 import com.netgrif.application.engine.startup.ImportHelper;
 import com.netgrif.application.engine.startup.annotation.RunnerOrder;
@@ -11,63 +8,29 @@
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.stereotype.Component;
 
-import java.util.Optional;
-
 @Slf4j
 @Component
 @RunnerOrder(100)
 @RequiredArgsConstructor
 public class FilterRunner implements ApplicationEngineStartupRunner {
 
-    public static final String FILTER_PETRI_NET_IDENTIFIER = "filter";
-    public static final String PREFERRED_ITEM_NET_IDENTIFIER = "preference_item";
+    private final ImportHelper helper;
 
     private static final String FILTER_FILE_NAME = "engine-processes/filter.xml";
-    private static final String PREFERRED_ITEM_FILE_NAME = "engine-processes/preference_item.xml";
+    public static final String FILTER_PETRI_NET_IDENTIFIER = "filter";
+
     private static final String EXPORT_FILTER_FILE_NAME = "engine-processes/export_filters.xml";
     private static final String EXPORT_NET_IDENTIFIER = "export_filters";
+
     private static final String IMPORT_FILTER_FILE_NAME = "engine-processes/import_filters.xml";
     private static final String IMPORT_NET_IDENTIFIER = "import_filters";
 
-    private final IPetriNetService petriNetService;
-    private final ImportHelper helper;
-    private final SystemUserRunner systemCreator;
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
-        createFilterNet();
-        createPreferenceItemNet();
-        createImportFiltersNet();
-        createExportFiltersNet();
-    }
-
-    public Optional<PetriNet> createFilterNet() {
-        return importProcess("Petri net for filters", FILTER_PETRI_NET_IDENTIFIER, FILTER_FILE_NAME);
-    }
-
-    public Optional<PetriNet> createPreferenceItemNet() {
-        return importProcess("Petri net for filter preferences", PREFERRED_ITEM_NET_IDENTIFIER, PREFERRED_ITEM_FILE_NAME);
-    }
-
-    public Optional<PetriNet> createImportFiltersNet() {
-        return importProcess("Petri net for importing filters", IMPORT_NET_IDENTIFIER, IMPORT_FILTER_FILE_NAME);
-    }
-
-    public Optional<PetriNet> createExportFiltersNet() {
-        return importProcess("Petri net for exporting filters", EXPORT_NET_IDENTIFIER, EXPORT_FILTER_FILE_NAME);
-    }
-
-    protected Optional<PetriNet> importProcess(final String message, String netIdentifier, String netFileName) {
-        PetriNet filter = petriNetService.getNewestVersionByIdentifier(netIdentifier);
-        if (filter != null) {
-            log.info("{} has already been imported.", message);
-            return Optional.of(filter);
-        }
-        Optional<PetriNet> filterNet = helper.createNet(netFileName, VersionType.MAJOR, systemCreator.getLoggedSystem());
-        if (filterNet.isEmpty()) {
-            log.error("Import of {} failed!", message);
-        }
-        return filterNet;
+        helper.importProcess("Petri net for filters", FILTER_PETRI_NET_IDENTIFIER, FILTER_FILE_NAME);
+        helper.importProcess("Petri net for importing filters", IMPORT_NET_IDENTIFIER, IMPORT_FILTER_FILE_NAME);
+        helper.importProcess("Petri net for exporting filters", EXPORT_NET_IDENTIFIER, EXPORT_FILTER_FILE_NAME);
     }
 
 }
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java
new file mode 100644
index 00000000000..68a2281754f
--- /dev/null
+++ b/application-engine/src/main/java/com/netgrif/application/engine/startup/runner/MenuProcessRunner.java
@@ -0,0 +1,51 @@
+package com.netgrif.application.engine.startup.runner;
+
+import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.startup.ApplicationEngineStartupRunner;
+import com.netgrif.application.engine.startup.ImportHelper;
+import com.netgrif.application.engine.startup.annotation.RunnerOrder;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+@RunnerOrder(101)
+@RequiredArgsConstructor
+public class MenuProcessRunner implements ApplicationEngineStartupRunner {
+
+    private final ImportHelper helper;
+
+    private static final String MENU_ITEM_FILE_NAME = "engine-processes/menu/menu_item.xml";
+    public static final String MENU_NET_IDENTIFIER = "menu_item";
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        helper.importProcess("Petri net for filter preferences", MENU_NET_IDENTIFIER, MENU_ITEM_FILE_NAME);
+        createConfigurationNets();
+    }
+
+    private List<PetriNet> createConfigurationNets() {
+        return Arrays.stream(MenuItemView.values())
+                .map(view -> {
+                    String processIdentifier = view.getIdentifier() + "_configuration";
+                    String filePath = String.format("engine-processes/menu/%s.xml", processIdentifier);
+                    return helper.importProcess(
+                            String.format("Petri net for %s", processIdentifier),
+                            processIdentifier,
+                            filePath
+                    );
+                })
+                .filter(Optional::isPresent)
+                .map(Optional::get)
+                .collect(Collectors.toList());
+    }
+
+}
diff --git a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java
index 9b17ee28181..bf932161134 100644
--- a/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java
+++ b/application-engine/src/main/java/com/netgrif/application/engine/workflow/web/WorkflowController.java
@@ -120,6 +120,7 @@ public PagedModel<CaseResource> search2(@QuerydslPredicate(root = Case.class) Pr
     @PostMapping(value = "/case/search", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaTypes.HAL_JSON_VALUE)
     public PagedModel<CaseResource> search(@RequestBody SingleCaseSearchRequestAsList searchBody, @RequestParam(defaultValue = "OR") MergeFilterOperation operation, Pageable pageable, PagedResourcesAssembler<Case> assembler, Authentication auth, Locale locale) {
         LoggedUser user = (LoggedUser) auth.getPrincipal();
+
         Page<Case> cases = elasticCaseService.search(searchBody.getList(), user, pageable, locale, operation == MergeFilterOperation.AND);
         Link selfLink = WebMvcLinkBuilder.linkTo(WebMvcLinkBuilder.methodOn(WorkflowController.class)
                 .search(searchBody, operation, pageable, assembler, auth, locale)).withRel("search");
diff --git a/application-engine/src/main/resources/application-dev.yaml b/application-engine/src/main/resources/application-dev.yaml
index 2b3747cf086..3281960f14b 100644
--- a/application-engine/src/main/resources/application-dev.yaml
+++ b/application-engine/src/main/resources/application-dev.yaml
@@ -35,3 +35,5 @@ netgrif:
           enabled: "false"
         mail:
           enabled: "false"
+    dashboard:
+      enabled: true
diff --git a/application-engine/src/main/resources/application.yaml b/application-engine/src/main/resources/application.yaml
index dc8561d1f40..8f91b19e1fd 100644
--- a/application-engine/src/main/resources/application.yaml
+++ b/application-engine/src/main/resources/application.yaml
@@ -158,3 +158,5 @@ netgrif:
                           runner:
                             RoleActionsRunner: debug
                             CaseFieldsExpressionRunner: debug
+    actions:
+      imports: com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemBody,com.netgrif.application.engine.objects.petrinet.domain.I18nString,com.netgrif.application.engine.objects.workflow.domain.menu.dashboard.DashboardManagementBody
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml
new file mode 100644
index 00000000000..d3205bdfb27
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_item.xml
@@ -0,0 +1,762 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>dashboard_item</id>
+    <initials>DBI</initials>
+    <title>Dashboard item</title>
+    <icon>crop_square</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+
+    <caseEvents>
+        <event type="delete">
+            <id>menu_item_delete</id>
+            <actions phase="pre">
+                <action id="0">
+                    removeRefFromParent()
+                </action>
+            </actions>
+        </event>
+    </caseEvents>
+
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <function scope="process" name="removeRefFromParent">
+        { ->
+            def cases = findCasesElastic("processIdentifier:\"dashboard_management\" AND dataSet.items_order.textValue:\"$useCase.stringId\"")
+            cases.each { refCase ->
+                def refTask = refCase.tasks.find { it.transition == "configuration" }.task
+                def itemsOrder = refCase.dataSet["items_order"].value.split(",") as ArrayList
+                itemsOrder.remove(useCase.stringId)
+
+                def dashboardItemsListOptions = refCase.dataSet["dashboard_item_list"].options
+                dashboardItemsListOptions.remove(useCase.stringId)
+
+                setData(refTask,[
+                        "dashboard_item_list": ["type": "enumeration_map", "value": "", "options": dashboardItemsListOptions],
+                        "items_order": ["type": "text", "value": itemsOrder.join(",")]
+                ])
+            }
+
+        }
+    </function>
+
+    <data type="text" immediate="true">
+        <id>item_id</id>
+        <title name="item_id">Dashboard item ID</title>
+        <desc name="item_id_desc">Unique identifier of dashboard item</desc>
+        <event type="set">
+            <id>item_id_set</id>
+            <actions phase="post">
+                <action>
+                    item_id: f.item_id;
+
+                    if (item_id.value == "") {
+                        return
+                    }
+                    def itemWithIdExists = findCaseElastic("processIdentifier:\"dashboard_item\" AND dataSet.item_id.textValue.keyword:\"${item_id.value}\" AND dataSet.is_active.booleanValue:true" as String)
+                    if (itemWithIdExists != null) {
+                        throw new IllegalArgumentException("Dashboard item with given ID already exists.")
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>menu_items_list</id>
+        <title name="menu_items_list">Existing menu items</title>
+        <desc name="menu_items_list_desc">List of all existing menu items</desc>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <event type="get">
+            <id>menu_items_list_get</id>
+            <actions phase="post">
+                <action>
+                    menu_items_list: f.menu_items_list;
+
+                    def menuItemCases = findCasesElastic("processIdentifier:\"menu_item\"" as String)
+                            .collectEntries { [(it.stringId): it.dataSet["menu_name"].value] }
+                    change menu_items_list options { menuItemCases }
+                </action>
+            </actions>
+        </event>
+        <event type="set">
+            <id>menu_items_list_set</id>
+            <actions phase="post">
+                <action>
+                    icon_color: f.icon_color,
+                    font_color: f.font_color,
+                    font_weight: f.font_weight,
+                    inherit_name: f.inherit_name,
+                    inherit_icon: f.inherit_icon,
+                    menu_item_taskRef: f.menu_item_taskRef,
+                    filter_divider: f.filter_divider,
+                    menu_items_list: f.menu_items_list,
+                    trans: t.configuration;
+
+                    change inherit_icon value { true }
+                    change inherit_name value { true }
+                    if (menu_items_list.value != null &amp;&amp; menu_items_list.value != null) {
+                        make [inherit_name, inherit_icon, icon_color, font_color, font_weight], editable on trans when { true }
+                        make [menu_item_taskRef, filter_divider], visible on trans when { true }
+                        def menuItemCase = workflowService.findOne(menu_items_list.value)
+                        change menu_item_taskRef value { [menuItemCase.tasks.find { it.transition == "item_settings" }?.task] }
+                    } else {
+                        make [inherit_name, inherit_icon, icon_color, font_color, font_weight], visible on trans when { true }
+                        make [menu_item_taskRef, filter_divider], hidden on trans when { true }
+                        change menu_item_taskRef value { [] }
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>is_internal</id>
+        <title name="is_internal">Internal item</title>
+        <desc name="is_internal_desc">Internal menu item or link to external website URL</desc>
+        <init>true</init>
+        <event type="set">
+            <id>is_internal_set</id>
+            <actions phase="post">
+                <action>
+                    item_name: f.item_name,
+                    item_icon: f.item_icon,
+                    external_icon: f.external_icon,
+                    menu_items_list: f.menu_items_list,
+                    external_url: f.external_url,
+                    is_internal: f.is_internal;
+
+                    change external_icon value { false }
+                    if (is_internal.value) {
+                        change menu_items_list value { "" }
+                    } else {
+                        change item_icon value { "" }
+                        change item_name value { new com.netgrif.application.engine.objects.petrinet.domain.I18nString("") }
+                        change external_url value { "" }
+                    }
+                </action>
+                <action>
+                    font_color: f.font_color,
+                    font_weight: f.font_weight,
+                    is_internal: f.is_internal,
+                    item_name: f.item_name,
+                    item_icon: f.item_icon,
+                    external_icon: f.external_icon,
+                    menu_items_list: f.menu_items_list,
+                    item_icon_preview: f.item_icon_preview,
+                    external_url: f.external_url,
+                    inherit_name: f.inherit_name,
+                    inherit_icon: f.inherit_icon,
+                    menu_item_taskRef: f.menu_item_taskRef,
+                    filter_divider: f.filter_divider,
+                    trans: t.configuration;
+
+                    if (is_internal.value) {
+                        make [menu_items_list], editable on trans when { true }
+                        make [external_url], hidden on trans when { true }
+                    } else {
+                        make [item_icon, item_name, external_url, external_icon, font_color, font_weight], editable on trans when { true }
+                        make item_icon_preview, visible on trans when { true }
+                        make [inherit_name, inherit_icon, menu_items_list, menu_item_taskRef, filter_divider], hidden on trans when { true }
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="text" immediate="true">
+        <id>external_url</id>
+        <title name="external_url">External URL</title>
+        <desc name="external_url_desc">Link for external website URL</desc>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>external_icon</id>
+        <title name="external_icon">Icon from URL</title>
+        <desc name="external_icon_desc">Icon will be loaded from external website URL</desc>
+        <event type="set">
+            <id>external_icon_set</id>
+            <actions phase="post">
+                <action>
+                    menu_items_list: f.menu_items_list,
+                    inherit_icon: f.inherit_icon,
+                    external_icon: f.external_icon,
+                    icon_color: f.icon_color,
+                    item_icon: f.item_icon,
+                    is_internal: f.is_internal,
+                    trans: t.configuration;
+
+                    if (!inherit_icon.value  || !is_internal.value) {
+                        change item_icon value { "" }
+                    }
+                    if (external_icon.value) {
+                        make icon_color, visible on trans when { true }
+                    } else if (!(is_internal.value &amp;&amp; (menu_items_list.value == null || menu_items_list.value == ""))) {
+                        make icon_color, editable on trans when { true }
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="text" immediate="true">
+        <id>icon_color</id>
+        <title name="icon_color">Icon color</title>
+        <desc name="icon_color_desc">Icon color of item. Valid CSS property value font-color.</desc>
+        <init>#0790ff</init>
+        <event type="set">
+            <id>icon_color_set</id>
+            <actions phase="post">
+                <action>
+                    icon_color: f.icon_color,
+                    icon: f.item_icon,
+                    iconPreview: f.item_icon_preview;
+
+                    change iconPreview value {
+                        <![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons" style="color:"""]]> + icon_color.value + <![CDATA[""";">"""]]> + icon.value + <![CDATA["""</span>"""]]>
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="text" immediate="true">
+        <id>item_icon</id>
+        <title name="item_icon">Item icon identifier</title>
+        <desc name="item_icon_desc">Material icon identifier. List of icons with identifiers is available online. Icon will be displayed in dashboard.</desc>
+        <action trigger="set">
+            icon_color: f.icon_color,
+            external_icon: f.external_icon,
+            icon: f.this,
+            iconPreview: f.item_icon_preview;
+
+            if (icon.value == "") {
+                change iconPreview value {<![CDATA["""<span></span>"""]]>}
+                return;
+            }
+            if (external_icon.value) {
+                change iconPreview value {
+                    <![CDATA["""<img src=" """]]> + icon.value + <![CDATA[""" " style="height:60px;width:auto">"""]]>
+                }
+            } else {
+                change iconPreview value {
+                    <![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons" style="color:"""]]> + icon_color.value + <![CDATA[""";">"""]]> + icon.value + <![CDATA["""</span>"""]]>
+                }
+            }
+
+        </action>
+    </data>
+    <data type="text">
+        <id>item_icon_preview</id>
+        <title/>
+        <component>
+            <name>htmltextarea</name>
+        </component>
+    </data>
+    <data type="text" immediate="true">
+        <id>font_color</id>
+        <title name="font_color">Font color</title>
+        <desc name="font_color_desc">Font color of item name. Valid CSS property value font-color.</desc>
+        <init>#0790ff</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>font_weight</id>
+        <title name="font_weight">Font weight</title>
+        <desc name="font_weight_desc">Font weight of item name. Valid CSS property value font-weight.</desc>
+        <init>400</init>
+    </data>
+    <data type="i18n" immediate="true">
+        <id>item_name</id>
+        <title name="item_name">Item name</title>
+        <desc name="item_name_desc">Item name which will be displayed in dashboard</desc>
+    </data>
+    <data type="boolean">
+        <id>inherit_icon</id>
+        <title name="inherit_icon">Inherit icon</title>
+        <desc name="inherit_icon_desc">Check if icon should be inherited from menu item</desc>
+        <init>true</init>
+        <event type="set">
+            <id>inherit_icon_set</id>
+            <actions phase="post">
+                <action>
+                    inherit_icon: f.inherit_icon,
+                    item_icon_preview: f.item_icon_preview,
+                    external_icon: f.external_icon,
+                    item_icon: f.item_icon,
+                    menu_items_list: f.menu_items_list,
+                    trans: t.configuration;
+
+                    change external_icon value { false }
+                    if (inherit_icon.value) {
+                        make [item_icon, item_icon_preview, external_icon], visible on trans when { true }
+                        if (menu_items_list.value != null) {
+                            def menuItemCase = workflowService.findOne(menu_items_list.value)
+                            change item_icon value { menuItemCase.dataSet["menu_icon"].value }
+                        } else {
+                            change item_icon value { "" }
+                        }
+                    } else {
+                        make [item_icon, external_icon], editable on trans when { true }
+                        make item_icon_preview, visible on trans when { true }
+                        change item_icon value { "" }
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="boolean">
+        <id>inherit_name</id>
+        <title name="inherit_name">Inherit name from menu item</title>
+        <desc name="inherit_name_desc">Name should be inherited from menu item</desc>
+        <init>true</init>
+        <event type="set">
+            <id>inherit_name_set</id>
+            <actions phase="post">
+                <action>
+                    inherit_name: f.inherit_name,
+                    item_name: f.item_name,
+                    menu_items_list: f.menu_items_list;
+
+                    if (inherit_name.value) {
+                        if (menu_items_list.value != null) {
+                            def menuItemCase = workflowService.findOne(menu_items_list.value)
+                            change item_name value { menuItemCase.dataSet["menu_name"].value }
+                        } else {
+                            change item_name value { new com.netgrif.application.engine.objects.petrinet.domain.I18nString("") }
+                        }
+                    } else {
+                        change item_name value { new com.netgrif.application.engine.objects.petrinet.domain.I18nString("") }
+                    }
+                </action>
+                <action>
+                    inherit_name: f.inherit_name,
+                    item_name: f.item_name,
+                    trans: t.configuration;
+
+                    if (inherit_name.value) {
+                        make item_name, visible on trans when { true }
+                    } else {
+                        make item_name, editable on trans when { true }
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="taskRef">
+        <id>menu_item_taskRef</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>filter_divider</id>
+        <title/>
+        <init dynamic="true">
+            new com.netgrif.application.engine.objects.petrinet.domain.I18nString("Menu item data", [sk: "Dáta menu položky", de: "Daten zum Menüpunkt"])
+        </init>
+        <component>
+            <name>divider</name>
+            <property key="fontSize">16</property>
+        </component>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>is_active</id>
+        <title/>
+        <init>false</init>
+    </data>
+
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="item_id">ID položky panelu</i18nString>
+        <i18nString name="item_id_desc">Unikátny identifikátor položky panelu</i18nString>
+        <i18nString name="menu_items_list">Existujúce menu položky</i18nString>
+        <i18nString name="menu_items_list_desc">Zoznam všetkých existujúcich menu položiek</i18nString>
+        <i18nString name="is_internal">Interná položka</i18nString>
+        <i18nString name="is_internal_desc">Položka interného menu alebo odkaz na externú webovú adresu URL</i18nString>
+        <i18nString name="external_url">Externá adresa URL</i18nString>
+        <i18nString name="external_url_desc">Odkaz na externú webovú adresu URL</i18nString>
+        <i18nString name="item_icon">Identifikátor ikony položky</i18nString>
+        <i18nString name="item_icon_desc">Identifikátor Material ikony. Zoznam ikon s identifikátormi je dostupný online. Ikona sa zobrazí v panely.</i18nString>
+        <i18nString name="external_icon">Ikona z adresy URL</i18nString>
+        <i18nString name="external_icon_desc">Ikona bude načítaná z externej URL adresy</i18nString>
+        <i18nString name="icon_color">Farba ikony</i18nString>
+        <i18nString name="icon_color_desc">Farba ikony položky. Valídna CSS hodnota font-color.</i18nString>
+        <i18nString name="font_color">Farba písma</i18nString>
+        <i18nString name="font_color_desc">Farba písma názvu položky. Valídna CSS hodnota font-color.</i18nString>
+        <i18nString name="font_weight">Hrúbka písma</i18nString>
+        <i18nString name="font_weight_desc">Hrúbka písma menu položky. Valídna CSS hodnota font-weight.</i18nString>
+        <i18nString name="item_name">Názov položky</i18nString>
+        <i18nString name="item_name_desc">Názov položky, ktorá sa zobrazí v panely</i18nString>
+        <i18nString name="inherit_icon">Prebrať ikonu</i18nString>
+        <i18nString name="inherit_icon_desc">Ikona by mala byť prebratá z menu položky</i18nString>
+        <i18nString name="inherit_name">Prebrať názov</i18nString>
+        <i18nString name="inherit_name_desc">Názov by mal byť prebratý z menu položky</i18nString>
+        <i18nString name="configuration_label">Konfigurácia položky panelu</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="item_id">Dashboard-Element-ID</i18nString>
+        <i18nString name="item_id_desc">Eindeutiger Bezeichner des Dashboard-Elements</i18nString>
+        <i18nString name="menu_items_list">Vorhandene Menüpunkte</i18nString>
+        <i18nString name="menu_items_list_desc">Liste aller vorhandenen Menüpunkte</i18nString>
+        <i18nString name="is_internal">Interner Posten</i18nString>
+        <i18nString name="is_internal_desc">Interner Menüpunkt oder Link zu externer Website-URL</i18nString>
+        <i18nString name="external_url">Externe URL</i18nString>
+        <i18nString name="external_url_desc">Link für externe Website-URL</i18nString>
+        <i18nString name="item_icon">Bezeichner des Artikelsymbols</i18nString>
+        <i18nString name="item_icon_desc">Kennung der Materialikone. Die Liste der Symbole mit den Bezeichnungen ist online verfügbar. Das Symbol wird im Dashboard angezeigt.</i18nString>
+        <i18nString name="external_icon">Symbol aus URL</i18nString>
+        <i18nString name="external_icon_desc">Das Symbol wird von einer externen Website-URL geladen</i18nString>
+        <i18nString name="icon_color">Farbe des Symbols</i18nString>
+        <i18nString name="icon_color_desc">Symbolfarbe des Elements. Gültiger CSS-Eigenschaftswert font-color.</i18nString>
+        <i18nString name="font_color">Schriftfarbe</i18nString>
+        <i18nString name="font_color_desc">Schriftfarbe des Artikelnamens. Gültiger CSS-Eigenschaftswert font-color.</i18nString>
+        <i18nString name="font_weight">Gewicht der Schriftart</i18nString>
+        <i18nString name="font_weight_desc">Schriftstärke des Artikelnamens. Gültiger CSS-Eigenschaftswert font-weight.</i18nString>
+        <i18nString name="item_name">Name des Gegenstands</i18nString>
+        <i18nString name="item_name_desc">Artikelbezeichnung, die im Dashboard angezeigt wird</i18nString>
+        <i18nString name="inherit_icon">Symbol vererben</i18nString>
+        <i18nString name="inherit_icon_desc">Prüfen, ob das Symbol vom Menüpunkt geerbt werden soll</i18nString>
+        <i18nString name="inherit_name">Name von Menüpunkt vererben</i18nString>
+        <i18nString name="inherit_name_desc">Name sollte vom Menüpunkt geerbt werden</i18nString>
+        <i18nString name="configuration_label">Konfiguration von Dashboard-Elementen</i18nString>
+    </i18n>
+
+    <!-- TRANSITIONS -->
+    <transition>
+        <id>configuration</id>
+        <x>400</x>
+        <y>112</y>
+        <label name="configuration_label">Dashboard item configuration</label>
+        <icon>tune</icon>
+        <assignPolicy>auto</assignPolicy>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>configuration_d1</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>item_id</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>is_internal</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>configuration_internal</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>menu_items_list</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>inherit_name</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>inherit_icon</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>configuration_general</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>item_name</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>font_color</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>font_weight</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>item_icon</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>external_icon</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>icon_color</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>item_icon_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>filter_divider</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>menu_item_taskRef</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>3</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>configuration_external</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>external_url</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <event type="assign">
+            <id>configuration_assign</id>
+            <actions phase="post">
+                <action>
+                    is_active: f.is_active;
+
+                    change is_active value { false }
+                </action>
+            </actions>
+        </event>
+        <event type="finish">
+            <id>configuration_finish</id>
+            <actions phase="pre">
+                <action>
+                    item_id: f.item_id,
+                    item_name: f.item_name,
+                    is_internal: f.is_internal,
+                    menu_items_list: f.menu_items_list,
+                    external_url: f.external_url,
+                    is_active: f.is_active;
+
+                    if (item_id.value == null || item_id.value == "") {
+                        throw new IllegalArgumentException("Dashboard item ID cannot be empty.")
+                    }
+                    def itemWithIdExists = findCaseElastic("processIdentifier:\"dashboard_item\" AND dataSet.item_id.textValue.keyword:\"${item_id.value}\" AND dataSet.is_active.booleanValue:true" as String)
+                    if (itemWithIdExists != null) {
+                        throw new IllegalArgumentException("Dashboard item with given ID already exists.")
+                    }
+                    if (is_internal.value) {
+                        if (menu_items_list.value == null || menu_items_list.value == ""){
+                            throw new IllegalArgumentException("Internal menu item must be selected.")
+                        }
+                    } else {
+                        if (external_url.value == null || external_url.value == "") {
+                            throw new IllegalArgumentException("External URL cannot be empty.")
+                        }
+                    }
+                    change is_active value { true }
+                </action>
+            </actions>
+        </event>
+    </transition>
+    <place>
+        <id>p1</id>
+        <x>208</x>
+        <y>112</y>
+        <label/>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>regular</type>
+        <sourceId>p1</sourceId>
+        <destinationId>configuration</destinationId>
+        <multiplicity>1</multiplicity>
+        <breakpoint>
+            <x>304</x>
+            <y>144</y>
+        </breakpoint>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>configuration</sourceId>
+        <destinationId>p1</destinationId>
+        <multiplicity>1</multiplicity>
+        <breakpoint>
+            <x>304</x>
+            <y>80</y>
+        </breakpoint>
+    </arc>
+</document>
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/dashboard_management.xml b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_management.xml
new file mode 100644
index 00000000000..2475b28d29a
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/dashboard_management.xml
@@ -0,0 +1,732 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>dashboard_management</id>
+    <initials>DBM</initials>
+    <title>Dashboard management</title>
+    <icon>dashboard</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <data type="text" immediate="true">
+        <id>dashboard_id</id>
+        <title name="dashboard_id">Dashboard ID</title>
+        <desc name="dashboard_id_desc">Unique identifier of dashboard</desc>
+        <event type="set">
+            <id>dashboard_id_set</id>
+            <actions phase="post">
+                <action>
+                    dashboard_id: f.dashboard_id;
+
+                    if (dashboard_id.value == "") {
+                        return
+                    }
+                    def dashboardWithIdExists = findCaseElastic("processIdentifier:\"dashboard_management\" AND dataSet.dashboard_id.textValue.keyword:\"${dashboard_id.value}\" AND dataSet.is_active.booleanValue:true" as String)
+                    if (dashboardWithIdExists != null) {
+                        throw new IllegalArgumentException("Dashboard with given ID already exists.")
+                    }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="i18n" immediate="true">
+        <id>dashboard_name</id>
+        <title name="dashboard_name">Dashboard name</title>
+        <desc name="dashboard_name_desc">Dashboard name to be displayed in application dashboard</desc>
+    </data>
+    <data type="text" immediate="true">
+        <id>dashboard_logo</id>
+        <title name="dashboard_logo">Dashboard logo</title>
+        <desc name="dashboard_logo_desc">Dashboard logo to be displayed in application dashboard</desc>
+        <init>assets/img/netgrif_full_white.svg</init>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>dashboard_item_list</id>
+        <title name="dashboard_item_list">Dashboard items</title>
+        <desc name="dashboard_item_list_desc">List of dashboard items to be displayed in application dashboard</desc>
+        <component>
+            <name>list</name>
+        </component>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>dashboard_item_to_menu_item</id>
+        <title/>
+    </data>
+    <data type="button">
+        <id>order_down</id>
+        <title/>
+        <placeholder>south</placeholder>
+        <component>
+            <name>icon</name>
+            <property key="stretch">true</property>
+        </component>
+        <event type="set">
+            <id>order_down_set</id>
+            <actions phase="post">
+                <action>
+                    dashboard_item_to_menu_item: f.dashboard_item_to_menu_item,
+                    items_order: f.items_order,
+                    dashboard_item_list: f.dashboard_item_list;
+
+                    if (dashboard_item_list.value == null || dashboard_item_list.value == "") {
+                        return
+                    }
+                    def keysDashboard = dashboard_item_list.options.keySet() as List
+                    def keysMenu = dashboard_item_to_menu_item.options.keySet() as List
+                    def currentIndex = keysDashboard.indexOf(dashboard_item_list.value)
+                    if (currentIndex == keysDashboard.size() - 1) {
+                        return
+                    }
+                    java.util.Collections.swap(keysDashboard, currentIndex, currentIndex + 1)
+                    java.util.Collections.swap(keysMenu, currentIndex, currentIndex + 1)
+                    def newOrderDashboard = [:]
+                    def newOrderMenu = [:]
+                    keysDashboard.forEach { newOrderDashboard[it] = dashboard_item_list.options[it]}
+                    keysMenu.forEach { newOrderMenu[it] = dashboard_item_to_menu_item.options[it]}
+                    change dashboard_item_list options { newOrderDashboard }
+                    change dashboard_item_to_menu_item options { newOrderMenu }
+                    change items_order value { String.join(",", newOrderDashboard.keySet()) }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="button">
+        <id>order_up</id>
+        <title/>
+        <placeholder>north</placeholder>
+        <component>
+            <name>icon</name>
+            <property key="stretch">true</property>
+        </component>
+        <event type="set">
+            <id>order_up_set</id>
+            <actions phase="post">
+                <action>
+                    dashboard_item_to_menu_item: f.dashboard_item_to_menu_item,
+                    items_order: f.items_order,
+                    dashboard_item_list: f.dashboard_item_list;
+
+                    if (dashboard_item_list.value == null || dashboard_item_list.value == "") {
+                        return
+                    }
+                    def keysDashboard = dashboard_item_list.options.keySet() as List
+                    def keysMenu = dashboard_item_to_menu_item.options.keySet() as List
+                    def currentIndex = keysDashboard.indexOf(dashboard_item_list.value)
+                    if (currentIndex == 0) {
+                        return
+                    }
+                    java.util.Collections.swap(keysDashboard, currentIndex, currentIndex - 1)
+                    java.util.Collections.swap(keysMenu, currentIndex, currentIndex - 1)
+                    def newOrderDashboard = [:]
+                    def newOrderMenu = [:]
+                    keysDashboard.forEach { newOrderDashboard[it] = dashboard_item_list.options[it]}
+                    keysMenu.forEach { newOrderMenu[it] = dashboard_item_to_menu_item.options[it]}
+                    change dashboard_item_list options { newOrderDashboard }
+                    change dashboard_item_to_menu_item options { newOrderMenu }
+                    change items_order value { String.join(",", newOrderDashboard.keySet()) }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="enumeration_map">
+        <id>existing_menu_items</id>
+        <title name="existing_menu_items">Existing dashboard items</title>
+        <desc name="existing_menu_items_desc">List of all existing dashboard items which can be added to dashboard</desc>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <event type="get">
+            <id>existing_menu_items_get</id>
+            <actions phase="post">
+                <action>
+                    dashboard_item_list: f.dashboard_item_list,
+                    existing_menu_items: f.existing_menu_items;
+
+                    def dashboardItemCases = findCasesElastic("processIdentifier:\"dashboard_item\" AND dataSet.is_active.booleanValue:true" as String)
+                            .collectEntries { [(it.stringId): it.dataSet["item_name"].value] }
+                    dashboardItemCases.keySet().removeAll(dashboard_item_list.options.keySet())
+                    change existing_menu_items options { dashboardItemCases }
+                </action>
+            </actions>
+        </event>
+        <event type="set">
+            <id>existing_menu_items_set</id>
+            <actions phase="post">
+                <action>
+                    item_divider: f.item_divider,
+                    dashboard_item_taskRef: f.dashboard_item_taskRef,
+                    existing_menu_items: f.existing_menu_items,
+                    trans: t.configuration;
+
+                    if (existing_menu_items.value == null || existing_menu_items.value == "") {
+                        change dashboard_item_taskRef value { [] }
+                        make item_divider, hidden on trans when { true }
+                        return
+                    }
+                    def dashboardItemCase = workflowService.findOne(existing_menu_items.value)
+                    make item_divider, visible on trans when { true }
+                    change dashboard_item_taskRef value { [dashboardItemCase.tasks.find { it.transition == "configuration" }?.task] }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="button">
+        <id>add_new_item</id>
+        <title/>
+        <placeholder>Add new item</placeholder>
+        <event type="set">
+            <id>add_new_item_set</id>
+            <actions phase="post">
+                <action>
+                    dashboard_item_to_menu_item: f.dashboard_item_to_menu_item,
+                    items_order: f.items_order,
+                    dashboard_item_list: f.dashboard_item_list,
+                    existing_menu_items: f.existing_menu_items;
+
+                    if (existing_menu_items.value == null || existing_menu_items.value == "") {
+                        throw new IllegalArgumentException("No menu item was selected.")
+                    }
+                    def dashboardItemOptions = dashboard_item_list.options
+                    dashboardItemOptions.put(existing_menu_items.value, existing_menu_items.options.get(existing_menu_items.value))
+                    change dashboard_item_list options { dashboardItemOptions }
+                    change items_order value { String.join(",", dashboardItemOptions.keySet()) }
+
+                    def dashboardItemCase = workflowService.findOne(existing_menu_items.value)
+                    def menuItemOptions = dashboard_item_to_menu_item.options
+                    if (dashboardItemCase.dataSet["is_internal"].value) {
+                        menuItemOptions.put(existing_menu_items.value, dashboardItemCase.dataSet["menu_items_list"].value)
+                    } else {
+                        menuItemOptions.put(existing_menu_items.value, null)
+                    }
+                    change dashboard_item_to_menu_item options { menuItemOptions }
+
+                    def dashboardItemCases = findCasesElastic("processIdentifier:\"dashboard_item\" AND dataSet.is_active.booleanValue:true" as String)
+                            .collectEntries { [(it.stringId): it.dataSet["item_name"].value] }
+                    dashboardItemCases.keySet().removeAll(dashboard_item_list.options.keySet())
+                    change existing_menu_items options { dashboardItemCases }
+                    change existing_menu_items value { "" }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="button">
+        <id>remove_new_item</id>
+        <title/>
+        <placeholder>Remove item</placeholder>
+        <event type="set">
+            <id>remove_new_item_set</id>
+            <actions phase="post">
+                <action>
+                    dashboard_item_to_menu_item: f.dashboard_item_to_menu_item,
+                    dashboard_item_list: f.dashboard_item_list,
+                    items_order: f.items_order,
+                    existing_menu_items: f.existing_menu_items;
+
+                    if (dashboard_item_list.value == null || dashboard_item_list.value == "") {
+                        throw new IllegalArgumentException("No menu item was selected.")
+                    }
+                    def dashboardItemOptions = dashboard_item_list.options
+                    dashboardItemOptions.keySet().removeAll([dashboard_item_list.value])
+                    change dashboard_item_list options { dashboardItemOptions }
+                    change items_order value { String.join(",", dashboardItemOptions.keySet()) }
+
+                    def menuItemOptions = dashboard_item_to_menu_item.options
+                    menuItemOptions.keySet().removeAll([dashboard_item_list.value])
+                    change dashboard_item_to_menu_item options { menuItemOptions }
+
+                    def dashboardItemCases = findCasesElastic("processIdentifier:\"dashboard_item\" AND dataSet.is_active.booleanValue:true" as String)
+                            .collectEntries { [(it.stringId): it.dataSet["item_name"].value] }
+                    dashboardItemCases.keySet().removeAll(dashboard_item_list.options.keySet())
+                    change existing_menu_items options { dashboardItemCases }
+                    change existing_menu_items value { "" }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="taskRef">
+        <id>dashboard_item_taskRef</id>
+        <title/>
+    </data>
+    <data type="boolean">
+        <id>is_active</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>item_divider</id>
+        <title/>
+        <init dynamic="true">
+            new com.netgrif.application.engine.objects.petrinet.domain.I18nString("Dashboard item data", [sk: "Dáta položky panelu", de: "Daten zum Dashboard-Element"])
+        </init>
+        <component>
+            <name>divider</name>
+            <property key="fontSize">18</property>
+        </component>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>simple_dashboard_toolbar</id>
+        <title name="simple_dashboard_toolbar">Simple dashboard toolbar</title>
+        <placeholder name="simple_dashboard_toolbar_desc">Should dashboard toolbar contains menu with options</placeholder>
+        <init>true</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>profile_dashboard_toolbar</id>
+        <title name="profile_dashboard_toolbar">Profile in dashboard toolbar</title>
+        <placeholder name="profile_dashboard_toolbar_desc">Should dashboard toolbar contains profile button</placeholder>
+        <init>false</init>
+        <event type="set">
+            <id>profile_dashboard_toolbar_set</id>
+            <actions phase="post">
+                <action>
+                    profile_dashboard_toolbar: f.profile_dashboard_toolbar,
+                    profile_url: f.profile_url,
+                    trans: t.configuration;
+
+                    make profile_url, visible on trans when { !profile_dashboard_toolbar.value }
+                    make profile_url, editable on trans when { profile_dashboard_toolbar.value }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>language_dashboard_toolbar</id>
+        <title name="language_dashboard_toolbar">Language select in dashboard toolbar</title>
+        <placeholder name="language_dashboard_toolbar_desc">Should dashboard toolbar contains menu with language selection</placeholder>
+        <init>false</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>logout_dashboard_toolbar</id>
+        <title name="logout_dashboard_toolbar">Logout in dashboard toolbar</title>
+        <placeholder name="logout_dashboard_toolbar_desc">Should dashboard toolbar contains logout button</placeholder>
+        <init>false</init>
+        <event type="set">
+            <id>logout_dashboard_toolbar_set</id>
+            <actions phase="post">
+                <action>
+                    logout_dashboard_toolbar: f.logout_dashboard_toolbar,
+                    login_url: f.login_url,
+                    trans: t.configuration;
+
+                    make login_url, visible on trans when { !logout_dashboard_toolbar.value }
+                    make login_url, editable on trans when { logout_dashboard_toolbar.value }
+                </action>
+            </actions>
+        </event>
+    </data>
+    <data type="text" immediate="true">
+        <id>items_order</id>
+        <title/>
+    </data>
+    <data type="text" immediate="true">
+        <id>profile_url</id>
+        <title name="profile_url">Profile URL</title>
+        <placeholder name="profile_url_desc">URL address of profile page</placeholder>
+        <init>profile</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>login_url</id>
+        <title name="login_url">Login URL</title>
+        <placeholder name="login_url_desc">URL address of login page. Let empty to decide by application.</placeholder>
+    </data>
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="dashboard_id">ID panelu</i18nString>
+        <i18nString name="dashboard_id_desc">Unikátny identifikátor panelu</i18nString>
+        <i18nString name="dashboard_name">Názov panelu</i18nString>
+        <i18nString name="dashboard_name_desc">Názov panelu, ktorý bude zobrazený v panely aplikácie</i18nString>
+        <i18nString name="dashboard_logo">Logo panelu</i18nString>
+        <i18nString name="dashboard_logo_desc">Logo panelu, ktoré bude zobrazené v panely aplikácie</i18nString>
+        <i18nString name="dashboard_item_list">Položky panelu</i18nString>
+        <i18nString name="dashboard_item_list_desc">Zoznam položiek panalu, ktoré budú zobrazené v panely aplikácie</i18nString>
+        <i18nString name="existing_menu_items">Existujúce položky panelu</i18nString>
+        <i18nString name="existing_menu_items_desc">Zoznam všetkých existujúcich položiek panelu, ktoré budú zobrazené v panely aplikácie</i18nString>
+        <i18nString name="configuration_label">Konfigurácia panela</i18nString>
+
+        <i18nString name="simple_dashboard_toolbar">Jednoduchý panel nástrojov</i18nString>
+        <i18nString name="simple_dashboard_toolbar_desc">Panel nástrojov by mal obsahovať ponuku s možnosťami</i18nString>
+        <i18nString name="profile_dashboard_toolbar">Profil na paneli nástrojov</i18nString>
+        <i18nString name="profile_dashboard_toolbar_desc">Mal by panel nástrojov obsahovať tlačidlo profilu</i18nString>
+        <i18nString name="language_dashboard_toolbar">Výber jazyka na paneli nástrojov</i18nString>
+        <i18nString name="language_dashboard_toolbar_desc">Mal by panel nástrojov obsahovať menu s výberom jazyka</i18nString>
+        <i18nString name="logout_dashboard_toolbar">Odhlásenie na paneli nástrojov</i18nString>
+        <i18nString name="logout_dashboard_toolbar_desc">Mal by panel nástrojov obsahovať tlačidlo na odhlásenie</i18nString>
+
+        <i18nString name="profile_url">URL profilu</i18nString>
+        <i18nString name="profile_url_desc">URL adresa na stránku profilu</i18nString>
+        <i18nString name="login_url">URL prihlásenia</i18nString>
+        <i18nString name="login_url_desc">URL adresa na stránku prihlásenia. Nechajte prázdne pre rozhodnutie aplikáciou.</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="dashboard_id">Dashboard-ID</i18nString>
+        <i18nString name="dashboard_id_desc">Eindeutiger Bezeichner des Dashboards</i18nString>
+        <i18nString name="dashboard_name">Name des Dashboards</i18nString>
+        <i18nString name="dashboard_name_desc">Name des Dashboards, der im Dashboard der Anwendung angezeigt werden soll</i18nString>
+        <i18nString name="dashboard_logo">Logo für das Armaturenbrett</i18nString>
+        <i18nString name="dashboard_logo_desc">Dashboard-Logo, das im Dashboard der Anwendung angezeigt werden soll</i18nString>
+        <i18nString name="dashboard_item_list">Dashboard-Elemente</i18nString>
+        <i18nString name="dashboard_item_list_desc">Liste der Dashboard-Elemente, die im Dashboard der Anwendung angezeigt werden sollen</i18nString>
+        <i18nString name="existing_menu_items">Vorhandene Dashboard-Elemente</i18nString>
+        <i18nString name="existing_menu_items_desc">Liste aller vorhandenen Dashboard-Elemente, die dem Dashboard hinzugefügt werden können</i18nString>
+        <i18nString name="configuration_label">Konfiguration des Dashboards</i18nString>
+
+        <i18nString name="simple_dashboard_toolbar">Einfache Dashboard-Symbolleiste</i18nString>
+        <i18nString name="simple_dashboard_toolbar_desc">Die Symbolleiste des Dashboards sollte ein Menü mit Optionen enthalten</i18nString>
+        <i18nString name="profile_dashboard_toolbar">Profil in der Dashboard-Symbolleiste</i18nString>
+        <i18nString name="profile_dashboard_toolbar_desc">Die Symbolleiste des Dashboards sollte eine Profilschaltfläche enthalten</i18nString>
+        <i18nString name="language_dashboard_toolbar">Sprachauswahl in der Dashboard-Symbolleiste</i18nString>
+        <i18nString name="language_dashboard_toolbar_desc">Sollte die Symbolleiste des Dashboards ein Menü mit Sprachauswahl enthalten</i18nString>
+        <i18nString name="logout_dashboard_toolbar">Abmelden in der Dashboard-Symbolleiste</i18nString>
+        <i18nString name="logout_dashboard_toolbar_desc">Die Dashboard-Symbolleiste sollte eine Abmeldeschaltfläche enthalten</i18nString>
+
+        <i18nString name="profile_url">Profil-URL</i18nString>
+        <i18nString name="profile_url_desc">URL-Adresse der Profilseite</i18nString>
+        <i18nString name="login_url">Anmelde-URL</i18nString>
+        <i18nString name="login_url_desc">URL-Adresse der Anmeldeseite. Lassen Sie leer, um durch Anwendung zu entscheiden.</i18nString>
+    </i18n>
+
+    <!-- TRANSITIONS -->
+    <transition>
+        <id>configuration</id>
+        <x>400</x>
+        <y>112</y>
+        <label name="configuration_label">Dashboard configuration</label>
+        <icon>settings</icon>
+        <assignPolicy>auto</assignPolicy>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>configuration_d1</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>dashboard_id</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>dashboard_name</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>dashboard_logo</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>simple_dashboard_toolbar</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>profile_dashboard_toolbar</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>language_dashboard_toolbar</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>logout_dashboard_toolbar</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>profile_url</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>3</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>login_url</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>3</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>dashboard_item_list</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>4</y>
+                    <rows>2</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>order_up</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>4</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>order_down</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>5</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>remove_new_item</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>4</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>existing_menu_items</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>6</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>add_new_item</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>6</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>item_divider</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>7</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>dashboard_item_taskRef</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>8</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <event type="assign">
+            <id>configuration_assign</id>
+            <actions phase="post">
+                <action>
+                    is_active: f.is_active;
+
+                    change is_active value { false }
+                </action>
+            </actions>
+        </event>
+        <event type="finish">
+            <id>configuration_finish</id>
+            <actions phase="pre">
+                <action>
+                    dashboard_id: f.dashboard_id,
+                    dashboard_name: f.dashboard_name,
+                    is_active: f.is_active;
+
+                    if (dashboard_id.value == null || dashboard_id.value == "") {
+                        throw new IllegalArgumentException("Dashboard ID cannot be empty.")
+                    }
+                    def dashboardWithIdExists = findCaseElastic("processIdentifier:\"dashboard_management\" AND dataSet.dashboard_id.textValue.keyword:\"${dashboard_id.value}\" AND dataSet.is_active.booleanValue:true" as String)
+                    if (dashboardWithIdExists != null) {
+                        throw new IllegalArgumentException("Dashboard with given ID already exists.")
+                    }
+                    change is_active value { true }
+                </action>
+            </actions>
+        </event>
+    </transition>
+    <place>
+        <id>p1</id>
+        <x>208</x>
+        <y>112</y>
+        <label/>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>regular</type>
+        <sourceId>p1</sourceId>
+        <destinationId>configuration</destinationId>
+        <multiplicity>1</multiplicity>
+        <breakpoint>
+            <x>304</x>
+            <y>144</y>
+        </breakpoint>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>configuration</sourceId>
+        <destinationId>p1</destinationId>
+        <multiplicity>1</multiplicity>
+        <breakpoint>
+            <x>304</x>
+            <y>80</y>
+        </breakpoint>
+    </arc>
+</document>
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/menu/menu_item.xml b/application-engine/src/main/resources/petriNets/engine-processes/menu/menu_item.xml
new file mode 100644
index 00000000000..3df40f6a0a8
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/menu/menu_item.xml
@@ -0,0 +1,1507 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+	<id>menu_item</id>
+	<initials>MNI</initials>
+	<title>Menu Item</title>
+	<icon>check_box_outline_blank</icon>
+	<defaultRole>true</defaultRole>
+	<anonymousRole>false</anonymousRole>
+	<transitionRole>false</transitionRole>
+	<roleRef>
+		<id>system</id>
+		<caseLogic>
+			<create>true</create>
+			<delete>true</delete>
+			<view>true</view>
+		</caseLogic>
+	</roleRef>
+	<roleRef>
+		<id>admin</id>
+		<caseLogic>
+			<create>true</create>
+			<delete>true</delete>
+			<view>true</view>
+		</caseLogic>
+	</roleRef>
+	<roleRef>
+		<id>default</id>
+		<caseLogic>
+			<create>false</create>
+			<delete>false</delete>
+			<view>true</view>
+		</caseLogic>
+	</roleRef>
+	<caseEvents>
+		<event type="delete">
+			<id>menu_item_delete</id>
+			<actions phase="pre">
+				<action id="0">
+					removeRefFromDashboardItem()
+					removeItemChildCases()
+					removeViewCase()
+				</action>
+			</actions>
+		</event>
+	</caseEvents>
+	<role>
+		<id>system</id>
+		<title>System</title>
+	</role>
+	<role>
+		<id>admin</id>
+		<title>Admin</title>
+	</role>
+	<function scope="process" name="removeItemChildCases">
+		{ ->
+
+			def childCaseIds = useCase.dataSet['childItemIds'].value
+			if (childCaseIds == null || childCaseIds.isEmpty()) {
+				return
+			}
+
+			removeChildItemFromParent(useCase.dataSet['parentId'].value[0], useCase)
+
+			def childCases = workflowService.findAllById(childCaseIds)
+			async.run {
+				childCases.each {
+					workflowService.deleteCase(it)
+				}
+			}
+		}
+	</function>
+	<function scope="process" name="removeViewCase">
+		{ ->
+
+			def viewIdAsList = useCase.dataSet['view_configuration_id'].value
+			if (viewIdAsList == null || viewIdAsList.isEmpty()) {
+				return
+			}
+
+			async.run {
+				workflowService.deleteCase(viewIdAsList[0])
+			}
+		}
+	</function>
+	<function scope="process" name="removeRefFromDashboardItem">
+		{ ->
+			def cases = findCasesElastic("processIdentifier:\"dashboard_item\" AND dataSet.menu_items_list.keyValue:\"$useCase.stringId\"")
+			cases.each { refCase ->
+				def refTask = refCase.tasks.find { it.transition == "configuration" }.task
+				setData(refTask,[
+				        "menu_items_list": ["type": "enumeration_map", "value": ""],
+						"menu_item_taskRef": ["type": "taskRef", "value": []]
+				])
+			}
+
+		}
+	</function>
+	<function scope="process" name="manageBehaviorOfTabFields">
+		{ boolean useTabIcon, boolean useTabbedView, String transId = "item_settings" ->
+			def settingsTrans = useCase.petriNet.transitions[transId]
+
+			make [useCase.getField("use_tab_icon"), useCase.getField("tab_icon"), useCase.getField("tab_name")],
+				editable on settingsTrans when { useTabbedView &amp;&amp; useTabIcon }
+			make useCase.getField("tab_icon_preview"), visible on settingsTrans when { useTabbedView &amp;&amp; useTabIcon }
+
+			make useCase.getField("use_tab_icon"), editable on settingsTrans when { useTabbedView &amp;&amp; !useTabIcon }
+			make [useCase.getField("tab_icon_preview"), useCase.getField("tab_icon"), useCase.getField("tab_name")],
+				hidden on settingsTrans when { useTabbedView &amp;&amp; !useTabIcon }
+
+			make [useCase.getField("use_tab_icon"), useCase.getField("tab_icon_preview"), useCase.getField("tab_icon"),
+					useCase.getField("tab_name")], hidden on settingsTrans when { !useTabbedView }
+		}
+	</function>
+	<function scope="process" name="removeAnyAutoSelectFlagInFolder">
+		{ def parentId ->
+			String query = String.format("processIdentifier:menu_item AND dataSet.parentId.textValue:(%s) AND dataSet.is_auto_select.booleanValue:true AND NOT stringId:%s",
+					parentId, useCase.stringId)
+			def itemCase = findCaseElastic(query)
+			if (itemCase == null) {
+				return
+			}
+
+			setData("item_settings", itemCase, [
+				"is_auto_select": [
+					"value": false,
+					"type": "boolean"
+				]
+			])
+		}
+	</function>
+
+	<data type="caseRef">
+		<id>parentId</id>
+		<title/>
+		<allowedNets>
+			<allowedNet>menu_item</allowedNet>
+		</allowedNets>
+	</data>
+	<data type="text">
+		<id>move_previous_dest_uri</id>
+		<title/>
+	</data>
+	<data type="multichoice_map">
+		<id>move_dest_uri</id>
+		<title name="move_dest_uri">Destination URI</title>
+		<desc name="move_dest_uri_desc">List of nodes representing destination URI</desc>
+		<component>
+			<name>autocomplete</name>
+		</component>
+		<action trigger="get">
+			moveDestUri: f.move_dest_uri;
+<!--TODO  skontrolovat-->
+			String uriNodeId = elasticCaseService.findUriNodeId(useCase)
+			def node = uriService.findById(uriNodeId)
+			updateMultichoiceWithCurrentNode(moveDestUri, node)
+		</action>
+		<action trigger="set">
+			prevDestUri: f.move_previous_dest_uri,
+			moveDestUri: f.move_dest_uri;
+
+			String newUri = moveDestUri.value.join("/")
+			newUri = newUri.replace("//","/")
+
+			String corrected = getCorrectedUri(newUri)
+
+			if (corrected == newUri) {
+				change moveDestUri options { findOptionsBasedOnSelectedNode(newUri) }
+			} else {
+				change moveDestUri value { splitUriPath(corrected) }
+			}
+		</action>
+	</data>
+	<data type="text">
+		<id>move_dest_uri_new_node</id>
+		<title name="move_dest_uri_new_node">New node to be added</title>
+		<desc name="move_dest_uri_new_node_desc">Enter new node name</desc>
+	</data>
+	<data type="button">
+		<id>move_add_node</id>
+		<title/>
+		<placeholder name="move_add_node">Add</placeholder>
+		<component>
+			<name>raised</name>
+		</component>
+		<action trigger="set">
+			newNodeName: f.move_dest_uri_new_node,
+			selectedUri: f.move_dest_uri;
+
+			if (newNodeName.value == null || newNodeName.value == "") {
+				return
+			}
+
+			String prefixUri = selectedUri.value.join("/")
+			prefixUri = prefixUri.replace("//","/")
+
+			String newUri = prefixUri + "/" + newNodeName.value
+
+			change selectedUri value { splitUriPath(newUri) }
+
+			change newNodeName value { null }
+		</action>
+	</data>
+	<data type="i18n">
+		<id>duplicate_new_title</id>
+		<title name="duplicate_new_title">Title of duplicated view</title>
+	</data>
+	<data type="text">
+		<id>duplicate_view_identifier</id>
+		<title name="duplicate_view_identifier">View identifier</title>
+		<desc name="duplicate_view_identifier_desc">Must be unique</desc>
+	</data>
+	<data type="caseRef" immediate="true">
+		<id>childItemIds</id>
+		<title/>
+		<allowedNets>
+			<allowedNet>menu_item</allowedNet>
+		</allowedNets>
+	</data>
+	<data type="taskRef">
+		<id>childItemForms</id>
+		<title/>
+	</data>
+	<data type="boolean" immediate="true">
+		<id>hasChildren</id>
+		<title/>
+	</data>
+	<data type="button">
+		<id>duplicate_reset_childItemIds</id>
+		<title/>
+		<action trigger="set">
+			hasChildren: f.hasChildren,
+			childItemIds: f.childItemIds;
+
+			change childItemIds value { [] }
+			change hasChildren value { false }
+		</action>
+	</data>
+	<data type="text" immediate="true">
+		<id>menu_item_identifier</id>
+		<title name="menu_item_identifier">Menu item identifier</title>
+	</data>
+	<data type="text" immediate="true">
+		<id>nodePath</id>
+		<title name="nodePath">Item URI</title>
+		<event type="set">
+			<id>0</id>
+			<actions phase="post">
+				<action>
+					nodePath: f.nodePath,
+					menu_item_identifier: f.menu_item_identifier;
+
+					change menu_item_identifier value {
+						def idx = nodePath.value.lastIndexOf("/")
+						return nodePath.value.substring(idx + 1)
+					}
+				</action>
+			</actions>
+		</event>
+	</data>
+
+	<!-- GENERAL CONFIGURATION DATA -->
+	<data type="text" immediate="true">
+		<id>menu_icon</id>
+		<title name="icon_identifier">Menu icon identifier</title>
+		<desc name="icon_identifier_desc">Material icon identifier. List of icons with identifiers is available online.</desc>
+		<action trigger="set">
+			icon: f.this,
+			iconPreview: f.menu_icon_preview;
+
+			changeCaseProperty "icon" about { icon.value; }
+
+			if (icon.value == "") {
+				change iconPreview value {<![CDATA["""<span></span>"""]]>}
+				return;
+			}
+
+			change iconPreview value {
+				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + icon.value + <![CDATA["""</span>"""]]>
+			}
+		</action>
+	</data>
+	<data type="text">
+		<id>menu_icon_preview</id>
+		<title name="icon_preview">Menu icon preview</title>
+		<component>
+			<name>htmltextarea</name>
+		</component>
+	</data>
+	<data type="enumeration">
+		<id>menu_name_as_visible</id>
+		<title name="name">Name of the item</title>
+		<desc name="name_desc">Is shown in the menu</desc>
+		<component>
+			<name>autocomplete</name>
+		</component>
+	</data>
+	<data type="i18n" immediate="true">
+		<id>menu_name</id>
+		<title name="name">Name of the item</title>
+		<desc name="name_desc">Will be shown in the menu</desc>
+		<action trigger="set">
+			menu_name_as_visible: f.menu_name_as_visible,
+			name: f.menu_name;
+
+			changeCaseProperty "title" about { name.value }
+			change menu_name_as_visible choices { [name.value] }
+			change menu_name_as_visible value { name.value }
+		</action>
+	</data>
+	<data type="button">
+		<id>add_allowed_roles</id>
+		<title/>
+		<placeholder name="allow_roles">Allow view for roles</placeholder>
+		<action trigger="set">
+			allowedRoles: f.allowed_roles,
+			processesAvailable: f.processes_available,
+			rolesAvailable: f.roles_available;
+
+			change allowedRoles options {return configurableMenuService.addSelectedRoles(allowedRoles, processesAvailable, rolesAvailable)}
+
+			change rolesAvailable value {[]}
+			change rolesAvailable options {[:]}
+			change processesAvailable value {null}
+		</action>
+	</data>
+	<data type="button">
+		<id>remove_allowed_roles</id>
+		<title/>
+		<placeholder name="remove_from_allowed_roles">Remove from allowed roles</placeholder>
+		<action trigger="set">
+			allowedRoles: f.allowed_roles,
+			processesAvailable: f.processes_available,
+			rolesAvailable: f.roles_available;
+
+			change allowedRoles options {return configurableMenuService.removeSelectedRoles(allowedRoles)}
+
+			change allowedRoles value {[]}
+			change rolesAvailable value {[]}
+			change rolesAvailable options {[:]}
+			change processesAvailable value {null}
+		</action>
+	</data>
+	<data type="button">
+		<id>add_banned_roles</id>
+		<title/>
+		<placeholder name="ban_roles">Ban view for roles</placeholder>
+		<action trigger="set">
+			bannedRoles: f.banned_roles,
+			processesAvailable: f.processes_available,
+			rolesAvailable: f.roles_available;
+
+			change bannedRoles options {return configurableMenuService.addSelectedRoles(bannedRoles, processesAvailable, rolesAvailable)}
+
+			change rolesAvailable value {[]}
+			change rolesAvailable options {[:]}
+			change processesAvailable value {null}
+		</action>
+	</data>
+	<data type="button">
+		<id>remove_banned_roles</id>
+		<title/>
+		<placeholder name="remove_from_banned_roles">Remove from banned roles</placeholder>
+		<action trigger="set">
+			bannedRoles: f.banned_roles,
+			processesAvailable: f.processes_available,
+			rolesAvailable: f.roles_available;
+
+			change bannedRoles options { return configurableMenuService.removeSelectedRoles(bannedRoles) }
+
+			change bannedRoles value { [] }
+			change rolesAvailable value { [] }
+			change rolesAvailable options { [:] }
+			change processesAvailable value { null }
+		</action>
+	</data>
+	<data type="enumeration_map" immediate="true">
+		<id>processes_available</id>
+		<title name="available_processes">Your processes</title>
+		<desc name="available_processes_desc">Select a process containing roles you wish to add to allowed or banned roles lists.</desc>
+		<action trigger="get">
+			processes: f.this;
+
+			change processes options { return configurableMenuService.getNetsByAuthorAsMapOptions(loggedUser(), org.springframework.context.i18n.LocaleContextHolder.locale) }
+		</action>
+		<action trigger="set">
+			processes: f.this,
+			allowedRoles: f.allowed_roles,
+			bannedRoles: f.banned_roles,
+			rolesAvailable: f.roles_available;
+
+			if (processes.value != null) {
+				change rolesAvailable options { return configurableMenuService.getAvailableRolesFromNet(processes, allowedRoles, bannedRoles) }
+			} else {
+				change rolesAvailable options { [:] }
+			}
+			change rolesAvailable value { [] }
+		</action>
+	</data>
+	<data type="multichoice_map" immediate="true">
+		<id>roles_available</id>
+		<title name="available_roles">Available roles from selected process</title>
+	</data>
+	<data type="multichoice_map" immediate="true">
+		<id>allowed_roles</id>
+		<title name="roles_allowed">Allowed roles</title>
+		<desc name="roles_allowed_desc">List of roles allowed to view this menu entry.</desc>
+		<options>
+			<init dynamic="true">[:]</init>
+		</options>
+	</data>
+	<data type="multichoice_map" immediate="true">
+		<id>banned_roles</id>
+		<title name="roles_banned">Banned roles</title>
+		<desc name="roles_banned_desc">List of roles not allowed to view this menu entry.</desc>
+		<options>
+			<init dynamic="true">[:]</init>
+		</options>
+	</data>
+	<data type="boolean" immediate="true">
+		<id>use_custom_view</id>
+		<title name="use_custom_view">Use custom view?</title>
+		<init>false</init>
+	</data>
+	<data type="text" immediate="true">
+		<id>custom_view_selector</id>
+		<title name="custom_view_selector">Custom view configuration selector</title>
+		<desc name="custom_view_selector_desc">Example: "demo-tabbed-views"</desc>
+	</data>
+	<data type="boolean" immediate="true">
+		<id>is_auto_select</id>
+		<title name="is_auto_select">View auto selection</title>
+		<desc name="is_auto_select_desc">If selected, the view will be automatically opened</desc>
+		<init>false</init>
+		<action trigger="set">
+			is_auto_select: f.is_auto_select,
+			parentId: f.parentId;
+
+			if (!is_auto_select.value || parentId.value == null || parentId.value.isEmpty())
+				return
+
+			removeAnyAutoSelectFlagInFolder(parentId.value[0])
+		</action>
+	</data>
+	<data type="boolean" immediate="true">
+		<id>use_tabbed_view</id>
+		<title name="use_tabbed_view">Do you want to use view with tabs?</title>
+	</data>
+
+	<!-- TABBED configuration data -->
+	<data type="text" immediate="true">
+		<id>tab_icon</id>
+		<title name="tab_icon">Tab icon identifier</title>
+		<desc name="tab_icon_identifier_desc">Material icon identifier. List of icons with identifiers is available online.</desc>
+		<action trigger="set">
+			icon: f.this,
+			iconPreview: f.tab_icon_preview;
+
+			if (icon.value == "") {
+				change iconPreview value {<![CDATA["""<span></span>"""]]>}
+				return;
+			}
+
+			change iconPreview value {
+				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + icon.value + <![CDATA["""</span>"""]]>
+			}
+		</action>
+	</data>
+	<data type="text">
+		<id>tab_icon_preview</id>
+		<title>Tab icon preview</title>
+		<component>
+			<name>htmltextarea</name>
+		</component>
+	</data>
+	<data type="boolean" immediate="true">
+		<id>use_tab_icon</id>
+		<title name="display_tab_icon">Display tab icon?</title>
+		<init>true</init>
+	</data>
+	<data type="i18n" immediate="true">
+		<id>tab_name</id>
+		<title name="tab_name">Name of the item</title>
+		<desc name="tab_name_desc">Will be shown in tab</desc>
+	</data>
+	<data type="enumeration_map" immediate="true">
+		<id>view_configuration_type</id>
+		<title name="view_configuration_type">Pick view type</title>
+		<options>
+			<init dynamic="true">menuItemService.getAvailableViewsAsOptions(false, true)</init>
+		</options>
+		<action trigger="set">
+			use_tabbed_view: f.use_tabbed_view,
+			view_configuration_type: f.view_configuration_type;
+
+			if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) {
+				change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(use_tabbed_view.value, true) }
+			}
+		</action>
+	</data>
+	<data type="caseRef">
+		<id>view_configuration_id</id>
+		<title/>
+		<allowedNets>
+			<allowedNet>tabbed_case_view_configuration</allowedNet>
+			<allowedNet>tabbed_task_view_configuration</allowedNet>
+			<allowedNet>tabbed_ticket_view_configuration</allowedNet>
+			<allowedNet>tabbed_single_task_view_configuration</allowedNet>
+		</allowedNets>
+	</data>
+	<data type="taskRef">
+		<id>view_configuration_form</id>
+		<title/>
+	</data>
+	<data type="button">
+		<id>order_down</id>
+		<title/>
+		<placeholder>south</placeholder>
+		<component>
+			<name>icon</name>
+			<property key="stretch">true</property>
+		</component>
+		<action trigger="set">
+			parentId: f.parentId;
+
+			def parentCase = workflowService.findOne(parentId.value[0])
+			def taskId = useCase.tasks.find { it.transition == "row_for_ordering" }.task
+			def taskRefValue = parentCase.dataSet['childItemForms'].value
+			int taskRefValueSize = taskRefValue.size()
+			def caseRefValue = parentCase.dataSet['childItemIds'].value
+			int caseRefValueSize = caseRefValue.size()
+
+			int idxInTaskRef = taskRefValue.indexOf(taskId)
+			if (idxInTaskRef &lt; taskRefValueSize - 1) {
+				Collections.swap(taskRefValue, idxInTaskRef, idxInTaskRef + 1)
+			}
+
+			int idxInCaseRef = caseRefValue.indexOf(useCase.stringId)
+			if (idxInCaseRef &lt; caseRefValueSize - 1) {
+				Collections.swap(caseRefValue, idxInCaseRef, idxInCaseRef + 1)
+			}
+
+			setData("children_order", parentCase, [
+					"childItemForms" : [
+							"value" : taskRefValue,
+							"type" : "taskRef"
+					],
+					"childItemIds" : [
+							"value" : caseRefValue,
+							"type" : "caseRef"
+					]
+			])
+		</action>
+	</data>
+	<data type="button">
+		<id>order_up</id>
+		<title/>
+		<placeholder>north</placeholder>
+		<component>
+			<name>icon</name>
+			<property key="stretch">true</property>
+		</component>
+		<action trigger="set">
+			parentId: f.parentId;
+
+			def parentCase = workflowService.findOne(parentId.value[0])
+			def taskId = useCase.tasks.find { it.transition == "row_for_ordering" }.task
+			def taskRefValue = parentCase.dataSet['childItemForms'].value
+			def caseRefValue = parentCase.dataSet['childItemIds'].value
+
+			int idxInTaskRef = taskRefValue.indexOf(taskId)
+			if (idxInTaskRef > 0) {
+				Collections.swap(taskRefValue, idxInTaskRef - 1, idxInTaskRef)
+			} else {
+				return
+			}
+
+			int idxInCaseRef = caseRefValue.indexOf(useCase.stringId)
+			if (idxInCaseRef > 0) {
+				Collections.swap(caseRefValue, idxInCaseRef - 1, idxInCaseRef)
+			} else {
+				return
+			}
+
+			setData("children_order", parentCase, [
+					"childItemForms" : [
+							"value" : taskRefValue,
+							"type" : "taskRef"
+					],
+					"childItemIds" : [
+							"value" : caseRefValue,
+							"type" : "caseRef"
+					]
+			])
+		</action>
+	</data>
+
+	<!-- I18NS -->
+	<i18n locale="sk">
+		<i18nString name="icon_preview">Náhľad ikony</i18nString>
+		<i18nString name="icon_identifier">Identifikátor ikony</i18nString>
+		<i18nString name="icon_identifier_desc">Identifikátor Material ikony. Zoznam ikon s identifikátormi je dostupný online.</i18nString>
+		<i18nString name="allow_roles">Pridaj k povoleným roliam</i18nString>
+		<i18nString name="remove_from_allowed_roles">Odstráň z povolených rolí</i18nString>
+		<i18nString name="ban_roles">Pridaj k zakázaným roliam</i18nString>
+		<i18nString name="remove_from_banned_roles">Odstráň zo zakázaných rolí</i18nString>
+		<i18nString name="available_processes">Vaše procesy</i18nString>
+		<i18nString name="available_processes_desc">Vyberte proces obsahujúci roly ktoré chcete pridať do zoznamu povolených alebo zakázaných rolí.</i18nString>
+		<i18nString name="available_roles">Dostupné roly</i18nString>
+		<i18nString name="move_dest_uri">Cieľové URI</i18nString>
+		<i18nString name="duplicate_new_title">Názov duplikovanej položky</i18nString>
+		<i18nString name="duplicate_view_identifier">Identifikátor duplikovanej položky</i18nString>
+		<i18nString name="duplicate_view_identifier_desc">Musí byť jedinečný</i18nString>
+		<i18nString name="name">Názov položky</i18nString>
+		<i18nString name="name_desc">Bude zobrazený v menu</i18nString>
+		<i18nString name="tab_icon">Identifikátor ikony v karte</i18nString>
+		<i18nString name="tab_icon_identifier_desc">Identifikátor Material ikony. Zoznam ikon s identifikátormi je dostupný online.</i18nString>
+		<i18nString name="display_tab_icon">Zobraziť ikonu v karte?</i18nString>
+		<i18nString name="tab_name">Názov položky</i18nString>
+		<i18nString name="tab_name_desc">Bude zobrazený v karte</i18nString>
+		<i18nString name="use_custom_view">Použiť vlastné zobrazenie?</i18nString>
+		<i18nString name="custom_view_selector">Konfiguračný identifikátor vlastného zobrazenia</i18nString>
+		<i18nString name="custom_view_selector_desc">Napríklad: "demo-tabbed-views"</i18nString>
+		<i18nString name="item_settings">Nastavenie položky</i18nString>
+		<i18nString name="roles_management_title">Roly</i18nString>
+		<i18nString name="move_item">Presunúť položku</i18nString>
+		<i18nString name="move_item_finish">Presunúť</i18nString>
+		<i18nString name="duplicate_item">Duplikovať položku</i18nString>
+		<i18nString name="duplicate_item_finish">Duplikovať</i18nString>
+		<i18nString name="roles_allowed">Povolené roly</i18nString>
+		<i18nString name="roles_allowed_desc">Zoznam povolených rolí, ktoré môžu zobraziť túto položku</i18nString>
+		<i18nString name="roles_banned">Zakázané roly</i18nString>
+		<i18nString name="roles_banned_desc">Zoznam zakázaných rolí, ktoré nemôžu zobraziť túto položku</i18nString>
+		<i18nString name="item_settings_general">Všeobecné</i18nString>
+		<i18nString name="menu_item_identifier">Identifikátor položky</i18nString>
+		<i18nString name="nodePath">URI položky</i18nString>
+		<i18nString name="move_dest_uri_new_node">Nový uzol</i18nString>
+		<i18nString name="move_dest_uri_new_node_desc">Uveďte názov uzlu, ktorý chcete pridať</i18nString>
+		<i18nString name="move_dest_uri_desc">Zoznam uzlov reprezentujúce cieľovú URI</i18nString>
+		<i18nString name="move_add_node">Pridať</i18nString>
+		<i18nString name="is_auto_select">Automatické zvolenie zobrazenia</i18nString>
+		<i18nString name="is_auto_select_desc">Po automatickom zvolení sa dané zobrazenie používateľovi otvorí</i18nString>
+		<i18nString name="use_tabbed_view">Použiť zobrazenie v taboch?</i18nString>
+		<i18nString name="view_configuration_type">Vybrať zobrazenie</i18nString>
+		<i18nString name="configuration_view">Nastavenie zobrazenia</i18nString>
+	</i18n>
+	<i18n locale="de">
+		<i18nString name="icon_preview">Ikonevorschau</i18nString>
+		<i18nString name="icon_identifier">Ikone ID</i18nString>
+		<i18nString name="icon_identifier_desc">Material Ikone ID. Liste den Ikonen mit IDs ist online verfügbar.</i18nString>
+		<i18nString name="allow_roles">Zu zulässigen Rollen hinzufügen</i18nString>
+		<i18nString name="remove_from_allowed_roles">Aus zulässigen Rollen entfernen</i18nString>
+		<i18nString name="ban_roles">Zu verbotenen Rollen hinzufügen</i18nString>
+		<i18nString name="remove_from_banned_roles">Aus verbotenen Rollen entfernen</i18nString>
+		<i18nString name="available_processes">Ihre Prozesse</i18nString>
+		<i18nString name="available_processes_desc">Wählen Sie einen Prozess mit Rollen aus, die Sie zu Listen mit zulässigen oder verbotenen Rollen hinzufügen möchten.</i18nString>
+		<i18nString name="available_roles">Verfügbare Rollen</i18nString>
+		<i18nString name="tab_icon_identifier_desc">Material Ikone ID. Liste den Ikonen mit IDs ist online verfügbar.</i18nString>
+		<i18nString name="custom_view_selector_desc">Beispiel: "demo-tabbed-views"</i18nString>
+		<i18nString name="roles_management_title">Rollen</i18nString>
+		<i18nString name="roles_allowed">Zulässige Rollen</i18nString>
+		<i18nString name="item_settings_general">Allgemein</i18nString>
+		<i18nString name="menu_item_identifier">Identifikationsnummer des Menüeintrages</i18nString>
+		<i18nString name="nodePath">Menüeintrag-URI</i18nString>
+		<i18nString name="move_dest_uri_new_node">Neuer Knoten</i18nString>
+		<i18nString name="move_add_node">Hinzufügen</i18nString>
+		<i18nString name="move_dest_uri">Ziel URI</i18nString>
+		<i18nString name="duplicate_new_title">Titel der kopierten Ansicht</i18nString>
+		<i18nString name="duplicate_view_identifier">Identifikator der kopierten Ansicht</i18nString>
+		<i18nString name="duplicate_view_identifier_desc">Muss einzigartig sein</i18nString>
+		<i18nString name="name">Titel des Eintrages</i18nString>
+		<i18nString name="name_desc">Wird im Menü angezeigt</i18nString>
+		<i18nString name="tab_icon">Ikonen Identifikator der Registerkarte</i18nString>
+		<i18nString name="display_tab_icon">Zeige die Registerkarte Ikone an?</i18nString>
+		<i18nString name="tab_name">Titel der Registerkarte</i18nString>
+		<i18nString name="tab_name_desc">Wird in der Registerkarte angezeigt</i18nString>
+		<i18nString name="use_custom_view">Eigener Ansicht anwenden?</i18nString>
+		<i18nString name="custom_view_selector">Konfigurationsidentifikator der eigenen Ansicht</i18nString>
+		<i18nString name="item_settings">Menüeintrageinstellungen</i18nString>
+		<i18nString name="move_item">Menüeintrag verschieben</i18nString>
+		<i18nString name="move_item_finish">verschieben</i18nString>
+		<i18nString name="duplicate_item">Menüeintrag duplizieren</i18nString>
+		<i18nString name="duplicate_item_finish">duplizieren</i18nString>
+		<i18nString name="roles_allowed_desc">Rollen mit Zugriff auf diesen Menüeintrag</i18nString>
+		<i18nString name="roles_banned">Verbotene Rollen</i18nString>
+		<i18nString name="roles_banned_desc">Rollen, für die wird den Menüeintrag ausgeblendet</i18nString>
+		<i18nString name="move_dest_uri_new_node_desc">Nächste URI-Teil angeben</i18nString>
+		<i18nString name="move_dest_uri_desc">Teile der Ziel URI</i18nString>
+		<i18nString name="is_auto_select">Automatische Anzeigeauswahl</i18nString>
+		<i18nString name="is_auto_select_desc">Wenn ausgewählt, wird die Ansicht automatisch geöffnet</i18nString>
+		<i18nString name="use_tabbed_view">Möchten Sie die Ansicht mit Registerkarten verwenden?</i18nString>
+		<i18nString name="view_configuration_type">Wählen Sie einen Ansichtstyp</i18nString>
+		<i18nString name="configuration_view">Die Ansichtskonfiguration</i18nString>
+	</i18n>
+
+	<!-- TRANSITIONS -->
+	<transition>
+		<id>initialize</id>
+		<x>340</x>
+		<y>220</y>
+		<label>initialize [await sync]</label>
+		<icon>hourglass_empty</icon>
+		<roleRef>
+			<id>admin</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+	</transition>
+	<transition>
+		<id>data_sync</id>
+		<x>340</x>
+		<y>340</y>
+		<label>Data sync</label>
+		<roleRef>
+			<id>system</id>
+			<logic>
+				<perform>true</perform>
+			</logic>
+		</roleRef>
+	</transition>
+
+	<transition>
+		<id>item_settings</id>
+		<x>460</x>
+		<y>100</y>
+		<label name="item_settings">Item settings</label>
+		<icon>settings</icon>
+		<assignPolicy>auto</assignPolicy>
+		<roleRef>
+			<id>admin</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+		<dataGroup>
+			<id>general_0</id>
+			<cols>4</cols>
+			<layout>grid</layout>
+			<title name="item_settings_general">General</title>
+			<dataRef>
+				<id>menu_item_identifier</id>
+				<logic>
+					<behavior>visible</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>nodePath</id>
+				<logic>
+					<behavior>visible</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>menu_name</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>menu_icon</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>menu_icon_preview</id>
+				<logic>
+					<behavior>visible</behavior>
+				</logic>
+				<layout>
+					<x>3</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>standard</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>is_auto_select</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>1</x>
+					<y>2</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>standard</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+		<dataGroup>
+			<id>roles_management</id>
+			<cols>5</cols>
+			<layout>grid</layout>
+			<title name="roles_management_title">Roles</title>
+			<dataRef>
+				<id>processes_available</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>2</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>roles_available</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>1</x>
+					<y>0</y>
+					<rows>2</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>add_allowed_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>allowed_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>3</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>remove_allowed_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>4</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>add_banned_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>banned_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>3</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>remove_banned_roles</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>4</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+				</layout>
+			</dataRef>
+		</dataGroup>
+		<dataGroup>
+			<id>configuration_view</id>
+			<cols>4</cols>
+			<layout>grid</layout>
+			<title name="configuration_view">View configuration</title>
+			<dataRef>
+				<id>use_custom_view</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+				<event type="set">
+					<id>0</id>
+					<actions phase="post">
+						<action>
+							trans: t.this,
+							useTabIcon: f.use_tab_icon,
+							use_tabbed_view: f.use_tabbed_view,
+							view_configuration_form: f.view_configuration_form,
+							view_configuration_type: f.view_configuration_type,
+							tabIconPreview: f.tab_icon_preview,
+							tabName: f.tab_name,
+							tabIcon: f.tab_icon,
+							use: f.use_custom_view,
+							selector: f.custom_view_selector;
+
+							if (use.value) {
+								make selector, editable on trans when { true }
+								make [useTabIcon, tabIconPreview, tabName, tabIcon, use_tabbed_view, view_configuration_form,
+										view_configuration_type], hidden on trans when { true }
+								// todo remove configuration or keep it?
+							} else {
+								manageBehaviorOfTabFields(useTabIcon.value, use_tabbed_view.value)
+								make [use_tabbed_view, view_configuration_form, view_configuration_type], editable on trans when { true }
+								make selector, hidden on trans when { true }
+							}
+						</action>
+					</actions>
+				</event>
+			</dataRef>
+			<dataRef>
+				<id>custom_view_selector</id>
+				<logic>
+					<behavior>hidden</behavior>
+				</logic>
+				<layout>
+					<x>1</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>3</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>use_tabbed_view</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>1</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>standard</appearance>
+				</layout>
+				<event type="set">
+					<id>0</id>
+					<actions phase="post">
+						<action>
+							use_tabbed_view: f.use_tabbed_view,
+							use_tab_icon: f.use_tab_icon,
+							view_configuration_type: f.view_configuration_type;
+
+							manageBehaviorOfTabFields(use_tab_icon.value, use_tabbed_view.value)
+
+							change view_configuration_type value { null }
+							change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(use_tabbed_view.value, true) }
+						</action>
+					</actions>
+				</event>
+			</dataRef>
+			<dataRef>
+				<id>tab_name</id>
+				<logic>
+					<behavior>hidden</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>use_tab_icon</id>
+				<logic>
+					<behavior>hidden</behavior>
+				</logic>
+				<layout>
+					<x>3</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>0</offset>
+					<template>material</template>
+				</layout>
+				<event type="set">
+					<id>0</id>
+					<actions phase="post">
+						<action>
+							use_tabbed_view: f.use_tabbed_view,
+							useIcon: f.use_tab_icon;
+
+							manageBehaviorOfTabFields(useIcon.value, use_tabbed_view.value)
+						</action>
+					</actions>
+				</event>
+			</dataRef>
+			<dataRef>
+				<id>tab_icon</id>
+				<logic>
+					<behavior>hidden</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>tab_icon_preview</id>
+				<logic>
+					<behavior>hidden</behavior>
+				</logic>
+				<layout>
+					<x>1</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>standard</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>view_configuration_type</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>2</y>
+					<rows>1</rows>
+					<cols>4</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+				<event type="set">
+					<id>0</id>
+					<actions phase="post">
+						<action>
+							view_configuration_type: f.view_configuration_type,
+							view_configuration_form: f.view_configuration_form,
+							view_configuration_id: f.view_configuration_id;
+
+							if (view_configuration_id.value != null &amp;&amp; !view_configuration_id.value.isEmpty()) {
+								workflowService.deleteCase(view_configuration_id.value[0])
+							}
+
+							if (view_configuration_type.value == null || view_configuration_type.value == "") {
+								change view_configuration_id value { [] }
+								change view_configuration_form value { [] }
+								return
+							}
+
+							def configurationCase = createCase(view_configuration_type.value + "_configuration")
+							def initTask = assignTask("initialize", configurationCase)
+							finishTask(initTask)
+							configurationCase = workflowService.findOne(configurationCase.stringId)
+							change view_configuration_id value { [configurationCase.stringId] }
+							change view_configuration_form value { [configurationCase.tasks.find { it.transition == "settings" }.task] }
+						</action>
+					</actions>
+				</event>
+			</dataRef>
+			<dataRef>
+				<id>view_configuration_form</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>3</y>
+					<rows>1</rows>
+					<cols>4</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+	</transition>
+
+	<transition>
+		<id>move_item</id>
+		<x>580</x>
+		<y>100</y>
+		<label name="move_item">Move item</label>
+		<icon>move_down</icon>
+		<assignPolicy>auto</assignPolicy>
+		<roleRef>
+			<id>admin</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+		<dataGroup>
+			<id>move</id>
+			<cols>4</cols>
+			<layout>grid</layout>
+			<dataRef>
+				<id>move_dest_uri</id>
+				<logic>
+					<behavior>editable</behavior>
+					<behavior>required</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>move_dest_uri_new_node</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>move_add_node</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>3</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+		<event type="finish">
+			<id>finish</id>
+			<actions phase="pre">
+				<action>
+					dest: f.move_dest_uri;
+
+					if (dest.value == null || dest.value == []) {
+						throw new IllegalArgumentException("URI must not be empty!")
+					}
+
+					String newUri = dest.value.join("/")
+					newUri = newUri.replace("//","/")
+
+					changeMenuItem useCase uri { newUri }
+				</action>
+			</actions>
+			<title name="move_item_finish">Move</title>
+		</event>
+	</transition>
+
+	<transition>
+		<id>duplicate_item</id>
+		<x>580</x>
+		<y>340</y>
+		<label name="duplicate_item">Duplicate item</label>
+		<icon>content_copy</icon>
+		<assignPolicy>auto</assignPolicy>
+		<roleRef>
+			<id>admin</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+		<dataGroup>
+			<id>duplicate</id>
+			<cols>4</cols>
+			<layout>grid</layout>
+			<dataRef>
+				<id>duplicate_new_title</id>
+				<logic>
+					<behavior>editable</behavior>
+					<behavior>required</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>4</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>duplicate_view_identifier</id>
+				<logic>
+					<behavior>editable</behavior>
+					<behavior>required</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>1</y>
+					<rows>1</rows>
+					<cols>4</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+		<event type="finish">
+			<id>finish</id>
+			<actions phase="pre">
+				<action>
+					identifier: f.duplicate_view_identifier,
+					title: f.duplicate_new_title;
+
+					duplicateMenuItem(useCase, title.value, identifier.value)
+				</action>
+			</actions>
+			<title name="duplicate_item_finish">Duplicate</title>
+		</event>
+	</transition>
+
+	<transition>
+		<id>children_order</id>
+		<x>580</x>
+		<y>220</y>
+		<label>Manage item order</label>
+		<icon>low_priority</icon>
+		<assignPolicy>auto</assignPolicy>
+		<roleRef>
+			<id>admin</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+		<dataGroup>
+			<id>children_order_0</id>
+			<cols>4</cols>
+			<layout>grid</layout>
+			<dataRef>
+				<id>childItemForms</id>
+				<logic>
+					<behavior>editable</behavior>
+					<action trigger="get">
+						forms: f.childItemForms,
+						ids: f.childItemIds;
+
+						def orderedTaskIds = ids.value?.collect { id -> workflowService.findOne(id).tasks.find { it.transition == "row_for_ordering" }.task }
+						change forms value { orderedTaskIds }
+					</action>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>4</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+	</transition>
+	<transition>
+		<id>row_for_ordering</id>
+		<x>741</x>
+		<y>219</y>
+		<label>Row for ordering [referenced]</label>
+		<roleRef>
+			<id>system</id>
+			<logic>
+				<perform>true</perform>
+				<view>true</view>
+				<cancel>true</cancel>
+				<assign>true</assign>
+			</logic>
+		</roleRef>
+		<dataGroup>
+			<id>row_for_ordering_0</id>
+			<cols>6</cols>
+			<layout>grid</layout>
+			<dataRef>
+				<id>menu_item_identifier</id>
+				<logic>
+					<behavior>visible</behavior>
+				</logic>
+				<layout>
+					<x>0</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>menu_name_as_visible</id>
+				<logic>
+					<behavior>visible</behavior>
+				</logic>
+				<layout>
+					<x>2</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>2</cols>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>order_down</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>4</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>1</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+			<dataRef>
+				<id>order_up</id>
+				<logic>
+					<behavior>editable</behavior>
+				</logic>
+				<layout>
+					<x>5</x>
+					<y>0</y>
+					<rows>1</rows>
+					<cols>1</cols>
+					<offset>1</offset>
+					<template>material</template>
+					<appearance>outline</appearance>
+				</layout>
+			</dataRef>
+		</dataGroup>
+		<event type="finish">
+			<id>finish</id>
+			<title></title>
+		</event>
+		<event type="delegate">
+			<id>delegate</id>
+			<title></title>
+		</event>
+	</transition>
+
+	<!-- PLACES-->
+	<place>
+		<id>uninitialized</id>
+		<x>220</x>
+		<y>220</y>
+		<label>uninitialized</label>
+		<tokens>1</tokens>
+		<static>false</static>
+	</place>
+	<place>
+		<id>initialized</id>
+		<x>460</x>
+		<y>220</y>
+		<label>initialized</label>
+		<tokens>0</tokens>
+		<static>false</static>
+	</place>
+
+	<!-- ARCS-->
+	<arc>
+		<id>a1</id>
+		<type>regular</type>
+		<sourceId>uninitialized</sourceId>
+		<destinationId>initialize</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+	<arc>
+		<id>a7</id>
+		<type>read</type>
+		<sourceId>initialized</sourceId>
+		<destinationId>item_settings</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+	<arc>
+		<id>a8</id>
+		<type>regular</type>
+		<sourceId>initialize</sourceId>
+		<destinationId>initialized</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+	<arc>
+		<id>a9</id>
+		<type>read</type>
+		<sourceId>initialized</sourceId>
+		<destinationId>move_item</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+	<arc>
+		<id>a10</id>
+		<type>read</type>
+		<sourceId>initialized</sourceId>
+		<destinationId>duplicate_item</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+	<arc>
+		<id>a13</id>
+		<type>read</type>
+		<sourceId>initialized</sourceId>
+		<destinationId>children_order</destinationId>
+		<multiplicity>1</multiplicity>
+	</arc>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_case_view_configuration.xml b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_case_view_configuration.xml
new file mode 100644
index 00000000000..ebd706b0f57
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_case_view_configuration.xml
@@ -0,0 +1,970 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>tabbed_case_view_configuration</id>
+    <initials>TCV</initials>
+    <title>Tabbed case view configuration</title>
+    <icon>check_box_outline_blank</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>default</id>
+        <caseLogic>
+            <create>false</create>
+            <delete>false</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <caseEvents>
+        <event type="delete">
+            <id>view_delete</id>
+            <actions phase="pre">
+                <action id="0">
+                    removeViewCase()
+                </action>
+            </actions>
+        </event>
+    </caseEvents>
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <function scope="process" name="updateFilterAutocompleteOptions">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField filterAutocomplete,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField previewTaskRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField selectedFilterRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.ButtonField updateBtn,
+            com.netgrif.application.engine.objects.petrinet.domain.Transition trans
+                ->
+                if (filterAutocomplete.getOptions().containsKey(filterAutocomplete.value)) {
+                    change previewTaskRef value {
+                        return [findTask({it.caseId.eq(filterAutocomplete.value).and(it.transitionId.eq("view_filter"))}).stringId]
+                    }
+                    make updateBtn,editable on trans when { true }
+                } else {
+                    change filterAutocomplete options {
+                        def findAllPredicate = { filterCase -> !selectedFilterRef.value.contains(filterCase.stringId)
+                                &amp;&amp; filterCase.dataSet["filter_type"].value == "Case" }
+                        return findFilters(filterAutocomplete.value != null ? filterAutocomplete.value : "")
+                                .findAll(findAllPredicate)
+                                .collectEntries({filterCase -&gt; [filterCase.stringId, filterCase.title]})
+                    }
+                    change previewTaskRef value { [] }
+                    make updateBtn,visible on trans when { true }
+                }
+        }
+    </function>
+    <function scope="process" name="removeViewCase">
+        { ->
+
+            def viewIdAsList = useCase.dataSet['view_configuration_id'].value
+            if (viewIdAsList == null || viewIdAsList.isEmpty()) {
+                return
+            }
+
+            async.run {
+                workflowService.deleteCase(viewIdAsList[0])
+            }
+        }
+    </function>
+    <function scope="process" name="updateOptionsBasedOnValue">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField toBeUpdated,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.MultichoiceMapField valueSelector,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField optionsHolder
+                ->
+                def existingOptions = optionsHolder.options
+                def selectedValues = valueSelector.value
+                def newOptions = [:]
+
+                if (selectedValues != null) {
+                    existingOptions.each { key, value ->
+                        if (selectedValues.contains(key)) {
+                            newOptions.put(key, value)
+                        }
+                    }
+                }
+
+                if (!newOptions.containsKey(toBeUpdated.value)) {
+                    change toBeUpdated value { null }
+                }
+
+                change toBeUpdated options { newOptions }
+        }
+    </function>
+
+    <!-- FILTER configuration data -->
+    <data type="taskRef">
+        <id>selected_filter_preview</id>
+        <title/>
+    </data>
+    <data type="taskRef">
+        <id>current_filter_preview</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>filter_header</id>
+        <title/>
+        <init name="filter_header">Current filter</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="text">
+        <id>new_filter_id</id>
+        <title/>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>contains_filter</id>
+        <title/>
+        <init>false</init>
+    </data>
+    <data type="enumeration_map">
+        <id>filter_autocomplete_selection</id>
+        <title name="filter_autocomplete_selection">Select new filter</title>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+        <action trigger="get">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+    </data>
+    <data type="button">
+        <id>update_filter</id>
+        <title/>
+        <placeholder name="update_filter">Update view with selected filter</placeholder>
+        <component>
+            <name>raised</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            update_filter: f.update_filter,
+            contains_filter: f.contains_filter,
+            filter_case: f.filter_case,
+            filterAutocomplete: f.filter_autocomplete_selection;
+
+            boolean containsFilter = filterAutocomplete.value != null &amp;&amp; filterAutocomplete.value != ""
+            if (containsFilter) {
+                def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterAutocomplete.value))})
+                if (filterCase.dataSet["filter_type"].value != "Case") {
+                    throw new IllegalArgumentException("Filter is of wrong type. Only filter of Case type allowed.")
+                }
+            }
+
+            change contains_filter value { containsFilter }
+            change filter_case value { [filterAutocomplete.value] }
+            change filterAutocomplete value { "" }
+            make update_filter,visible on trans when { true }
+        </action>
+    </data>
+    <data type="caseRef">
+        <id>filter_case</id>
+        <title/>
+        <action trigger="set">
+            filterTaskRef: f.current_filter_preview,
+            contains_filter: f.contains_filter,
+            filterCaseRef: f.filter_case;
+
+            if (filterCaseRef.value == null || filterCaseRef.value == []) {
+                change filterTaskRef value { [] }
+                change contains_filter value { false }
+                return
+            }
+
+            def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
+            change filterTaskRef value {
+                return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]
+            }
+            change contains_filter value { true }
+        </action>
+        <allowedNets>
+            <allowedNet>filter</allowedNet>
+        </allowedNets>
+    </data>
+
+    <!-- VIEW CONFIGURATION DATA -->
+    <data type="enumeration_map" immediate="true">
+        <id>view_search_type</id>
+        <title name="view_search_type">Search type for case view</title>
+        <options>
+            <option key="hidden" name="hidden">Hidden</option>
+            <option key="fulltext" name="fulltext">Fulltext</option>
+            <option key="fulltext_advanced" name="fulltext_advanced">Fulltext and advanced</option>
+        </options>
+        <init>fulltext_advanced</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>create_case_button_title</id>
+        <title name="create_case_button_title">"New case" button title</title>
+    </data>
+    <data type="text">
+        <id>create_case_button_icon_preview</id>
+        <title name="create_case_button_icon_preview">Icon preview</title>
+        <init><![CDATA[<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">add</span>]]></init>
+        <component>
+            <name>htmltextarea</name>
+        </component>
+    </data>
+    <data type="text" immediate="true">
+        <id>create_case_button_icon</id>
+        <title name="create_case_button_icon">"New case" button icon identifier</title>
+        <init>add</init>
+        <action trigger="set">
+            create_case_button_icon_preview: f.create_case_button_icon_preview,
+            create_case_button_icon: f.create_case_button_icon;
+
+
+            if (create_case_button_icon.value == "") {
+                change create_case_button_icon_preview value {<![CDATA["""<span></span>"""]]>}
+                return;
+            }
+
+            change create_case_button_icon_preview value {
+				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + create_case_button_icon.value + <![CDATA["""</span>"""]]>
+            }
+        </action>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>show_create_case_button</id>
+        <title name="show_create_case_button">Show create case button?</title>
+        <init>true</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>require_title_in_creation</id>
+        <title name="require_title_in_creation">Require title input in case creation?</title>
+        <init>true</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>banned_nets_in_creation</id>
+        <title name="banned_nets_in_creation">Banned processes for creation</title>
+        <desc name="banned_nets_in_creation_desc">Write down process identifiers separated by comma. Example: mynet1,mynet2</desc>
+        <action trigger="set">
+            bannedNets: f.this;
+
+            String trimmed = bannedNets.value?.replaceAll("\\s","")
+            if (bannedNets.value != trimmed) {
+                change bannedNets value { trimmed }
+            }
+        </action>
+    </data>
+    <data type="i18n">
+        <id>view_header</id>
+        <title/>
+        <init name="view_header">Case view</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>show_more_menu</id>
+        <title name="show_more_menu">Show more menu for case item?</title>
+        <init>false</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>allow_header_table_mode</id>
+        <title name="allow_header_table_mode">Allow table mode for headers?</title>
+        <init>true</init>
+    </data>
+    <data type="multichoice_map" immediate="true">
+        <id>headers_mode</id>
+        <title name="headers_mode">Header mode</title>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="search" name="search">Search</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+        <init>sort,edit,search</init>
+        <action trigger="set">
+            headersMode: f.headers_mode,
+            defaultMode: f.headers_default_mode,
+            holder: f.headers_options_holder;
+
+            updateOptionsBasedOnValue(defaultMode, headersMode, holder)
+        </action>
+        <action trigger="get">
+            headersMode: f.headers_mode,
+            defaultMode: f.headers_default_mode,
+            holder: f.headers_options_holder;
+
+            updateOptionsBasedOnValue(defaultMode, headersMode, holder)
+        </action>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>headers_default_mode</id>
+        <title name="headers_default_mode">Default header mode</title>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="search" name="search">Search</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+        <init>sort</init>
+    </data>
+    <data type="enumeration_map">
+        <id>headers_options_holder</id>
+        <title/>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="search" name="search">Search</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>is_header_mode_changeable</id>
+        <title name="is_header_mode_changeable">Can header mode be changed?</title>
+        <init>true</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>use_case_default_headers</id>
+        <title name="use_case_default_headers">Use custom default headers?</title>
+        <init>true</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>default_headers</id>
+        <title name="default_headers">Set default headers</title>
+        <desc name="default_headers_desc">Example: "meta-title,meta-visualId"</desc>
+        <action trigger="set">
+            defaultHeaders: f.this;
+
+            String trimmed = defaultHeaders.value?.replaceAll("\\s","")
+            if (defaultHeaders.value != trimmed) {
+                change defaultHeaders value { trimmed }
+            }
+        </action>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>view_configuration_type</id>
+        <title name="view_configuration_type">Pick view type</title>
+        <options>
+            <init dynamic="true">menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier)</init>
+        </options>
+        <action trigger="set">
+            view_configuration_type: f.view_configuration_type;
+
+            if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) {
+                change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) }
+            }
+        </action>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>chained_view_configuration_type</id>
+        <title name="view_configuration_type">Chained view type</title>
+        <options>
+            <init dynamic="true">menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier)</init>
+        </options>
+    </data>
+    <data type="caseRef">
+        <id>view_configuration_id</id>
+        <title/>
+        <action trigger="set">
+            chained_view_configuration_type: f.chained_view_configuration_type,
+            view_configuration_id: f.view_configuration_id;
+
+            if (view_configuration_id.value.isEmpty()) {
+                return
+            }
+
+            def chainedView = workflowService.findOne(view_configuration_id.value[0])
+            change chained_view_configuration_type value { chainedView.processIdentifier }
+        </action>
+        <allowedNets>
+            <allowedNet>tabbed_task_view_configuration</allowedNet>
+            <allowedNet>tabbed_single_task_view_configuration</allowedNet>
+        </allowedNets>
+    </data>
+    <data type="taskRef">
+        <id>view_configuration_form</id>
+        <title/>
+    </data>
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="create_case_button_title">Názov tlačidla "Nová inštancia"</i18nString>
+        <i18nString name="create_case_button_icon">Identifikátor ikony tlačidla "Nová inštancia"</i18nString>
+        <i18nString name="create_case_button_icon_preview">Náhľad ikony</i18nString>
+        <i18nString name="default_headers">Predvolené hlavičky</i18nString>
+        <i18nString name="default_headers_desc">Napríklad: "meta-title,meta-visualId"</i18nString>
+        <i18nString name="filter_autocomplete_selection">Zvoľte nový filter</i18nString>
+        <i18nString name="update_filter">Aktualizovať zobrazenie s vybraným filtrom</i18nString>
+        <i18nString name="view_search_type">Typ vyhľadávania prípadov</i18nString>
+        <i18nString name="hidden">Skryté</i18nString>
+        <i18nString name="fulltext">Fulltext</i18nString>
+        <i18nString name="fulltext_advanced">Fulltext a rozšírené</i18nString>
+        <i18nString name="require_title_in_creation">Vyžadovať názov inštancii pri vytváraní?</i18nString>
+        <i18nString name="banned_nets_in_creation">Zakázané siete pri vytváraní</i18nString>
+        <i18nString name="banned_nets_in_creation_desc">Uveďte identifikátory procesov oddelené čiarkou. Napríklad: mynet1,mynet2</i18nString>
+        <i18nString name="show_create_case_button">Zobraziť tlačidlo na vytvorenie prípadu?</i18nString>
+        <i18nString name="show_more_menu">Zobrazovať menu pre prípadovú položku?</i18nString>
+        <i18nString name="sort">Zoraďovanie</i18nString>
+        <i18nString name="search">Vyhľadávanie</i18nString>
+        <i18nString name="edit">Upravovanie</i18nString>
+        <i18nString name="headers_mode">Mód hlavičiek</i18nString>
+        <i18nString name="headers_default_mode">Predvolený mód hlavičiek</i18nString>
+        <i18nString name="is_header_mode_changeable">Môže byť mód hlavičiek zmenený?</i18nString>
+        <i18nString name="allow_header_table_mode">Povoliť tabuľkový mód pre hlavičky?</i18nString>
+        <i18nString name="use_default_headers">Použiť vlastné predvolené hlavičky?</i18nString>
+        <i18nString name="item_settings">Nastavenie položky</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Súčasný filter</i18nString>
+        <i18nString name="view_header">Zobrazenie prípadov</i18nString>
+        <i18nString name="item_settings_general">Všeobecné</i18nString>
+        <i18nString name="use_case_default_headers">Použiť predvolené hlavičky</i18nString>
+        <i18nString name="view_configuration_type">Vybrať zobrazenie</i18nString>
+        <i18nString name="settings">Nastavenie</i18nString>
+        <i18nString name="associated_view">Asociované zobrazenie</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="create_case_button_title">Schaltflächentitel "Neuer Fall"</i18nString>
+        <i18nString name="create_case_button_icon">Ikone ID</i18nString>
+        <i18nString name="create_case_button_icon_preview">Ikonevorschau</i18nString>
+        <i18nString name="default_headers">Anzuzeigende Attributmenge auswählen</i18nString>
+        <i18nString name="filter_autocomplete_selection">Neue Filter auswählen</i18nString>
+        <i18nString name="default_headers_desc">Beispiel: "meta-title,meta-visualId"</i18nString>
+        <i18nString name="hidden">Versteckt</i18nString>
+        <i18nString name="fulltext">Einfacher Suchmodus</i18nString>
+        <i18nString name="sort">Sortieren</i18nString>
+        <i18nString name="search">Suchen</i18nString>
+        <i18nString name="edit">Bearbeiten</i18nString>
+        <i18nString name="headers_mode">Kopfzeilenmodus</i18nString>
+        <i18nString name="headers_default_mode">Standardkopfzeilenmodus</i18nString>
+        <i18nString name="is_header_mode_changeable">Erlaube Änderung des Kopfzeilenmodus?</i18nString>
+        <i18nString name="allow_header_table_mode">Erlaube Tabellenmodus?</i18nString>
+        <i18nString name="use_default_headers">Eigene Kopfzeilen verwenden?</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Aktueller Filter</i18nString>
+        <i18nString name="item_settings_general">Allgemein</i18nString>
+        <i18nString name="update_filter">Aktualisiere die Ansicht mit dem ausgewählten Filter</i18nString>
+        <i18nString name="view_search_type">Suchmodus im Fallansicht</i18nString>
+        <i18nString name="fulltext_advanced">Einfacher und erweiterter Suchmodus</i18nString>
+        <i18nString name="require_title_in_creation">Erforde den Titel beim erzeugen von Fällen?</i18nString>
+        <i18nString name="banned_nets_in_creation">Ausgeschlossene Prozesse</i18nString>
+        <i18nString name="banned_nets_in_creation_desc">Trenne die Prozessidentifikatoren mit einer Komma. z.B.: netz1,netz2</i18nString>
+        <i18nString name="show_create_case_button">Schaltfläche „Fall erstellen“ anzeigen?</i18nString>
+        <i18nString name="show_more_menu">"Erweiterte Optionen" Taste bei einzelnen Fällen anzeigen</i18nString>
+        <i18nString name="item_settings">Menüeintrageinstellungen</i18nString>
+        <i18nString name="view_header">Fallansicht</i18nString>
+        <i18nString name="use_case_default_headers">Benutzerdefinierte Standardheader verwenden?</i18nString>
+        <i18nString name="view_configuration_type">Wählen Sie einen Ansichtstyp</i18nString>
+        <i18nString name="settings">Einstellungen</i18nString>
+        <i18nString name="associated_view">zugehörige Ansicht</i18nString>
+    </i18n>
+
+    <transition>
+        <id>initialize</id>
+        <x>368</x>
+        <y>208</y>
+        <label>initialize [await sync]</label>
+        <icon>hourglass_empty</icon>
+    </transition>
+    <transition>
+        <id>data_sync</id>
+        <x>368</x>
+        <y>328</y>
+        <label>Data sync</label>
+    </transition>
+    <transition>
+        <id>settings</id>
+        <x>496</x>
+        <y>112</y>
+        <label name="settings">Settings</label>
+        <icon>settings</icon>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>form_title</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>filter_update</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <title name="filter_update_title">Filter</title>
+            <dataRef>
+                <id>filter_autocomplete_selection</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>3</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>update_filter</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>selected_filter_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>filter_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>current_filter_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>3</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>view_dataGroup</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_search_type</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>show_create_case_button</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>show_more_menu</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>create_case_button_title</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>create_case_button_icon</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>create_case_button_icon_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>require_title_in_creation</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>banned_nets_in_creation</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>view_headers</id>
+            <cols>5</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>is_header_mode_changeable</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                    <action trigger="set">
+                        trans: t.this,
+                        isChangeable: f.is_header_mode_changeable,
+                        mode: f.headers_mode,
+                        defaultMode: f.headers_default_mode;
+
+                        make [mode, defaultMode], editable on trans when { isChangeable.value }
+                        make [mode, defaultMode], required on trans when { isChangeable.value }
+
+                        make [mode, defaultMode], hidden on trans when { !isChangeable.value }
+                        make [mode, defaultMode], optional on trans when { !isChangeable.value }
+                    </action>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>allow_header_table_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>headers_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>headers_default_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>4</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>use_case_default_headers</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <action trigger="set">
+                        trans: t.this,
+                        use: f.use_case_default_headers,
+                        headers: f.default_headers;
+
+                        make headers,editable on trans when { use.value }
+                        make headers,visible on trans when { !use.value }
+                    </action>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>default_headers</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>associated_view</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <title name="associated_view">Associated view</title>
+            <dataRef>
+                <id>view_configuration_type</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+                <event type="set">
+                    <id>0</id>
+                    <actions phase="post">
+                        <action>
+                            view_configuration_type: f.view_configuration_type,
+                            view_configuration_form: f.view_configuration_form,
+                            view_configuration_id: f.view_configuration_id;
+
+                            if (view_configuration_id.value != null &amp;&amp; !view_configuration_id.value.isEmpty()) {
+                                workflowService.deleteCase(view_configuration_id.value[0])
+                            }
+
+                            if (view_configuration_type.value == null || view_configuration_type.value == "") {
+                                change view_configuration_id value { [] }
+                                change view_configuration_form value { [] }
+                                return
+                            }
+
+                            def configurationCase = createCase(view_configuration_type.value + "_configuration")
+                            def initTask = assignTask("initialize", configurationCase)
+                            finishTask(initTask)
+                            configurationCase = workflowService.findOne(configurationCase.stringId)
+                            change view_configuration_id value { [configurationCase.stringId] }
+                            change view_configuration_form value { [configurationCase.tasks.find { it.transition == "settings" }.task] }
+                        </action>
+                    </actions>
+                </event>
+            </dataRef>
+            <dataRef>
+                <id>view_configuration_form</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>chained_view_configuration_type</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+    </transition>
+    <place>
+        <id>initialized</id>
+        <x>496</x>
+        <y>208</y>
+        <label>initialized</label>
+        <tokens>0</tokens>
+        <static>false</static>
+    </place>
+    <place>
+        <id>uninitialized</id>
+        <x>240</x>
+        <y>208</y>
+        <label>uninitialized</label>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>read</type>
+        <sourceId>initialized</sourceId>
+        <destinationId>settings</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>uninitialized</sourceId>
+        <destinationId>initialize</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a3</id>
+        <type>regular</type>
+        <sourceId>initialize</sourceId>
+        <destinationId>initialized</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_single_task_view_configuration.xml b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_single_task_view_configuration.xml
new file mode 100644
index 00000000000..3ff216a2e1f
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_single_task_view_configuration.xml
@@ -0,0 +1,316 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>tabbed_single_task_view_configuration</id>
+    <initials>TST</initials>
+    <title>Tabbed single task view configuration</title>
+    <icon>check_box_outline_blank</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>default</id>
+        <caseLogic>
+            <create>false</create>
+            <delete>false</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <function scope="process" name="updateFilterAutocompleteOptions">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField filterAutocomplete,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField previewTaskRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField selectedFilterRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.ButtonField updateBtn,
+            com.netgrif.application.engine.objects.petrinet.domain.Transition trans
+                ->
+                if (filterAutocomplete.getOptions().containsKey(filterAutocomplete.value)) {
+                    change previewTaskRef value {
+                        return [findTask({it.caseId.eq(filterAutocomplete.value).and(it.transitionId.eq("view_filter"))}).stringId]
+                    }
+                    make updateBtn,editable on trans when { true }
+                } else {
+                    change filterAutocomplete options {
+                        def findAllPredicate = { filterCase -> !selectedFilterRef.value.contains(filterCase.stringId)
+                                &amp;&amp; filterCase.dataSet["filter_type"].value == "Case" }
+                        return findFilters(filterAutocomplete.value != null ? filterAutocomplete.value : "")
+                                .findAll(findAllPredicate)
+                                .collectEntries({filterCase -&gt; [filterCase.stringId, filterCase.title]})
+                    }
+                    change previewTaskRef value { [] }
+                    make updateBtn,visible on trans when { true }
+                }
+        }
+    </function>
+
+    <!-- FILTER configuration data -->
+    <data type="taskRef">
+        <id>selected_filter_preview</id>
+        <title/>
+    </data>
+    <data type="taskRef">
+        <id>current_filter_preview</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>filter_header</id>
+        <title/>
+        <init name="filter_header">Current filter</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="text">
+        <id>new_filter_id</id>
+        <title/>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>contains_filter</id>
+        <title/>
+        <init>false</init>
+    </data>
+    <data type="enumeration_map">
+        <id>filter_autocomplete_selection</id>
+        <title name="filter_autocomplete_selection">Select new filter</title>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+        <action trigger="get">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+    </data>
+    <data type="button">
+        <id>update_filter</id>
+        <title/>
+        <placeholder name="update_filter">Update view with selected filter</placeholder>
+        <component>
+            <name>raised</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            update_filter: f.update_filter,
+            contains_filter: f.contains_filter,
+            filter_case: f.filter_case,
+            filterAutocomplete: f.filter_autocomplete_selection;
+
+            boolean containsFilter = filterAutocomplete.value != null &amp;&amp; filterAutocomplete.value != ""
+            if (containsFilter) {
+                def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterAutocomplete.value))})
+                if (filterCase.dataSet["filter_type"].value != "Task") {
+                    throw new IllegalArgumentException("Filter is of wrong type. Only filter of Task type allowed.")
+                }
+            }
+
+            change contains_filter value { containsFilter }
+            change filter_case value { [filterAutocomplete.value] }
+            change filterAutocomplete value { "" }
+            make update_filter,visible on trans when { true }
+        </action>
+    </data>
+    <data type="caseRef">
+        <id>filter_case</id>
+        <title/>
+        <action trigger="set">
+            filterTaskRef: f.current_filter_preview,
+            contains_filter: f.contains_filter,
+            filterCaseRef: f.filter_case;
+
+            if (filterCaseRef.value == null || filterCaseRef.value == []) {
+                change filterTaskRef value { [] }
+                change contains_filter value { false }
+                return
+            }
+
+            def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
+            change filterTaskRef value {
+                return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]
+            }
+            change contains_filter value { true }
+        </action>
+        <allowedNets>
+            <allowedNet>filter</allowedNet>
+        </allowedNets>
+    </data>
+
+    <!-- VIEW CONFIGURATION DATA -->
+    <data type="i18n">
+        <id>view_header</id>
+        <title/>
+        <init name="view_header">Single task view</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="text">
+        <id>transition_id</id>
+        <title name="transition_id">Transition id</title>
+    </data>
+    <!-- END OF VIEW CONFIGURATION DATA -->
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="filter_autocomplete_selection">Zvoľte nový filter</i18nString>
+        <i18nString name="update_filter">Aktualizovať zobrazenie s vybraným filtrom</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Súčasný filter</i18nString>
+        <i18nString name="view_configuration_type">Vybrať zobrazenie</i18nString>
+        <i18nString name="settings">Nastavenie</i18nString>
+        <i18nString name="associated_view">Asociované zobrazenie</i18nString>
+        <i18nString name="view_header">Zobrazenie jednej úlohy</i18nString>
+        <i18nString name="transition_id">ID prechodu</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="filter_autocomplete_selection">Neue Filter auswählen</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Aktueller Filter</i18nString>
+        <i18nString name="update_filter">Aktualisiere die Ansicht mit dem ausgewählten Filter</i18nString>
+        <i18nString name="view_configuration_type">Wählen Sie einen Ansichtstyp</i18nString>
+        <i18nString name="settings">Einstellungen</i18nString>
+        <i18nString name="associated_view">zugehörige Ansicht</i18nString>
+        <i18nString name="view_header">Einzelaufgabenansicht</i18nString>
+        <i18nString name="transition_id">Übergangs-ID</i18nString>
+    </i18n>
+
+    <transition>
+        <id>initialize</id>
+        <x>368</x>
+        <y>208</y>
+        <label>initialize [await sync]</label>
+        <icon>hourglass_empty</icon>
+    </transition>
+    <transition>
+        <id>data_sync</id>
+        <x>368</x>
+        <y>328</y>
+        <label>Data sync</label>
+    </transition>
+    <transition>
+        <id>settings</id>
+        <x>496</x>
+        <y>112</y>
+        <label name="settings">Settings</label>
+        <icon>settings</icon>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>form_title</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>view_dataGroup</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>transition_id</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+    </transition>
+    <place>
+        <id>initialized</id>
+        <x>496</x>
+        <y>208</y>
+        <label>initialized</label>
+        <tokens>0</tokens>
+        <static>false</static>
+    </place>
+    <place>
+        <id>uninitialized</id>
+        <x>240</x>
+        <y>208</y>
+        <label>uninitialized</label>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>read</type>
+        <sourceId>initialized</sourceId>
+        <destinationId>settings</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>uninitialized</sourceId>
+        <destinationId>initialize</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a3</id>
+        <type>regular</type>
+        <sourceId>initialize</sourceId>
+        <destinationId>initialized</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_task_view_configuration.xml b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_task_view_configuration.xml
new file mode 100644
index 00000000000..b630ba1824d
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_task_view_configuration.xml
@@ -0,0 +1,718 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>tabbed_task_view_configuration</id>
+    <initials>TTV</initials>
+    <title>Tabbed task view configuration</title>
+    <icon>check_box_outline_blank</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>default</id>
+        <caseLogic>
+            <create>false</create>
+            <delete>false</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <function scope="process" name="updateFilterAutocompleteOptions">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField filterAutocomplete,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField previewTaskRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField selectedFilterRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.ButtonField updateBtn,
+            com.netgrif.application.engine.objects.petrinet.domain.Transition trans
+                ->
+                if (filterAutocomplete.getOptions().containsKey(filterAutocomplete.value)) {
+                    change previewTaskRef value {
+                        return [findTask({it.caseId.eq(filterAutocomplete.value).and(it.transitionId.eq("view_filter"))}).stringId]
+                    }
+                    make updateBtn,editable on trans when { true }
+                } else {
+                    change filterAutocomplete options {
+                        def findAllPredicate = { filterCase -> !selectedFilterRef.value.contains(filterCase.stringId)
+                                &amp;&amp; filterCase.dataSet["filter_type"].value == "Task" }
+                        def options = findFilters(filterAutocomplete.value != null ? filterAutocomplete.value : "")
+                                .findAll(findAllPredicate)
+                                .collectEntries({filterCase -&gt; [filterCase.stringId, filterCase.title]})
+                        return options
+                    }
+                    change previewTaskRef value { [] }
+                    make updateBtn,visible on trans when { true }
+                }
+        }
+    </function>
+    <function scope="process" name="updateOptionsBasedOnValue">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField toBeUpdated,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.MultichoiceMapField valueSelector,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField optionsHolder
+                ->
+                def existingOptions = optionsHolder.options
+                def selectedValues = valueSelector.value
+                def newOptions = [:]
+
+                if (selectedValues != null) {
+                    existingOptions.each { key, value ->
+                        if (selectedValues.contains(key)) {
+                            newOptions.put(key, value)
+                        }
+                    }
+                }
+
+                if (!newOptions.containsKey(toBeUpdated.value)) {
+                    change toBeUpdated value { null }
+                }
+
+                change toBeUpdated options { newOptions }
+        }
+    </function>
+
+    <!-- FILTER configuration data -->
+    <data type="taskRef">
+        <id>selected_filter_preview</id>
+        <title/>
+    </data>
+    <data type="taskRef">
+        <id>current_filter_preview</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>filter_header</id>
+        <title/>
+        <init name="filter_header">Current filter</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="text">
+        <id>new_filter_id</id>
+        <title/>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>contains_filter</id>
+        <title/>
+        <init>false</init>
+    </data>
+    <data type="enumeration_map">
+        <id>filter_autocomplete_selection</id>
+        <title name="filter_autocomplete_selection">Select new filter</title>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+        <action trigger="get">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+    </data>
+    <data type="button">
+        <id>update_filter</id>
+        <title/>
+        <placeholder name="update_filter">Update view with selected filter</placeholder>
+        <component>
+            <name>raised</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            update_filter: f.update_filter,
+            contains_filter: f.contains_filter,
+            filter_case: f.filter_case,
+            filterAutocomplete: f.filter_autocomplete_selection;
+
+            boolean containsFilter = filterAutocomplete.value != null &amp;&amp; filterAutocomplete.value != ""
+            if (containsFilter) {
+                def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterAutocomplete.value))})
+                if (filterCase.dataSet["filter_type"].value != "Task") {
+                    throw new IllegalArgumentException("Filter is of wrong type. Only filter of Task type allowed.")
+                }
+            }
+
+            change contains_filter value { containsFilter }
+            change filter_case value { [filterAutocomplete.value] }
+            change filterAutocomplete value { "" }
+            make update_filter,visible on trans when { true }
+        </action>
+    </data>
+    <data type="caseRef">
+        <id>filter_case</id>
+        <title/>
+        <action trigger="set">
+            trans: t.settings,
+            filterHeader: f.filter_header,
+            removeButton: f.remove_filter,
+            contains_filter: f.contains_filter,
+            mergeFilters: f.merge_filters,
+            filterTaskRef: f.current_filter_preview,
+            filterCaseRef: f.filter_case;
+
+            if (filterCaseRef.value == null || filterCaseRef.value == []) {
+                make [mergeFilters, removeButton], hidden on trans when { true }
+                make filterHeader, hidden on trans when { true }
+                change filterTaskRef value { [] }
+                change contains_filter value { false }
+                return
+            }
+
+            def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
+            change filterTaskRef value {
+                return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]
+            }
+
+            make [mergeFilters, removeButton], editable on trans when { true }
+            make filterHeader,visible on trans when { true }
+            change contains_filter value { true }
+        </action>
+        <allowedNets>
+            <allowedNet>filter</allowedNet>
+        </allowedNets>
+    </data>
+    <data type="button">
+        <id>remove_filter</id>
+        <title/>
+        <placeholder name="remove_filter">Remove filter</placeholder>
+        <component>
+            <name>raised</name>
+        </component>
+        <action trigger="set">
+            filterCase: f.filter_case;
+
+            change filterCase value { [] }
+        </action>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>merge_filters</id>
+        <title name="merge_filters">Merge with base filter?</title>
+        <init>true</init>
+    </data>
+
+    <!-- TASK VIEW CONFIGURATION DATA -->
+    <data type="i18n">
+        <id>view_header</id>
+        <title/>
+        <init name="view_header">Task view</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>view_search_type</id>
+        <title name="view_search_type">Search type for task view</title>
+        <options>
+            <option key="hidden" name="hidden">Hidden</option>
+            <option key="fulltext" name="fulltext">Fulltext</option>
+            <option key="fulltext_advanced" name="fulltext_advanced">Fulltext and advanced</option>
+        </options>
+        <init>fulltext_advanced</init>
+    </data>
+    <data type="multichoice_map" immediate="true">
+        <id>headers_mode</id>
+        <title name="headers_mode">Header mode</title>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+        <init>sort,edit</init>
+        <action trigger="set">
+            headersMode: f.headers_mode,
+            defaultMode: f.headers_default_mode,
+            holder: f.headers_options_holder;
+
+            updateOptionsBasedOnValue(defaultMode, headersMode, holder)
+        </action>
+        <action trigger="get">
+            headersMode: f.headers_mode,
+            defaultMode: f.headers_default_mode,
+            holder: f.headers_options_holder;
+
+            updateOptionsBasedOnValue(defaultMode, headersMode, holder)
+        </action>
+    </data>
+    <data type="enumeration_map" immediate="true">
+        <id>headers_default_mode</id>
+        <title name="headers_default_mode">Default header mode</title>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+        <init>sort</init>
+    </data>
+    <data type="enumeration_map">
+        <id>headers_options_holder</id>
+        <title/>
+        <options>
+            <option key="sort" name="sort">Sort</option>
+            <option key="edit" name="edit">Edit</option>
+        </options>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>is_header_mode_changeable</id>
+        <title name="is_header_mode_changeable">Can header mode be changed?</title>
+        <init>true</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>allow_header_table_mode</id>
+        <title name="allow_header_table_mode">Allow table mode for headers?</title>
+        <init>true</init>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>use_default_headers</id>
+        <title name="use_default_headers">Use custom default headers?</title>
+        <init>true</init>
+    </data>
+    <data type="text" immediate="true">
+        <id>default_headers</id>
+        <title name="default_headers">Set default headers</title>
+        <desc name="default_headers_desc">Example: "meta-title,meta-user"</desc>
+        <action trigger="set">
+            defaultHeaders: f.this;
+
+            String trimmed = defaultHeaders.value?.replaceAll("\\s","")
+            if (defaultHeaders.value != trimmed) {
+                change defaultHeaders value { trimmed }
+            }
+        </action>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>show_more_menu</id>
+        <title name="show_more_menu">Show more menu for task item?</title>
+        <init>true</init>
+    </data>
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="filter_autocomplete_selection">Zvoľte nový filter</i18nString>
+        <i18nString name="update_filter">Aktualizovať zobrazenie s vybraným filtrom</i18nString>
+        <i18nString name="hidden">Skryté</i18nString>
+        <i18nString name="fulltext">Fulltext</i18nString>
+        <i18nString name="fulltext_advanced">Fulltext a rozšírené</i18nString>
+        <i18nString name="sort">Zoraďovanie</i18nString>
+        <i18nString name="search">Vyhľadávanie</i18nString>
+        <i18nString name="edit">Upravovanie</i18nString>
+        <i18nString name="merge_filters">Zjednotiť filter so základným filtrom?</i18nString>
+        <i18nString name="view_search_type">Typ vyhľadávania úloh</i18nString>
+        <i18nString name="headers_mode">Mód hlavičiek</i18nString>
+        <i18nString name="headers_default_mode">Predvolený mód hlavičiek</i18nString>
+        <i18nString name="is_header_mode_changeable">Môže byť mód hlavičiek zmenený?</i18nString>
+        <i18nString name="allow_header_table_mode">Povoliť tabuľkový mód pre hlavičky?</i18nString>
+        <i18nString name="use_default_headers">Použiť vlastné predvolené hlavičky?</i18nString>
+        <i18nString name="default_headers">Predvolené hlavičky</i18nString>
+        <i18nString name="default_headers_desc">Napríklad: "meta-title,meta-user"</i18nString>
+        <i18nString name="show_more_menu">Zobrazovať menu pre úlohovú položku?</i18nString>
+        <i18nString name="item_settings">Nastavenie položky</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Súčasný filter</i18nString>
+        <i18nString name="view_header">Zobrazenie úloh</i18nString>
+        <i18nString name="item_settings_general">Všeobecné</i18nString>
+        <i18nString name="remove_filter">Vymazať filter</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="filter_autocomplete_selection">Neue Filter auswählen</i18nString>
+        <i18nString name="hidden">Versteckt</i18nString>
+        <i18nString name="fulltext">Einfacher Suchmodus</i18nString>
+        <i18nString name="sort">Sortieren</i18nString>
+        <i18nString name="search">Suchen</i18nString>
+        <i18nString name="edit">Bearbeiten</i18nString>
+        <i18nString name="headers_mode">Kopfzeilenmodus</i18nString>
+        <i18nString name="headers_default_mode">Standardkopfzeilenmodus</i18nString>
+        <i18nString name="is_header_mode_changeable">Erlaube Änderung des Kopfzeilenmodus?</i18nString>
+        <i18nString name="allow_header_table_mode">Erlaube Tabellenmodus?</i18nString>
+        <i18nString name="use_default_headers">Eigene Kopfzeilen verwenden?</i18nString>
+        <i18nString name="default_headers">Anzuzeigende Attributmenge auswählen</i18nString>
+        <i18nString name="default_headers_desc">Beispiel: "meta-title,meta-user"</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Aktueller Filter</i18nString>
+        <i18nString name="item_settings_general">Allgemein</i18nString>
+        <i18nString name="update_filter">Aktualisiere die Ansicht mit dem ausgewählten Filter</i18nString>
+        <i18nString name="fulltext_advanced">Einfacher und erweiterter Suchmodus</i18nString>
+        <i18nString name="merge_filters">Mit dem Basisfilter kombinieren?</i18nString>
+        <i18nString name="view_search_type">Suchmodus im Aufgabenansicht</i18nString>
+        <i18nString name="show_more_menu">"Erweiterte Optionen" Taste bei einzelnen Aufgaben anzeigen</i18nString>
+        <i18nString name="item_settings">Menüeintrageinstellungen</i18nString>
+        <i18nString name="view_header">Aufgabenansicht</i18nString>
+        <i18nString name="remove_filter">Filter entfernen</i18nString>
+    </i18n>
+
+    <transition>
+        <id>initialize</id>
+        <x>368</x>
+        <y>208</y>
+        <label>initialize [await sync]</label>
+        <icon>hourglass_empty</icon>
+    </transition>
+    <transition>
+        <id>data_sync</id>
+        <x>368</x>
+        <y>328</y>
+        <label>Data sync</label>
+    </transition>
+    <transition>
+        <id>settings</id>
+        <x>496</x>
+        <y>112</y>
+        <label>Settings</label>
+        <icon>settings</icon>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>form_title</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>filter_update</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <title name="filter_update_title">Filter</title>
+            <dataRef>
+                <id>filter_autocomplete_selection</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>3</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>update_filter</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>selected_filter_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>current_additional_filter</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>filter_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>current_filter_preview</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>merge_filters</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>remove_filter</id>
+                <logic>
+                    <behavior>hidden</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>2</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>standard</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>view_dataGroup</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_search_type</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>3</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>show_more_menu</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>3</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>view_headers</id>
+            <cols>5</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>is_header_mode_changeable</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                    <action trigger="set">
+                        trans: t.this,
+                        isChangeable: f.is_header_mode_changeable,
+                        mode: f.headers_mode,
+                        defaultMode: f.headers_default_mode;
+
+                        make [mode, defaultMode], editable on trans when { isChangeable.value }
+                        make [mode, defaultMode], required on trans when { isChangeable.value }
+
+                        make [mode, defaultMode], hidden on trans when { !isChangeable.value }
+                        make [mode, defaultMode], optional on trans when { !isChangeable.value }
+                    </action>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>allow_header_table_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>headers_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>2</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>2</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>headers_default_mode</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <behavior>required</behavior>
+                </logic>
+                <layout>
+                    <x>4</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>use_default_headers</id>
+                <logic>
+                    <behavior>editable</behavior>
+                    <action trigger="set">
+                        trans: t.this,
+                        use: f.use_default_headers,
+                        headers: f.default_headers;
+
+                        make headers,editable on trans when { use.value }
+                        make headers,visible on trans when { !use.value }
+                    </action>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>1</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+            <dataRef>
+                <id>default_headers</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>1</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+    </transition>
+    <place>
+        <id>initialized</id>
+        <x>496</x>
+        <y>208</y>
+        <label>initialized</label>
+        <tokens>0</tokens>
+        <static>false</static>
+    </place>
+    <place>
+        <id>uninitialized</id>
+        <x>240</x>
+        <y>208</y>
+        <label>uninitialized</label>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>read</type>
+        <sourceId>initialized</sourceId>
+        <destinationId>settings</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>uninitialized</sourceId>
+        <destinationId>initialize</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a3</id>
+        <type>regular</type>
+        <sourceId>initialize</sourceId>
+        <destinationId>initialized</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml
new file mode 100644
index 00000000000..8bbf0f1d2ca
--- /dev/null
+++ b/application-engine/src/main/resources/petriNets/engine-processes/menu/tabbed_ticket_view_configuration.xml
@@ -0,0 +1,405 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>tabbed_ticket_view_configuration</id>
+    <initials>TVC</initials>
+    <title>Tabbed ticket view configuration</title>
+    <icon>check_box_outline_blank</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>false</anonymousRole>
+    <transitionRole>false</transitionRole>
+    <roleRef>
+        <id>system</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>admin</id>
+        <caseLogic>
+            <create>true</create>
+            <delete>true</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <roleRef>
+        <id>default</id>
+        <caseLogic>
+            <create>false</create>
+            <delete>false</delete>
+            <view>true</view>
+        </caseLogic>
+    </roleRef>
+    <caseEvents>
+        <event type="delete">
+            <id>view_delete</id>
+            <actions phase="pre">
+                <action id="0">
+                    removeViewCase()
+                </action>
+            </actions>
+        </event>
+    </caseEvents>
+    <role>
+        <id>system</id>
+        <title>System</title>
+    </role>
+    <role>
+        <id>admin</id>
+        <title>Admin</title>
+    </role>
+
+    <function scope="process" name="updateFilterAutocompleteOptions">
+        {
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField filterAutocomplete,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField previewTaskRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField selectedFilterRef,
+            com.netgrif.application.engine.objects.petrinet.domain.dataset.ButtonField updateBtn,
+            com.netgrif.application.engine.objects.petrinet.domain.Transition trans
+                ->
+                if (filterAutocomplete.getOptions().containsKey(filterAutocomplete.value)) {
+                    change previewTaskRef value {
+                        return [findTask({it.caseId.eq(filterAutocomplete.value).and(it.transitionId.eq("view_filter"))}).stringId]
+                    }
+                    make updateBtn,editable on trans when { true }
+                } else {
+                    change filterAutocomplete options {
+                        def findAllPredicate = { filterCase -> !selectedFilterRef.value.contains(filterCase.stringId)
+                                &amp;&amp; filterCase.dataSet["filter_type"].value == "Case" }
+                        return findFilters(filterAutocomplete.value != null ? filterAutocomplete.value : "")
+                                .findAll(findAllPredicate)
+                                .collectEntries({filterCase -&gt; [filterCase.stringId, filterCase.title]})
+                    }
+                    change previewTaskRef value { [] }
+                    make updateBtn,visible on trans when { true }
+                }
+        }
+    </function>
+    <function scope="process" name="removeViewCase">
+        { ->
+
+            def viewIdAsList = useCase.dataSet['view_configuration_id'].value
+            if (viewIdAsList == null || viewIdAsList.isEmpty()) {
+                return
+            }
+
+            async.run {
+                workflowService.deleteCase(viewIdAsList[0])
+            }
+        }
+    </function>
+
+    <!-- FILTER configuration data -->
+    <data type="taskRef">
+        <id>selected_filter_preview</id>
+        <title/>
+    </data>
+    <data type="taskRef">
+        <id>current_filter_preview</id>
+        <title/>
+    </data>
+    <data type="i18n">
+        <id>filter_header</id>
+        <title/>
+        <init name="filter_header">Current filter</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <data type="text">
+        <id>new_filter_id</id>
+        <title/>
+    </data>
+    <data type="boolean" immediate="true">
+        <id>contains_filter</id>
+        <title/>
+        <init>false</init>
+    </data>
+    <data type="enumeration_map">
+        <id>filter_autocomplete_selection</id>
+        <title name="filter_autocomplete_selection">Select new filter</title>
+        <component>
+            <name>autocomplete_dynamic</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+        <action trigger="get">
+            trans: t.settings,
+            filterAutocomplete: f.this,
+            filter_case: f.filter_case,
+            update_filter: f.update_filter,
+            previewTaskRef: f.selected_filter_preview;
+
+            updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans)
+        </action>
+    </data>
+    <data type="button">
+        <id>update_filter</id>
+        <title/>
+        <placeholder name="update_filter">Update view with selected filter</placeholder>
+        <component>
+            <name>raised</name>
+        </component>
+        <action trigger="set">
+            trans: t.settings,
+            update_filter: f.update_filter,
+            contains_filter: f.contains_filter,
+            filter_case: f.filter_case,
+            filterAutocomplete: f.filter_autocomplete_selection;
+
+            boolean containsFilter = filterAutocomplete.value != null &amp;&amp; filterAutocomplete.value != ""
+            if (containsFilter) {
+                def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterAutocomplete.value))})
+                if (filterCase.dataSet["filter_type"].value != "Case") {
+                    throw new IllegalArgumentException("Filter is of wrong type. Only filter of Case type allowed.")
+                }
+            }
+
+            change contains_filter value { containsFilter }
+            change filter_case value { [filterAutocomplete.value] }
+            change filterAutocomplete value { "" }
+            make update_filter,visible on trans when { true }
+        </action>
+    </data>
+    <data type="caseRef">
+        <id>filter_case</id>
+        <title/>
+        <action trigger="set">
+            filterTaskRef: f.current_filter_preview,
+            contains_filter: f.contains_filter,
+            filterCaseRef: f.filter_case;
+
+            if (filterCaseRef.value == null || filterCaseRef.value == []) {
+                change filterTaskRef value { [] }
+                change contains_filter value { false }
+                return
+            }
+
+            def filterCase = findCase({it._id.eq(filterCaseRef.value[0])})
+            change filterTaskRef value {
+                return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]
+            }
+            change contains_filter value { true }
+        </action>
+        <allowedNets>
+            <allowedNet>filter</allowedNet>
+        </allowedNets>
+    </data>
+
+    <!-- ASSOCIATED VIEW: this section can be removed if needed -->
+    <data type="enumeration_map" immediate="true">
+        <id>view_configuration_type</id>
+        <title name="view_configuration_type">Pick view type</title>
+        <options>
+            <init dynamic="true">menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier)</init>
+        </options>
+        <action trigger="set">
+            view_configuration_type: f.view_configuration_type;
+
+            if (view_configuration_type.options == null || view_configuration_type.options.isEmpty()) {
+                change view_configuration_type options { menuItemService.getAvailableViewsAsOptions(true, useCase.processIdentifier) }
+            }
+        </action>
+    </data>
+    <data type="caseRef">
+        <id>view_configuration_id</id>
+        <title/>
+        <allowedNets>
+            <allowedNet>tabbed_single_task_view_configuration</allowedNet>
+        </allowedNets>
+    </data>
+    <data type="taskRef">
+        <id>view_configuration_form</id>
+        <title/>
+    </data>
+    <!-- END OF ASSOCIATED VIEW -->
+
+    <!-- VIEW CONFIGURATION DATA -->
+    <data type="i18n">
+        <id>view_header</id>
+        <title/>
+        <init name="view_header">Ticket view</init>
+        <component>
+            <name>divider</name>
+        </component>
+    </data>
+    <!-- END OF VIEW CONFIGURATION DATA -->
+
+    <!-- I18NS -->
+    <i18n locale="sk">
+        <i18nString name="filter_autocomplete_selection">Zvoľte nový filter</i18nString>
+        <i18nString name="update_filter">Aktualizovať zobrazenie s vybraným filtrom</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Súčasný filter</i18nString>
+        <i18nString name="view_configuration_type">Vybrať zobrazenie</i18nString>
+        <i18nString name="settings">Nastavenie</i18nString>
+        <i18nString name="associated_view">Asociované zobrazenie</i18nString>
+        <i18nString name="view_header">Tiketové zobrazenie</i18nString>
+    </i18n>
+    <i18n locale="de">
+        <i18nString name="filter_autocomplete_selection">Neue Filter auswählen</i18nString>
+        <i18nString name="filter_update_title">Filter</i18nString>
+        <i18nString name="filter_header">Aktueller Filter</i18nString>
+        <i18nString name="update_filter">Aktualisiere die Ansicht mit dem ausgewählten Filter</i18nString>
+        <i18nString name="view_configuration_type">Wählen Sie einen Ansichtstyp</i18nString>
+        <i18nString name="settings">Einstellungen</i18nString>
+        <i18nString name="associated_view">zugehörige Ansicht</i18nString>
+        <i18nString name="view_header">Ticketansicht</i18nString>
+    </i18n>
+
+    <transition>
+        <id>initialize</id>
+        <x>368</x>
+        <y>208</y>
+        <label>initialize [await sync]</label>
+        <icon>hourglass_empty</icon>
+    </transition>
+    <transition>
+        <id>data_sync</id>
+        <x>368</x>
+        <y>328</y>
+        <label>Data sync</label>
+    </transition>
+    <transition>
+        <id>settings</id>
+        <x>496</x>
+        <y>112</y>
+        <label name="settings">Settings</label>
+        <icon>settings</icon>
+        <roleRef>
+            <id>admin</id>
+            <logic>
+                <perform>true</perform>
+                <view>true</view>
+                <cancel>true</cancel>
+                <assign>true</assign>
+            </logic>
+        </roleRef>
+        <dataGroup>
+            <id>form_title</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <dataRef>
+                <id>view_header</id>
+                <logic>
+                    <behavior>visible</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+        <dataGroup>
+            <id>associated_view</id>
+            <cols>4</cols>
+            <layout>grid</layout>
+            <title name="associated_view">Associated view</title>
+            <dataRef>
+                <id>view_configuration_type</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>0</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+                <event type="set">
+                    <id>0</id>
+                    <actions phase="post">
+                        <action>
+                            view_configuration_type: f.view_configuration_type,
+                            view_configuration_form: f.view_configuration_form,
+                            view_configuration_id: f.view_configuration_id;
+
+                            if (view_configuration_id.value != null &amp;&amp; !view_configuration_id.value.isEmpty()) {
+                                workflowService.deleteCase(view_configuration_id.value[0])
+                            }
+
+                            if (view_configuration_type.value == null || view_configuration_type.value == "") {
+                                change view_configuration_id value { [] }
+                                change view_configuration_form value { [] }
+                                return
+                            }
+
+                            def configurationCase = createCase(view_configuration_type.value + "_configuration")
+                            def initTask = assignTask("initialize", configurationCase)
+                            finishTask(initTask)
+                            change view_configuration_id value { [configurationCase.stringId] }
+                            configurationCase = workflowService.findOne(configurationCase.stringId)
+                            change view_configuration_form value { [configurationCase.tasks.find { it.transition == "settings" }.task] }
+                        </action>
+                    </actions>
+                </event>
+            </dataRef>
+            <dataRef>
+                <id>view_configuration_form</id>
+                <logic>
+                    <behavior>editable</behavior>
+                </logic>
+                <layout>
+                    <x>0</x>
+                    <y>1</y>
+                    <rows>1</rows>
+                    <cols>4</cols>
+                    <offset>0</offset>
+                    <template>material</template>
+                    <appearance>outline</appearance>
+                </layout>
+            </dataRef>
+        </dataGroup>
+    </transition>
+    <place>
+        <id>initialized</id>
+        <x>496</x>
+        <y>208</y>
+        <label>initialized</label>
+        <tokens>0</tokens>
+        <static>false</static>
+    </place>
+    <place>
+        <id>uninitialized</id>
+        <x>240</x>
+        <y>208</y>
+        <label>uninitialized</label>
+        <tokens>1</tokens>
+        <static>false</static>
+    </place>
+    <arc>
+        <id>a1</id>
+        <type>read</type>
+        <sourceId>initialized</sourceId>
+        <destinationId>settings</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a2</id>
+        <type>regular</type>
+        <sourceId>uninitialized</sourceId>
+        <destinationId>initialize</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+    <arc>
+        <id>a3</id>
+        <type>regular</type>
+        <sourceId>initialize</sourceId>
+        <destinationId>initialized</destinationId>
+        <multiplicity>1</multiplicity>
+    </arc>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/preference_filter_item.xml b/application-engine/src/main/resources/petriNets/engine-processes/preference_filter_item.xml
index d4f4679184e..bf6b8375736 100644
--- a/application-engine/src/main/resources/petriNets/engine-processes/preference_filter_item.xml
+++ b/application-engine/src/main/resources/petriNets/engine-processes/preference_filter_item.xml
@@ -416,7 +416,7 @@
 					entryName: f.entry_name,
 					icon: f.icon_name;
 
-					def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
+					def filterCase = findCase({it._id.objectId.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
 
 					change entryDefaultName value {return filterCase.title}
 
diff --git a/application-engine/src/main/resources/petriNets/engine-processes/preference_item.xml b/application-engine/src/main/resources/petriNets/engine-processes/preference_item.xml
deleted file mode 100644
index eec1f3aa971..00000000000
--- a/application-engine/src/main/resources/petriNets/engine-processes/preference_item.xml
+++ /dev/null
@@ -1,2664 +0,0 @@
-<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
-	<id>preference_item</id>
-	<initials>PRI</initials>
-	<title>Preference Item</title>
-	<icon>check_box_outline_blank</icon>
-	<defaultRole>true</defaultRole>
-	<anonymousRole>false</anonymousRole>
-	<transitionRole>false</transitionRole>
-	<roleRef>
-		<id>system</id>
-		<caseLogic>
-			<create>true</create>
-			<delete>true</delete>
-			<view>true</view>
-		</caseLogic>
-	</roleRef>
-	<roleRef>
-		<id>admin</id>
-		<caseLogic>
-			<create>true</create>
-			<delete>true</delete>
-			<view>true</view>
-		</caseLogic>
-	</roleRef>
-	<roleRef>
-		<id>default</id>
-		<caseLogic>
-			<create>false</create>
-			<delete>false</delete>
-			<view>true</view>
-		</caseLogic>
-	</roleRef>
-	<caseEvents>
-		<event type="delete">
-			<id>preference_item_delete</id>
-			<actions phase="pre">
-				<action id="0">
-					removeItemChildCases(useCase)
-				</action>
-			</actions>
-		</event>
-	</caseEvents>
-	<role>
-		<id>system</id>
-		<title>System</title>
-	</role>
-	<role>
-		<id>admin</id>
-		<title>Admin</title>
-	</role>
-	<function scope="process" name="removeItemChildCases">
-		{ com.netgrif.application.engine.objects.workflow.domain.Case useCase ->
-
-			def childCaseIds = useCase.dataSet['childItemIds'].value
-			if (childCaseIds == null || childCaseIds.isEmpty()) {
-				return
-			}
-
-			removeChildItemFromParent(useCase.dataSet['parentId'].value[0], useCase)
-
-			def childCases = workflowService.findAllById(childCaseIds)
-			async.run {
-				childCases.each {
-					workflowService.deleteCase(it)
-				}
-			}
-		}
-	</function>
-	<function scope="process" name="updateFilterAutocompleteOptions">
-		{
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField filterAutocomplete,
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.TaskField previewTaskRef,
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.CaseField selectedFilterRef,
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.ButtonField updateBtn,
-			com.netgrif.application.engine.objects.petrinet.domain.Transition trans,
-			boolean taskTypeOnly
-			->
-			if (filterAutocomplete.getOptions().containsKey(filterAutocomplete.value)) {
-				change previewTaskRef value {
-					return [findTask({it.caseId.eq(filterAutocomplete.value).and(it.transitionId.eq("view_filter"))}).stringId]
-				}
-				make updateBtn,editable on trans when { true }
-			} else {
-				change filterAutocomplete options {
-					def findAllPredicate
-					if (taskTypeOnly) {
-						findAllPredicate = { filterCase ->
-							!selectedFilterRef.value.contains(filterCase.stringId) &amp;&amp;
-							filterCase.dataSet["filter_type"].value == "Task"
-						}
-					} else {
-						findAllPredicate = { filterCase -> !selectedFilterRef.value.contains(filterCase.stringId) }
-					}
-					return findFilters(filterAutocomplete.value != null ? filterAutocomplete.value : "")
-							.findAll(findAllPredicate)
-							.collectEntries({filterCase -&gt; [filterCase.stringId, filterCase.title]})
-				}
-				change previewTaskRef value { [] }
-				make updateBtn,visible on trans when { true }
-			}
-		}
-	</function>
-	<function scope="process" name="updateOptionsBasedOnValue">
-		{
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField toBeUpdated,
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.MultichoiceMapField valueSelector,
-			com.netgrif.application.engine.objects.petrinet.domain.dataset.EnumerationMapField optionsHolder
-			->
-			def existingOptions = optionsHolder.options
-			def selectedValues = valueSelector.value
-			def newOptions = [:]
-
-			if (selectedValues != null) {
-				existingOptions.each { key, value ->
-					if (selectedValues.contains(key)) {
-						newOptions.put(key, value)
-					}
-				}
-			}
-
-			if (!newOptions.containsKey(toBeUpdated.value)) {
-				change toBeUpdated value { null }
-			}
-
-			change toBeUpdated options { newOptions }
-		}
-	</function>
-
-	<data type="caseRef">
-		<id>parentId</id>
-		<title/>
-		<allowedNets>
-			<allowedNet>preference_item</allowedNet>
-		</allowedNets>
-	</data>
-	<data type="text">
-		<id>move_previous_dest_uri</id>
-		<title/>
-	</data>
-	<data type="multichoice_map">
-		<id>move_dest_uri</id>
-		<title name="move_dest_uri">Destination URI</title>
-		<desc name="move_dest_uri_desc">List of nodes representing destination URI</desc>
-		<component>
-			<name>autocomplete</name>
-		</component>
-		<action trigger="get">
-			moveDestUri: f.move_dest_uri;
-
-//			String uriNodeId = elasticCaseService.findUriNodeId(useCase)
-//			def node = uriService.findById(uriNodeId)
-//			updateMultichoiceWithCurrentNode(moveDestUri, node)
-		</action>
-		<action trigger="set">
-			prevDestUri: f.move_previous_dest_uri,
-			moveDestUri: f.move_dest_uri;
-
-			String newUri = moveDestUri.value.join("/")
-			newUri = newUri.replace("//","/")
-
-			String corrected = getCorrectedUri(newUri)
-
-			if (corrected == newUri) {
-				change moveDestUri options { findOptionsBasedOnSelectedNode(newUri) }
-			} else {
-				change moveDestUri value { splitUriPath(corrected) }
-			}
-		</action>
-	</data>
-	<data type="text">
-		<id>move_dest_uri_new_node</id>
-		<title name="move_dest_uri_new_node">New node to be added</title>
-		<desc name="move_dest_uri_new_node_desc">Enter new node name</desc>
-	</data>
-	<data type="button">
-		<id>move_add_node</id>
-		<title/>
-		<placeholder name="move_add_node">Add</placeholder>
-		<component>
-			<name>raised</name>
-		</component>
-		<action trigger="set">
-			newNodeName: f.move_dest_uri_new_node,
-			selectedUri: f.move_dest_uri;
-
-			if (newNodeName.value == null || newNodeName.value == "") {
-				return
-			}
-
-			String prefixUri = selectedUri.value.join("/")
-			prefixUri = prefixUri.replace("//","/")
-
-			String newUri = prefixUri + "/" + newNodeName.value
-			def newNode = uriService.getOrCreate(newUri, com.netgrif.application.engine.objects.petrinet.domain.UriContentType.CASE)
-
-			change selectedUri value { splitUriPath(newNode.uriPath) }
-
-			change newNodeName value { null }
-		</action>
-	</data>
-	<data type="i18n">
-		<id>duplicate_new_title</id>
-		<title name="duplicate_new_title">Title of duplicated view</title>
-	</data>
-	<data type="text">
-		<id>duplicate_view_identifier</id>
-		<title name="duplicate_view_identifier">View identifier</title>
-		<desc name="duplicate_view_identifier_desc">Must be unique</desc>
-	</data>
-	<data type="caseRef" immediate="true">
-		<id>childItemIds</id>
-		<title/>
-		<allowedNets>
-			<allowedNet>preference_item</allowedNet>
-		</allowedNets>
-	</data>
-	<data type="taskRef">
-		<id>childItemForms</id>
-		<title/>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>hasChildren</id>
-		<title/>
-	</data>
-	<data type="button">
-		<id>duplicate_reset_childItemIds</id>
-		<title/>
-		<action trigger="set">
-			hasChildren: f.hasChildren,
-			childItemIds: f.childItemIds;
-
-			change childItemIds value { [] }
-			change hasChildren value { false }
-		</action>
-	</data>
-	<data type="text" immediate="true">
-		<id>menu_item_identifier</id>
-		<title name="menu_item_identifier">Menu item identifier</title>
-	</data>
-	<data type="text" immediate="true">
-		<id>nodePath</id>
-		<title name="nodePath">Item URI</title>
-		<event type="set">
-			<id>0</id>
-			<actions phase="post">
-				<action>
-					nodePath: f.nodePath,
-					menu_item_identifier: f.menu_item_identifier;
-
-					change menu_item_identifier value {
-						def idx = nodePath.value.lastIndexOf("/")
-						return nodePath.value.substring(idx + 1)
-					}
-				</action>
-			</actions>
-		</event>
-	</data>
-
-	<!-- GENERAL CONFIGURATION DATA -->
-	<data type="text" immediate="true">
-		<id>menu_icon</id>
-		<title name="icon_identifier">Menu icon identifier</title>
-		<desc name="icon_identifier_desc">Material icon identifier. List of icons with identifiers is available online.</desc>
-		<action trigger="set">
-			icon: f.this,
-			iconPreview: f.menu_icon_preview;
-
-			changeCaseProperty "icon" about { icon.value; }
-
-			if (icon.value == "") {
-				change iconPreview value {<![CDATA["""<span></span>"""]]>}
-				return;
-			}
-
-			change iconPreview value {
-				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + icon.value + <![CDATA["""</span>"""]]>
-			}
-		</action>
-	</data>
-	<data type="text">
-		<id>menu_icon_preview</id>
-		<title name="icon_preview">Menu icon preview</title>
-		<component>
-			<name>htmltextarea</name>
-		</component>
-	</data>
-	<data type="enumeration">
-		<id>menu_name_as_visible</id>
-		<title name="name">Name of the item</title>
-		<desc name="name_desc">Is shown in the menu</desc>
-		<component>
-			<name>autocomplete</name>
-		</component>
-	</data>
-	<data type="i18n" immediate="true">
-		<id>menu_name</id>
-		<title name="name">Name of the item</title>
-		<desc name="name_desc">Will be shown in the menu</desc>
-		<action trigger="set">
-			menu_name_as_visible: f.menu_name_as_visible,
-			name: f.menu_name;
-
-			changeCaseProperty "title" about { name.value }
-			change menu_name_as_visible choices { [name.value] }
-			change menu_name_as_visible value { name.value }
-		</action>
-	</data>
-	<data type="text" immediate="true">
-		<id>tab_icon</id>
-		<title name="tab_icon">Tab icon identifier</title>
-		<desc name="tab_icon_identifier_desc">Material icon identifier. List of icons with identifiers is available online.</desc>
-		<action trigger="set">
-			icon: f.this,
-			iconPreview: f.tab_icon_preview;
-
-			if (icon.value == "") {
-				change iconPreview value {<![CDATA["""<span></span>"""]]>}
-				return;
-			}
-
-			change iconPreview value {
-				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + icon.value + <![CDATA["""</span>"""]]>
-			}
-		</action>
-	</data>
-	<data type="text">
-		<id>tab_icon_preview</id>
-		<title>Tab icon preview</title>
-		<component>
-			<name>htmltextarea</name>
-		</component>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>use_tab_icon</id>
-		<title name="display_tab_icon">Display tab icon?</title>
-		<init>true</init>
-	</data>
-	<data type="i18n" immediate="true">
-		<id>tab_name</id>
-		<title name="tab_name">Name of the item</title>
-		<desc name="tab_name_desc">Will be shown in tab</desc>
-	</data>
-	<data type="button">
-		<id>add_allowed_roles</id>
-		<title/>
-		<placeholder name="allow_roles">Allow view for roles</placeholder>
-		<action trigger="set">
-			allowedRoles: f.allowed_roles,
-			processesAvailable: f.processes_available,
-			rolesAvailable: f.roles_available;
-
-			change allowedRoles options {return configurableMenuService.addSelectedRoles(allowedRoles, processesAvailable, rolesAvailable)}
-
-			change rolesAvailable value {[]}
-			change rolesAvailable options {[:]}
-			change processesAvailable value {null}
-		</action>
-	</data>
-	<data type="button">
-		<id>remove_allowed_roles</id>
-		<title/>
-		<placeholder name="remove_from_allowed_roles">Remove from allowed roles</placeholder>
-		<action trigger="set">
-			allowedRoles: f.allowed_roles,
-			processesAvailable: f.processes_available,
-			rolesAvailable: f.roles_available;
-
-			change allowedRoles options {return configurableMenuService.removeSelectedRoles(allowedRoles)}
-
-			change allowedRoles value {[]}
-			change rolesAvailable value {[]}
-			change rolesAvailable options {[:]}
-			change processesAvailable value {null}
-		</action>
-	</data>
-	<data type="button">
-		<id>add_banned_roles</id>
-		<title/>
-		<placeholder name="ban_roles">Ban view for roles</placeholder>
-		<action trigger="set">
-			bannedRoles: f.banned_roles,
-			processesAvailable: f.processes_available,
-			rolesAvailable: f.roles_available;
-
-			change bannedRoles options {return configurableMenuService.addSelectedRoles(bannedRoles, processesAvailable, rolesAvailable)}
-
-			change rolesAvailable value {[]}
-			change rolesAvailable options {[:]}
-			change processesAvailable value {null}
-		</action>
-	</data>
-	<data type="button">
-		<id>remove_banned_roles</id>
-		<title/>
-		<placeholder name="remove_from_banned_roles">Remove from banned roles</placeholder>
-		<action trigger="set">
-			bannedRoles: f.banned_roles,
-			processesAvailable: f.processes_available,
-			rolesAvailable: f.roles_available;
-
-			change bannedRoles options { return configurableMenuService.removeSelectedRoles(bannedRoles) }
-
-			change bannedRoles value { [] }
-			change rolesAvailable value { [] }
-			change rolesAvailable options { [:] }
-			change processesAvailable value { null }
-		</action>
-	</data>
-	<data type="enumeration_map" immediate="true">
-		<id>processes_available</id>
-		<title name="available_processes">Your processes</title>
-		<desc name="available_processes_desc">Select a process containing roles you wish to add to allowed or banned roles lists.</desc>
-		<action trigger="get">
-			processes: f.this;
-
-			change processes options { return configurableMenuService.getNetsByAuthorAsMapOptions(loggedUser(), org.springframework.context.i18n.LocaleContextHolder.locale) }
-		</action>
-		<action trigger="set">
-			processes: f.this,
-			allowedRoles: f.allowed_roles,
-			bannedRoles: f.banned_roles,
-			rolesAvailable: f.roles_available;
-
-			if (processes.value != null) {
-				change rolesAvailable options { return configurableMenuService.getAvailableRolesFromNet(processes, allowedRoles, bannedRoles) }
-			} else {
-				change rolesAvailable options { [:] }
-			}
-			change rolesAvailable value { [] }
-		</action>
-	</data>
-	<data type="multichoice_map" immediate="true">
-		<id>roles_available</id>
-		<title name="available_roles">Available roles from selected process</title>
-	</data>
-	<data type="multichoice_map" immediate="true">
-		<id>allowed_roles</id>
-		<title name="roles_allowed">Allowed roles</title>
-		<desc name="roles_allowed_desc">List of roles allowed to view this menu entry.</desc>
-		<options>
-			<init dynamic="true">[:]</init>
-		</options>
-	</data>
-	<data type="multichoice_map" immediate="true">
-		<id>banned_roles</id>
-		<title name="roles_banned">Banned roles</title>
-		<desc name="roles_banned_desc">List of roles not allowed to view this menu entry.</desc>
-		<options>
-			<init dynamic="true">[:]</init>
-		</options>
-	</data>
-	<data type="taskRef">
-		<id>selected_filter_preview</id>
-		<title/>
-	</data>
-	<data type="taskRef">
-		<id>current_filter_preview</id>
-		<title/>
-	</data>
-	<data type="i18n">
-		<id>filter_header</id>
-		<title/>
-		<init name="filter_header">Current filter</init>
-		<component>
-			<name>divider</name>
-		</component>
-	</data>
-	<data type="text">
-		<id>new_filter_id</id>
-		<title/>
-	</data>
-	<data type="enumeration_map">
-		<id>filter_autocomplete_selection</id>
-		<title name="filter_autocomplete_selection">Select new filter</title>
-		<component>
-			<name>autocomplete_dynamic</name>
-		</component>
-		<action trigger="set">
-			trans: t.item_settings,
-			useCustomView: f.use_custom_view,
-			filterAutocomplete: f.this,
-			filter_case: f.filter_case,
-			update_filter: f.update_filter,
-			previewTaskRef: f.selected_filter_preview;
-
-			updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans, false)
-
-			make update_filter,hidden on trans when { useCustomView.value }
-		</action>
-		<action trigger="get">
-			trans: t.item_settings,
-			useCustomView: f.use_custom_view,
-			filterAutocomplete: f.this,
-			filter_case: f.filter_case,
-			update_filter: f.update_filter,
-			previewTaskRef: f.selected_filter_preview;
-
-			updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filter_case, update_filter, trans, false)
-
-			make update_filter,hidden on trans when { useCustomView.value }
-		</action>
-	</data>
-	<data type="button">
-		<id>update_filter</id>
-		<title/>
-		<placeholder name="update_filter">Update view with selected filter</placeholder>
-		<component>
-			<name>raised</name>
-		</component>
-		<action trigger="set">
-			trans: t.item_settings,
-			update_filter: f.update_filter,
-			filter_case: f.filter_case,
-			filterAutocomplete: f.filter_autocomplete_selection;
-
-			change filter_case value { [filterAutocomplete.value] }
-			change filterAutocomplete value { "" }
-			make update_filter,visible on trans when { true }
-		</action>
-	</data>
-	<data type="caseRef">
-		<id>filter_case</id>
-		<title/>
-		<action trigger="set">
-			additionalFilterCase: f.additional_filter_case,
-			additionalAutocomplete: f.additional_filter_autocomplete_selection,
-			additionalUpdate: f.update_additional_filter,
-			additionalFilterPreview: f.selected_additional_filter_preview,
-			mergeFilters: f.merge_filters,
-			filterHeader: f.filter_header,
-			currentAdditionalFilterPreview: f.current_additional_filter_preview,
-			taskSettingsTrans: t.task_view_settings,
-			settingsTrans: t.item_settings,
-			caseViewHeader: f.case_view_header,
-			caseViewSettingsTaskRef: f.case_view_settings_taskRef,
-			taskViewHeader: f.task_view_header,
-			taskViewSettingsTaskRef: f.task_view_settings_taskRef,
-			filterTaskRef: f.current_filter_preview,
-			filterCaseRef: f.filter_case;
-
-			if (filterCaseRef.value == null || filterCaseRef.value == []) {
-				return
-			}
-
-			def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
-			change filterTaskRef value {return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]}
-
-			if (filterCase.dataSet["filter_type"].value == "Case") {
-				make caseViewHeader,editable on settingsTrans when { true }
-				make caseViewSettingsTaskRef,editable on settingsTrans when { true }
-
-				make additionalAutocomplete,editable on taskSettingsTrans when { true }
-				make additionalUpdate,visible on taskSettingsTrans when { true }
-				make additionalFilterPreview,visible on taskSettingsTrans when { true }
-				make mergeFilters,visible on taskSettingsTrans when { true }
-				make filterHeader,visible on taskSettingsTrans when { true }
-				make currentAdditionalFilterPreview,visible on taskSettingsTrans when { true }
-			} else {
-				make caseViewHeader,hidden on settingsTrans when { true }
-				make caseViewSettingsTaskRef,hidden on settingsTrans when { true }
-
-				make additionalAutocomplete,hidden on taskSettingsTrans when { true }
-				make additionalUpdate,hidden on taskSettingsTrans when { true }
-				make additionalFilterPreview,hidden on taskSettingsTrans when { true }
-				make mergeFilters,hidden on taskSettingsTrans when { true }
-				make filterHeader,hidden on taskSettingsTrans when { true }
-				make currentAdditionalFilterPreview,hidden on taskSettingsTrans when { true }
-			}
-			make taskViewHeader,editable on settingsTrans when { true }
-			make taskViewSettingsTaskRef,editable on settingsTrans when { true }
-
-			change additionalFilterCase value { [] }
-		</action>
-		<allowedNets>
-			<allowedNet>filter</allowedNet>
-		</allowedNets>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>use_custom_view</id>
-		<title name="use_custom_view">Use custom view?</title>
-		<init>false</init>
-	</data>
-	<data type="text" immediate="true">
-		<id>custom_view_selector</id>
-		<title name="custom_view_selector">Custom view configuration selector</title>
-		<desc name="custom_view_selector_desc">Example: "demo-tabbed-views"</desc>
-	</data>
-
-	<!-- CASE VIEW CONFIGURATION DATA -->
-	<data type="enumeration_map" immediate="true">
-		<id>case_view_search_type</id>
-		<title name="case_view_search_type">Search type for case view</title>
-		<options>
-			<option key="hidden" name="hidden">Hidden</option>
-			<option key="fulltext" name="fulltext">Fulltext</option>
-			<option key="fulltext_advanced" name="fulltext_advanced">Fulltext and advanced</option>
-		</options>
-		<init>fulltext_advanced</init>
-	</data>
-	<data type="text" immediate="true">
-		<id>create_case_button_title</id>
-		<title name="create_case_button_title">"New case" button title</title>
-	</data>
-	<data type="text">
-		<id>create_case_button_icon_preview</id>
-		<title name="create_case_button_icon_preview">Icon preview</title>
-		<init><![CDATA[<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">add</span>]]></init>
-		<component>
-			<name>htmltextarea</name>
-		</component>
-	</data>
-	<data type="text" immediate="true">
-		<id>create_case_button_icon</id>
-		<title name="create_case_button_icon">"New case" button icon identifier</title>
-		<init>add</init>
-		<action trigger="set">
-			create_case_button_icon_preview: f.create_case_button_icon_preview,
-			create_case_button_icon: f.create_case_button_icon;
-
-
-			if (create_case_button_icon.value == "") {
-				change create_case_button_icon_preview value {<![CDATA["""<span></span>"""]]>}
-				return;
-			}
-
-			change create_case_button_icon_preview value {
-				<![CDATA["""<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet"><span class="material-icons">"""]]> + create_case_button_icon.value + <![CDATA["""</span>"""]]>
-			}
-		</action>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>show_create_case_button</id>
-		<title name="show_create_case_button">Show create case button?</title>
-		<init>true</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>case_require_title_in_creation</id>
-		<title name="case_require_title_in_creation">Require title input in case creation?</title>
-		<init>true</init>
-	</data>
-	<data type="text" immediate="true">
-		<id>case_banned_nets_in_creation</id>
-		<title name="case_banned_nets_in_creation">Banned processes for creation</title>
-		<desc name="case_banned_nets_in_creation_desc">Write down process identifiers separated by comma. Example: mynet1,mynet2</desc>
-		<action trigger="set">
-			bannedNets: f.this;
-
-			String trimmed = bannedNets.value?.replaceAll("\\s","")
-			if (bannedNets.value != trimmed) {
-				change bannedNets value { trimmed }
-			}
-		</action>
-	</data>
-	<data type="i18n">
-		<id>case_view_header</id>
-		<title/>
-		<init name="case_view_header">Case view</init>
-		<component>
-			<name>divider</name>
-		</component>
-	</data>
-	<data type="taskRef">
-		<id>case_view_settings_taskRef</id>
-		<title/>
-		<init>case_view_settings</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>case_show_more_menu</id>
-		<title name="case_show_more_menu">Show more menu for case item?</title>
-		<init>false</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>case_allow_header_table_mode</id>
-		<title name="allow_header_table_mode">Allow table mode for headers?</title>
-		<init>true</init>
-	</data>
-	<data type="multichoice_map" immediate="true">
-		<id>case_headers_mode</id>
-		<title name="headers_mode">Header mode</title>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="search" name="search">Search</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-		<init>sort,edit,search</init>
-		<action trigger="set">
-			headersMode: f.case_headers_mode,
-			defaultMode: f.case_headers_default_mode,
-			holder: f.case_headers_options_holder;
-
-			updateOptionsBasedOnValue(defaultMode, headersMode, holder)
-		</action>
-		<action trigger="get">
-			headersMode: f.case_headers_mode,
-			defaultMode: f.case_headers_default_mode,
-			holder: f.case_headers_options_holder;
-
-			updateOptionsBasedOnValue(defaultMode, headersMode, holder)
-		</action>
-	</data>
-	<data type="enumeration_map" immediate="true">
-		<id>case_headers_default_mode</id>
-		<title name="headers_default_mode">Default header mode</title>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="search" name="search">Search</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-		<init>sort</init>
-	</data>
-	<data type="enumeration_map">
-		<id>case_headers_options_holder</id>
-		<title/>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="search" name="search">Search</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>case_is_header_mode_changeable</id>
-		<title name="is_header_mode_changeable">Can header mode be changed?</title>
-		<init>true</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>use_case_default_headers</id>
-		<title name="case_default_headers">Use custom default headers?</title>
-		<init>true</init>
-	</data>
-	<data type="text" immediate="true">
-		<id>case_default_headers</id>
-		<title name="default_headers">Set default headers</title>
-		<desc name="default_headers_desc">Example: "meta-title,meta-visualId"</desc>
-		<action trigger="set">
-			defaultHeaders: f.this;
-
-			String trimmed = defaultHeaders.value?.replaceAll("\\s","")
-			if (defaultHeaders.value != trimmed) {
-				change defaultHeaders value { trimmed }
-			}
-		</action>
-	</data>
-
-	<!-- TASK VIEW CONFIGURATION DATA -->
-	<data type="taskRef">
-		<id>selected_additional_filter_preview</id>
-		<title/>
-	</data>
-	<data type="taskRef">
-		<id>current_additional_filter_preview</id>
-		<title/>
-	</data>
-	<data type="enumeration_map">
-		<id>additional_filter_autocomplete_selection</id>
-		<title name="filter_autocomplete_selection">Select new filter</title>
-		<component>
-			<name>autocomplete_dynamic</name>
-		</component>
-		<action trigger="set">
-			trans: t.task_view_settings,
-			filterAutocomplete: f.this,
-			filterCase: f.additional_filter_case,
-			updateFilter: f.update_additional_filter,
-			previewTaskRef: f.selected_additional_filter_preview;
-
-			updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filterCase, updateFilter, trans, true)
-		</action>
-		<action trigger="get">
-			trans: t.task_view_settings,
-			filterAutocomplete: f.this,
-			filterCase: f.additional_filter_case,
-			updateFilter: f.update_additional_filter,
-			previewTaskRef: f.selected_additional_filter_preview;
-
-			updateFilterAutocompleteOptions(filterAutocomplete, previewTaskRef, filterCase, updateFilter, trans, true)
-		</action>
-	</data>
-	<data type="button">
-		<id>update_additional_filter</id>
-		<title/>
-		<placeholder name="update_filter">Update view with selected filter</placeholder>
-		<component>
-			<name>raised</name>
-		</component>
-		<action trigger="set">
-			trans: t.task_view_settings,
-			updateFilter: f.update_additional_filter,
-			filterCase: f.additional_filter_case,
-			filterAutocomplete: f.additional_filter_autocomplete_selection;
-
-			change filterCase value { [filterAutocomplete.value] }
-			change filterAutocomplete value { "" }
-			make updateFilter,visible on trans when { true }
-		</action>
-	</data>
-	<data type="button">
-		<id>remove_additional_filter</id>
-		<title/>
-		<placeholder name="remove_additional_filter">Remove additional filter</placeholder>
-		<component>
-			<name>raised</name>
-		</component>
-		<action trigger="set">
-			filterCase: f.additional_filter_case;
-
-			change filterCase value { [] }
-		</action>
-	</data>
-	<data type="caseRef">
-		<id>additional_filter_case</id>
-		<title/>
-		<action trigger="set">
-			taskViewTrans: t.task_view_settings,
-			mergeFilters: f.merge_filters,
-			filterHeader: f.filter_header,
-			filterTaskRef: f.current_additional_filter_preview,
-			removeButton: f.remove_additional_filter,
-			filterCaseRef: f.additional_filter_case;
-
-			if (filterCaseRef.value[0] == null) {
-				make mergeFilters,hidden on taskViewTrans when { true }
-				make filterHeader,hidden on taskViewTrans when { true }
-				make removeButton,hidden on taskViewTrans when { true }
-				change filterTaskRef value { [] }
-				return
-			}
-
-			def filterCase = findCase({ it._id.eq(filterCaseRef.value[0]) })
-			change filterTaskRef value { return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId] }
-			make mergeFilters,editable on taskViewTrans when { true }
-			make filterHeader,visible on taskViewTrans when { true }
-			make removeButton,editable on taskViewTrans when { true }
-		</action>
-		<allowedNets>
-			<allowedNet>filter</allowedNet>
-		</allowedNets>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>merge_filters</id>
-		<title name="merge_filters">Merge with base filter?</title>
-		<init>true</init>
-	</data>
-	<data type="taskRef">
-		<id>task_view_settings_taskRef</id>
-		<title/>
-		<init>task_view_settings</init>
-	</data>
-	<data type="i18n">
-		<id>task_view_header</id>
-		<title/>
-		<init name="task_view_header">Task view</init>
-		<component>
-			<name>divider</name>
-		</component>
-	</data>
-	<data type="enumeration_map" immediate="true">
-		<id>task_view_search_type</id>
-		<title name="task_view_search_type">Search type for task view</title>
-		<options>
-			<option key="hidden" name="hidden">Hidden</option>
-			<option key="fulltext" name="fulltext">Fulltext</option>
-			<option key="fulltext_advanced" name="fulltext_advanced">Fulltext and advanced</option>
-		</options>
-		<init>fulltext_advanced</init>
-	</data>
-	<data type="multichoice_map" immediate="true">
-		<id>task_headers_mode</id>
-		<title name="headers_mode">Header mode</title>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-		<init>sort,edit</init>
-		<action trigger="set">
-			headersMode: f.task_headers_mode,
-			defaultMode: f.task_headers_default_mode,
-			holder: f.task_headers_options_holder;
-
-			updateOptionsBasedOnValue(defaultMode, headersMode, holder)
-		</action>
-		<action trigger="get">
-			headersMode: f.case_headers_mode,
-			defaultMode: f.case_headers_default_mode,
-			holder: f.case_headers_options_holder;
-
-			updateOptionsBasedOnValue(defaultMode, headersMode, holder)
-		</action>
-	</data>
-	<data type="enumeration_map" immediate="true">
-		<id>task_headers_default_mode</id>
-		<title name="headers_default_mode">Default header mode</title>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-		<init>sort</init>
-	</data>
-	<data type="enumeration_map">
-		<id>task_headers_options_holder</id>
-		<title/>
-		<options>
-			<option key="sort" name="sort">Sort</option>
-			<option key="edit" name="edit">Edit</option>
-		</options>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>task_is_header_mode_changeable</id>
-		<title name="is_header_mode_changeable">Can header mode be changed?</title>
-		<init>true</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>task_allow_header_table_mode</id>
-		<title name="allow_header_table_mode">Allow table mode for headers?</title>
-		<init>true</init>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>use_task_default_headers</id>
-		<title name="use_default_headers">Use custom default headers?</title>
-		<init>true</init>
-	</data>
-	<data type="text" immediate="true">
-		<id>task_default_headers</id>
-		<title name="task_default_headers">Set default headers</title>
-		<desc name="task_default_headers_desc">Example: "meta-title,meta-user"</desc>
-		<action trigger="set">
-			defaultHeaders: f.this;
-
-			String trimmed = defaultHeaders.value?.replaceAll("\\s","")
-			if (defaultHeaders.value != trimmed) {
-				change defaultHeaders value { trimmed }
-			}
-		</action>
-	</data>
-	<data type="boolean" immediate="true">
-		<id>task_show_more_menu</id>
-		<title name="task_show_more_menu">Show more menu for task item?</title>
-		<init>true</init>
-	</data>
-	<data type="button">
-		<id>order_down</id>
-		<title/>
-		<placeholder>south</placeholder>
-		<component>
-			<name>icon</name>
-			<property key="stretch">true</property>
-		</component>
-		<action trigger="set">
-			parentId: f.parentId;
-
-			def parentCase = workflowService.findOne(parentId.value[0])
-			def taskId = useCase.tasks.find { it.transition == "row_for_ordering" }.task
-			def taskRefValue = parentCase.dataSet['childItemForms'].value
-			int taskRefValueSize = taskRefValue.size()
-			def caseRefValue = parentCase.dataSet['childItemIds'].value
-			int caseRefValueSize = caseRefValue.size()
-
-			int idxInTaskRef = taskRefValue.indexOf(taskId)
-			if (idxInTaskRef &lt; taskRefValueSize - 1) {
-				Collections.swap(taskRefValue, idxInTaskRef, idxInTaskRef + 1)
-			}
-
-			int idxInCaseRef = caseRefValue.indexOf(useCase.stringId)
-			if (idxInCaseRef &lt; caseRefValueSize - 1) {
-				Collections.swap(caseRefValue, idxInCaseRef, idxInCaseRef + 1)
-			}
-
-			setData("children_order", parentCase, [
-			        "childItemForms" : [
-			                "value" : taskRefValue,
-							"type" : "taskRef"
-			        ],
-					"childItemIds" : [
-					        "value" : caseRefValue,
-							"type" : "caseRef"
-					]
-			])
-		</action>
-	</data>
-	<data type="button">
-		<id>order_up</id>
-		<title/>
-		<placeholder>north</placeholder>
-		<component>
-			<name>icon</name>
-			<property key="stretch">true</property>
-		</component>
-		<action trigger="set">
-			parentId: f.parentId;
-
-			def parentCase = workflowService.findOne(parentId.value[0])
-			def taskId = useCase.tasks.find { it.transition == "row_for_ordering" }.task
-			def taskRefValue = parentCase.dataSet['childItemForms'].value
-			def caseRefValue = parentCase.dataSet['childItemIds'].value
-
-			int idxInTaskRef = taskRefValue.indexOf(taskId)
-			if (idxInTaskRef > 0) {
-				Collections.swap(taskRefValue, idxInTaskRef - 1, idxInTaskRef)
-			} else {
-				return
-			}
-
-			int idxInCaseRef = caseRefValue.indexOf(useCase.stringId)
-			if (idxInCaseRef > 0) {
-				Collections.swap(caseRefValue, idxInCaseRef - 1, idxInCaseRef)
-			} else {
-				return
-			}
-
-			setData("children_order", parentCase, [
-					"childItemForms" : [
-							"value" : taskRefValue,
-							"type" : "taskRef"
-					],
-					"childItemIds" : [
-							"value" : caseRefValue,
-							"type" : "caseRef"
-					]
-			])
-		</action>
-	</data>
-
-	<!-- I18NS -->
-	<i18n locale="sk">
-		<i18nString name="icon_preview">Náhľad ikony</i18nString>
-		<i18nString name="icon_identifier">Identifikátor ikony</i18nString>
-		<i18nString name="icon_identifier_desc">Identifikátor Material ikony. Zoznam ikon s identifikátormi je dostupný online.</i18nString>
-		<i18nString name="allow_roles">Pridaj k povoleným roliam</i18nString>
-		<i18nString name="remove_from_allowed_roles">Odstráň z povolených rolí</i18nString>
-		<i18nString name="ban_roles">Pridaj k zakázaným roliam</i18nString>
-		<i18nString name="remove_from_banned_roles">Odstráň zo zakázaných rolí</i18nString>
-		<i18nString name="available_processes">Vaše procesy</i18nString>
-		<i18nString name="available_processes_desc">Vyberte proces obsahujúci roly ktoré chcete pridať do zoznamu povolených alebo zakázaných rolí.</i18nString>
-		<i18nString name="available_roles">Dostupné roly</i18nString>
-		<i18nString name="create_case_button_title">Názov tlačidla "Nová inštancia"</i18nString>
-		<i18nString name="create_case_button_icon">Identifikátor ikony tlačidla "Nová inštancia"</i18nString>
-		<i18nString name="create_case_button_icon_preview">Náhľad ikony</i18nString>
-		<i18nString name="default_headers">Predvolené hlavičky</i18nString>
-		<i18nString name="default_headers_desc">Napríklad: "meta-title,meta-visualId"</i18nString>
-		<i18nString name="filter_autocomplete_selection">Zvoľte nový filter</i18nString>
-		<i18nString name="move_dest_uri">Cieľové URI</i18nString>
-		<i18nString name="duplicate_new_title">Názov duplikovanej položky</i18nString>
-		<i18nString name="duplicate_view_identifier">Identifikátor duplikovanej položky</i18nString>
-		<i18nString name="duplicate_view_identifier_desc">Musí byť jedinečný</i18nString>
-		<i18nString name="name">Názov položky</i18nString>
-		<i18nString name="name_desc">Bude zobrazený v menu</i18nString>
-		<i18nString name="tab_icon">Identifikátor ikony v karte</i18nString>
-		<i18nString name="tab_icon_identifier_desc">Identifikátor Material ikony. Zoznam ikon s identifikátormi je dostupný online.</i18nString>
-		<i18nString name="display_tab_icon">Zobraziť ikonu v karte?</i18nString>
-		<i18nString name="tab_name">Názov položky</i18nString>
-		<i18nString name="tab_name_desc">Bude zobrazený v karte</i18nString>
-		<i18nString name="update_filter">Aktualizovať zobrazenie s vybraným filtrom</i18nString>
-		<i18nString name="use_custom_view">Použiť vlastné zobrazenie?</i18nString>
-		<i18nString name="custom_view_selector">Konfiguračný identifikátor vlastného zobrazenia</i18nString>
-		<i18nString name="custom_view_selector_desc">Napríklad: "demo-tabbed-views"</i18nString>
-		<i18nString name="case_view_search_type">Typ vyhľadávania prípadov</i18nString>
-		<i18nString name="hidden">Skryté</i18nString>
-		<i18nString name="fulltext">Fulltext</i18nString>
-		<i18nString name="fulltext_advanced">Fulltext a rozšírené</i18nString>
-		<i18nString name="case_require_title_in_creation">Vyžadovať názov inštancii pri vytváraní?</i18nString>
-		<i18nString name="case_banned_nets_in_creation">Zakázané siete pri vytváraní</i18nString>
-		<i18nString name="case_banned_nets_in_creation_desc">Uveďte identifikátory procesov oddelené čiarkou. Napríklad: mynet1,mynet2</i18nString>
-		<i18nString name="show_create_case_button">Zobraziť tlačidlo na vytvorenie prípadu?</i18nString>
-		<i18nString name="case_show_more_menu">Zobrazovať menu pre prípadovú položku?</i18nString>
-		<i18nString name="sort">Zoraďovanie</i18nString>
-		<i18nString name="search">Vyhľadávanie</i18nString>
-		<i18nString name="edit">Upravovanie</i18nString>
-		<i18nString name="merge_filters">Zjednotiť filter so základným filtrom?</i18nString>
-		<i18nString name="task_view_search_type">Typ vyhľadávania úloh</i18nString>
-		<i18nString name="headers_mode">Mód hlavičiek</i18nString>
-		<i18nString name="headers_default_mode">Predvolený mód hlavičiek</i18nString>
-		<i18nString name="is_header_mode_changeable">Môže byť mód hlavičiek zmenený?</i18nString>
-		<i18nString name="allow_header_table_mode">Povoliť tabuľkový mód pre hlavičky?</i18nString>
-		<i18nString name="use_default_headers">Použiť vlastné predvolené hlavičky?</i18nString>
-		<i18nString name="task_default_headers">Predvolené hlavičky</i18nString>
-		<i18nString name="task_default_headers_desc">Napríklad: "meta-title,meta-user"</i18nString>
-		<i18nString name="task_show_more_menu">Zobrazovať menu pre úlohovú položku?</i18nString>
-		<i18nString name="item_settings">Nastavenie položky</i18nString>
-		<i18nString name="roles_management_title">Roly</i18nString>
-		<i18nString name="filter_update_title">Filter</i18nString>
-		<i18nString name="move_item">Presunúť položku</i18nString>
-		<i18nString name="move_item_finish">Presunúť</i18nString>
-		<i18nString name="duplicate_item">Duplikovať položku</i18nString>
-		<i18nString name="duplicate_item_finish">Duplikovať</i18nString>
-		<i18nString name="additional_filter_update">Dodatočný filter</i18nString>
-		<i18nString name="filter_header">Súčasný filter</i18nString>
-		<i18nString name="case_view_header">Zobrazenie prípadov</i18nString>
-		<i18nString name="task_view_header">Zobrazenie úloh</i18nString>
-		<i18nString name="roles_allowed">Povolené roly</i18nString>
-		<i18nString name="roles_allowed_desc">Zoznam povolených rolí, ktoré môžu zobraziť túto položku</i18nString>
-		<i18nString name="roles_banned">Zakázané roly</i18nString>
-		<i18nString name="roles_banned_desc">Zoznam zakázaných rolí, ktoré nemôžu zobraziť túto položku</i18nString>
-		<i18nString name="item_settings_general">Všeobecné</i18nString>
-		<i18nString name="menu_item_identifier">Identifikátor položky</i18nString>
-		<i18nString name="remove_additional_filter">Odstrániť dodatočný filter</i18nString>
-		<i18nString name="nodePath">URI položky</i18nString>
-		<i18nString name="move_dest_uri_new_node">Nový uzol</i18nString>
-		<i18nString name="move_dest_uri_new_node_desc">Uveďte názov uzlu, ktorý chcete pridať</i18nString>
-		<i18nString name="move_dest_uri_desc">Zoznam uzlov reprezentujúce cieľovú URI</i18nString>
-		<i18nString name="move_add_node">Pridať</i18nString>
-	</i18n>
-	<i18n locale="de">
-		<i18nString name="icon_preview">Ikonevorschau</i18nString>
-		<i18nString name="icon_identifier">Ikone ID</i18nString>
-		<i18nString name="icon_identifier_desc">Material Ikone ID. Liste den Ikonen mit IDs ist online verfügbar.</i18nString>
-		<i18nString name="allow_roles">Zu zulässigen Rollen hinzufügen</i18nString>
-		<i18nString name="remove_from_allowed_roles">Aus zulässigen Rollen entfernen</i18nString>
-		<i18nString name="ban_roles">Zu verbotenen Rollen hinzufügen</i18nString>
-		<i18nString name="remove_from_banned_roles">Aus verbotenen Rollen entfernen</i18nString>
-		<i18nString name="available_processes">Ihre Prozesse</i18nString>
-		<i18nString name="available_processes_desc">Wählen Sie einen Prozess mit Rollen aus, die Sie zu Listen mit zulässigen oder verbotenen Rollen hinzufügen möchten.</i18nString>
-		<i18nString name="available_roles">Verfügbare Rollen</i18nString>
-		<i18nString name="create_case_button_title">Schaltflächentitel "Neuer Fall"</i18nString>
-		<i18nString name="create_case_button_icon">Ikone ID</i18nString>
-		<i18nString name="create_case_button_icon_preview">Ikonevorschau</i18nString>
-		<i18nString name="default_headers">Anzuzeigende Attributmenge auswählen</i18nString>
-		<i18nString name="filter_autocomplete_selection">Neue Filter auswählen</i18nString>
-		<i18nString name="default_headers_desc">Beispiel: "meta-title,meta-visualId"</i18nString>
-		<i18nString name="tab_icon_identifier_desc">Material Ikone ID. Liste den Ikonen mit IDs ist online verfügbar.</i18nString>
-		<i18nString name="custom_view_selector_desc">Beispiel: "demo-tabbed-views"</i18nString>
-		<i18nString name="hidden">Versteckt</i18nString>
-		<i18nString name="fulltext">Einfacher Suchmodus</i18nString>
-		<i18nString name="sort">Sortieren</i18nString>
-		<i18nString name="search">Suchen</i18nString>
-		<i18nString name="edit">Bearbeiten</i18nString>
-		<i18nString name="headers_mode">Kopfzeilenmodus</i18nString>
-		<i18nString name="headers_default_mode">Standardkopfzeilenmodus</i18nString>
-		<i18nString name="is_header_mode_changeable">Erlaube Änderung des Kopfzeilenmodus?</i18nString>
-		<i18nString name="allow_header_table_mode">Erlaube Tabellenmodus?</i18nString>
-		<i18nString name="use_default_headers">Eigene Kopfzeilen verwenden?</i18nString>
-		<i18nString name="task_default_headers">Anzuzeigende Attributmenge auswählen</i18nString>
-		<i18nString name="task_default_headers_desc">Beispiel: "meta-title,meta-user"</i18nString>
-		<i18nString name="roles_management_title">Rollen</i18nString>
-		<i18nString name="filter_update_title">Filter</i18nString>
-		<i18nString name="additional_filter_update">Zusätzlicher Filter</i18nString>
-		<i18nString name="filter_header">Aktueller Filter</i18nString>
-		<i18nString name="roles_allowed">Zulässige Rollen</i18nString>
-		<i18nString name="item_settings_general">Allgemein</i18nString>
-		<i18nString name="menu_item_identifier">Identifikationsnummer des Menüeintrages</i18nString>
-		<i18nString name="remove_additional_filter">Zusatzfilter entfernen</i18nString>
-		<i18nString name="nodePath">Menüeintrag-URI</i18nString>
-		<i18nString name="move_dest_uri_new_node">Neuer Knoten</i18nString>
-		<i18nString name="move_add_node">Hinzufügen</i18nString>
-		<i18nString name="move_dest_uri">Ziel URI</i18nString>
-		<i18nString name="duplicate_new_title">Titel der kopierten Ansicht</i18nString>
-		<i18nString name="duplicate_view_identifier">Identifikator der kopierten Ansicht</i18nString>
-		<i18nString name="duplicate_view_identifier_desc">Muss einzigartig sein</i18nString>
-		<i18nString name="name">Titel des Eintrages</i18nString>
-		<i18nString name="name_desc">Wird im Menü angezeigt</i18nString>
-		<i18nString name="tab_icon">Ikonen Identifikator der Registerkarte</i18nString>
-		<i18nString name="display_tab_icon">Zeige die Registerkarte Ikone an?</i18nString>
-		<i18nString name="tab_name">Titel der Registerkarte</i18nString>
-		<i18nString name="tab_name_desc">Wird in der Registerkarte angezeigt</i18nString>
-		<i18nString name="update_filter">Aktualisiere die Ansicht mit dem ausgewählten Filter</i18nString>
-		<i18nString name="use_custom_view">Eigener Ansicht anwenden?</i18nString>
-		<i18nString name="custom_view_selector">Konfigurationsidentifikator der eigenen Ansicht</i18nString>
-		<i18nString name="case_view_search_type">Suchmodus im Fallansicht</i18nString>
-		<i18nString name="fulltext_advanced">Einfacher und erweiterter Suchmodus</i18nString>
-		<i18nString name="case_require_title_in_creation">Erforde den Titel beim erzeugen von Fällen?</i18nString>
-		<i18nString name="case_banned_nets_in_creation">Ausgeschlossene Prozesse</i18nString>
-		<i18nString name="case_banned_nets_in_creation_desc">Trenne die Prozessidentifikatoren mit einer Komma. z.B.: netz1,netz2</i18nString>
-		<i18nString name="show_create_case_button">Schaltfläche „Fall erstellen“ anzeigen?</i18nString>
-		<i18nString name="case_show_more_menu">"Erweiterte Optionen" Taste bei einzelnen Fällen anzeigen</i18nString>
-		<i18nString name="merge_filters">Mit dem Basisfilter kombinieren?</i18nString>
-		<i18nString name="task_view_search_type">Suchmodus im Aufgabenansicht</i18nString>
-		<i18nString name="task_show_more_menu">"Erweiterte Optionen" Taste bei einzelnen Aufgaben anzeigen</i18nString>
-		<i18nString name="item_settings">Menüeintrageinstellungen</i18nString>
-		<i18nString name="move_item">Menüeintrag verschieben</i18nString>
-		<i18nString name="move_item_finish">verschieben</i18nString>
-		<i18nString name="duplicate_item">Menüeintrag duplizieren</i18nString>
-		<i18nString name="duplicate_item_finish">duplizieren</i18nString>
-		<i18nString name="case_view_header">Fallansicht</i18nString>
-		<i18nString name="task_view_header">Aufgabenansicht</i18nString>
-		<i18nString name="roles_allowed_desc">Rollen mit Zugriff auf diesen Menüeintrag</i18nString>
-		<i18nString name="roles_banned">Verbotene Rollen</i18nString>
-		<i18nString name="roles_banned_desc">Rollen, für die wird den Menüeintrag ausgeblendet</i18nString>
-		<i18nString name="move_dest_uri_new_node_desc">Nächste URI-Teil angeben</i18nString>
-		<i18nString name="move_dest_uri_desc">Teile der Ziel URI</i18nString>
-	</i18n>
-
-	<!-- TRANSITIONS -->
-	<transition>
-		<id>initialize</id>
-		<x>340</x>
-		<y>220</y>
-		<label>initialize [await sync]</label>
-		<icon>hourglass_empty</icon>
-		<roleRef>
-			<id>admin</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>view</id>
-			<dataRef>
-				<id>filter_case</id>
-				<logic>
-					<behavior>forbidden</behavior>
-					<action trigger="set">
-						filterCaseRef: f.filter_case,
-						menu_name: f.menu_name;
-
-						if (filterCaseRef.value == null || filterCaseRef.value == []) {
-							return
-						}
-
-						def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
-						if (!menu_name.value) {
-							change menu_name value {return filterCase.dataSet["i18n_filter_name"].value}
-						}
-					</action>
-				</logic>
-			</dataRef>
-		</dataGroup>
-	</transition>
-
-	<transition>
-		<id>item_settings</id>
-		<x>460</x>
-		<y>100</y>
-		<label name="item_settings">Item settings</label>
-		<icon>settings</icon>
-		<assignPolicy>auto</assignPolicy>
-		<roleRef>
-			<id>admin</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>pre_general</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>menu_item_identifier</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>nodePath</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>general_0</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<title name="item_settings_general">General</title>
-			<dataRef>
-				<id>menu_name</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>menu_icon</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>menu_icon_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>tab_name</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>use_tab_icon</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-				</layout>
-				<event type="set">
-					<id>0</id>
-					<actions phase="post">
-						<action>
-							trans: t.this,
-							iconPreview: f.tab_icon_preview,
-							icon: f.tab_icon,
-							useIcon: f.use_tab_icon;
-
-							make iconPreview,visible on trans when { useIcon.value }
-							make icon,editable on trans when { useIcon.value }
-
-							make iconPreview,hidden on trans when { !useIcon.value }
-							make icon,hidden on trans when { !useIcon.value }
-						</action>
-					</actions>
-				</event>
-			</dataRef>
-			<dataRef>
-				<id>tab_icon</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>tab_icon_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>use_custom_view</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>2</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-				<event type="set">
-					<id>0</id>
-					<actions phase="post">
-						<action>
-							trans: t.this,
-							caseHeader: f.case_view_header,
-							caseTaskRef: f.case_view_settings_taskRef,
-							taskHeader: f.task_view_header,
-							taskTaskRef: f.task_view_settings_taskRef,
-
-							useTabIcon: f.use_tab_icon,
-							tabIconPreview: f.tab_icon_preview,
-							tabName: f.tab_name,
-							tabIcon: f.tab_icon,
-							filterSelection: f.filter_autocomplete_selection,
-							updateFilter: f.update_filter,
-							selectedFilterPreview: f.selected_filter_preview,
-							currentFilterHeader: f.filter_header,
-							currentFilterPreview: f.current_filter_preview,
-
-							use: f.use_custom_view,
-							selector: f.custom_view_selector;
-
-							make selector,editable on trans when { use.value }
-							make selector,visible on trans when { !use.value }
-
-							make caseHeader,visible on trans when { !use.value }
-							make caseHeader,hidden on trans when { use.value }
-							make caseTaskRef,editable on trans when { !use.value }
-							make caseTaskRef,hidden on trans when { use.value }
-
-							make taskHeader,visible on trans when { !use.value }
-							make taskHeader,hidden on trans when { use.value }
-							make taskTaskRef,editable on trans when { !use.value }
-							make taskTaskRef,hidden on trans when { use.value }
-
-							make useTabIcon,editable on trans when { !use.value }
-							make useTabIcon,hidden on trans when { use.value }
-							make tabIconPreview,visible on trans when { !use.value }
-							make tabIconPreview,hidden on trans when { use.value }
-							make tabName,editable on trans when { !use.value }
-							make tabName,hidden on trans when { use.value }
-							make tabIcon,editable on trans when { !use.value }
-							make tabIcon,hidden on trans when { use.value }
-							make filterSelection,editable on trans when { !use.value }
-							make filterSelection,hidden on trans when { use.value }
-							make updateFilter,visible on trans when { !use.value }
-							make updateFilter,hidden on trans when { use.value }
-							make selectedFilterPreview,visible on trans when { !use.value }
-							make selectedFilterPreview,hidden on trans when { use.value }
-							make currentFilterHeader,visible on trans when { !use.value }
-							make currentFilterHeader,hidden on trans when { use.value }
-							make currentFilterPreview,visible on trans when { !use.value }
-							make currentFilterPreview,hidden on trans when { use.value }
-						</action>
-					</actions>
-				</event>
-			</dataRef>
-			<dataRef>
-				<id>custom_view_selector</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>2</y>
-					<rows>1</rows>
-					<cols>3</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>roles_management</id>
-			<cols>5</cols>
-			<layout>grid</layout>
-			<title name="roles_management_title">Roles</title>
-			<dataRef>
-				<id>processes_available</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>2</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>roles_available</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>0</y>
-					<rows>2</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>add_allowed_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>allowed_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>remove_allowed_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>4</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>add_banned_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>banned_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>remove_banned_roles</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>4</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>filter_update</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<title name="filter_update_title">Filter</title>
-			<dataRef>
-				<id>filter_autocomplete_selection</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>3</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>update_filter</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>selected_filter_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>current_filter</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>filter_header</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>current_filter_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>case_view_settings_dataGroup</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>case_view_header</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_view_settings_taskRef</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>task_view_settings_dataGroup</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>task_view_header</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_view_settings_taskRef</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-	</transition>
-
-	<transition>
-		<id>move_item</id>
-		<x>580</x>
-		<y>100</y>
-		<label name="move_item">Move item</label>
-		<icon>move_down</icon>
-		<assignPolicy>auto</assignPolicy>
-		<roleRef>
-			<id>admin</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>move</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>move_dest_uri</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>move_dest_uri_new_node</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>move_add_node</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<event type="finish">
-			<id>finish</id>
-			<actions phase="pre">
-				<action>
-					dest: f.move_dest_uri;
-
-					if (dest.value == null || dest.value == []) {
-						throw new IllegalArgumentException("URI must not be empty!")
-					}
-
-					String newUri = dest.value.join("/")
-					newUri = newUri.replace("//","/")
-
-					changeMenuItem useCase uri { newUri }
-				</action>
-			</actions>
-			<title name="move_item_finish">Move</title>
-		</event>
-	</transition>
-
-	<transition>
-		<id>duplicate_item</id>
-		<x>580</x>
-		<y>340</y>
-		<label name="duplicate_item">Duplicate item</label>
-		<icon>content_copy</icon>
-		<assignPolicy>auto</assignPolicy>
-		<roleRef>
-			<id>admin</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>duplicate</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>duplicate_new_title</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>duplicate_view_identifier</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<event type="finish">
-			<id>finish</id>
-			<actions phase="pre">
-				<action>
-					identifier: f.duplicate_view_identifier,
-					title: f.duplicate_new_title;
-
-					duplicateMenuItem(useCase, title.value, identifier.value)
-				</action>
-			</actions>
-			<title name="duplicate_item_finish">Duplicate</title>
-		</event>
-	</transition>
-
-	<transition>
-		<id>change_filter</id>
-		<x>460</x>
-		<y>340</y>
-		<label>[Change filter]</label>
-		<roleRef>
-			<id>system</id>
-			<logic>
-				<perform>true</perform>
-			</logic>
-		</roleRef>
-		<dataRef>
-			<id>new_filter_id</id>
-			<logic>
-				<behavior>editable</behavior>
-				<behavior>required</behavior>
-			</logic>
-			<event type="set">
-				<id>set_event_0</id>
-				<actions phase="post">
-					<action>
-						new_filter_id: f.new_filter_id,
-						filterTaskRef: f.current_filter_preview,
-						filterCaseRef: f.filter_case;
-
-						change filterCaseRef value { [new_filter_id.value] }
-						def filterCase = findCase({it._id.eq(new com.netgrif.application.engine.objects.workflow.domain.ProcessResourceId(filterCaseRef.value[0]))})
-						change filterTaskRef value {return [findTask({it.caseId.eq(filterCase.stringId).and(it.transitionId.eq("view_filter"))}).stringId]}
-					</action>
-				</actions>
-			</event>
-		</dataRef>
-	</transition>
-
-	<transition>
-		<id>case_view_settings</id>
-		<x>340</x>
-		<y>100</y>
-		<label>Case view settings [referenced]</label>
-		<roleRef>
-			<id>system</id>
-			<logic>
-				<perform>true</perform>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>case_view_dataGroup</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>case_view_search_type</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>show_create_case_button</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_show_more_menu</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>create_case_button_title</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>create_case_button_icon</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>create_case_button_icon_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_require_title_in_creation</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_banned_nets_in_creation</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>2</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>case_view_headers</id>
-			<cols>5</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>case_is_header_mode_changeable</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-					<action trigger="set">
-						trans: t.this,
-						isChangeable: f.case_is_header_mode_changeable,
-						mode: f.case_headers_mode,
-						defaultMode: f.case_headers_default_mode;
-
-						make mode,editable on trans when { isChangeable.value }
-						make mode,required on trans when { isChangeable.value }
-						make defaultMode,editable on trans when { isChangeable.value }
-						make defaultMode,required on trans when { isChangeable.value }
-
-						make mode,hidden on trans when { !isChangeable.value }
-						make mode,optional on trans when { !isChangeable.value }
-						make defaultMode,hidden on trans when { !isChangeable.value }
-						make defaultMode,optional on trans when { !isChangeable.value }
-					</action>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_allow_header_table_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_headers_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_headers_default_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>4</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>use_case_default_headers</id>
-				<logic>
-					<behavior>editable</behavior>
-					<action trigger="set">
-						trans: t.this,
-						use: f.use_case_default_headers,
-						headers: f.case_default_headers;
-
-						make headers,editable on trans when { use.value }
-						make headers,visible on trans when { !use.value }
-					</action>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>case_default_headers</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-	</transition>
-
-	<transition>
-		<id>task_view_settings</id>
-		<x>340</x>
-		<y>340</y>
-		<label>Task view settings [referenced]</label>
-		<roleRef>
-			<id>system</id>
-			<logic>
-				<perform>true</perform>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>task_view_dataGroup</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>task_view_search_type</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>3</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_show_more_menu</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>task_view_headers</id>
-			<cols>5</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>task_is_header_mode_changeable</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-					<action trigger="set">
-						trans: t.this,
-						isChangeable: f.task_is_header_mode_changeable,
-						mode: f.task_headers_mode,
-						defaultMode: f.task_headers_default_mode;
-
-						make mode,editable on trans when { isChangeable.value }
-						make mode,required on trans when { isChangeable.value }
-						make defaultMode,editable on trans when { isChangeable.value }
-						make defaultMode,required on trans when { isChangeable.value }
-
-						make mode,hidden on trans when { !isChangeable.value }
-						make mode,optional on trans when { !isChangeable.value }
-						make defaultMode,hidden on trans when { !isChangeable.value }
-						make defaultMode,optional on trans when { !isChangeable.value }
-					</action>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_allow_header_table_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_headers_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_headers_default_mode</id>
-				<logic>
-					<behavior>editable</behavior>
-					<behavior>required</behavior>
-				</logic>
-				<layout>
-					<x>4</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>use_task_default_headers</id>
-				<logic>
-					<behavior>editable</behavior>
-					<action trigger="set">
-						trans: t.this,
-						use: f.use_task_default_headers,
-						headers: f.task_default_headers;
-
-						make headers,editable on trans when { use.value }
-						make headers,visible on trans when { !use.value }
-					</action>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>task_default_headers</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<offset>0</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>additional_filter_update</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<title name="additional_filter_update">Additional filter</title>
-			<dataRef>
-				<id>additional_filter_autocomplete_selection</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>3</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>update_additional_filter</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>3</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>selected_additional_filter_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<dataGroup>
-			<id>current_additional_filter</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>filter_header</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>current_additional_filter_preview</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>1</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>merge_filters</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>2</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>remove_additional_filter</id>
-				<logic>
-					<behavior>hidden</behavior>
-				</logic>
-				<layout>
-					<x>1</x>
-					<y>2</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<template>material</template>
-					<appearance>standard</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-	</transition>
-	<transition>
-		<id>children_order</id>
-		<x>580</x>
-		<y>220</y>
-		<label>Manage item order</label>
-		<icon>low_priority</icon>
-		<assignPolicy>auto</assignPolicy>
-		<roleRef>
-			<id>admin</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>children_order_0</id>
-			<cols>4</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>childItemForms</id>
-				<logic>
-					<behavior>editable</behavior>
-					<action trigger="get">
-						forms: f.childItemForms,
-						ids: f.childItemIds;
-
-						def orderedTaskIds = ids.value?.collect { id -> workflowService.findOne(id).tasks.find { it.transition == "row_for_ordering" }.task }
-						change forms value { orderedTaskIds }
-					</action>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>4</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-	</transition>
-	<transition>
-		<id>row_for_ordering</id>
-		<x>741</x>
-		<y>219</y>
-		<label>Row for ordering [referenced]</label>
-		<roleRef>
-			<id>system</id>
-			<logic>
-				<perform>true</perform>
-				<view>true</view>
-				<cancel>true</cancel>
-				<assign>true</assign>
-			</logic>
-		</roleRef>
-		<dataGroup>
-			<id>row_for_ordering_0</id>
-			<cols>6</cols>
-			<layout>grid</layout>
-			<dataRef>
-				<id>menu_item_identifier</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>0</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>menu_name_as_visible</id>
-				<logic>
-					<behavior>visible</behavior>
-				</logic>
-				<layout>
-					<x>2</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>2</cols>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>order_down</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>4</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>1</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-			<dataRef>
-				<id>order_up</id>
-				<logic>
-					<behavior>editable</behavior>
-				</logic>
-				<layout>
-					<x>5</x>
-					<y>0</y>
-					<rows>1</rows>
-					<cols>1</cols>
-					<offset>1</offset>
-					<template>material</template>
-					<appearance>outline</appearance>
-				</layout>
-			</dataRef>
-		</dataGroup>
-		<event type="finish">
-			<id>finish</id>
-			<title></title>
-		</event>
-		<event type="delegate">
-			<id>delegate</id>
-			<title></title>
-		</event>
-	</transition>
-
-	<!-- PLACES-->
-	<place>
-		<id>uninitialized</id>
-		<x>220</x>
-		<y>220</y>
-		<label>uninitialized</label>
-		<tokens>1</tokens>
-		<static>false</static>
-	</place>
-	<place>
-		<id>initialized</id>
-		<x>460</x>
-		<y>220</y>
-		<label>initialized</label>
-		<tokens>0</tokens>
-		<static>false</static>
-	</place>
-
-	<!-- ARCS-->
-	<arc>
-		<id>a1</id>
-		<type>regular</type>
-		<sourceId>uninitialized</sourceId>
-		<destinationId>initialize</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a7</id>
-		<type>read</type>
-		<sourceId>initialized</sourceId>
-		<destinationId>item_settings</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a8</id>
-		<type>regular</type>
-		<sourceId>initialize</sourceId>
-		<destinationId>initialized</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a9</id>
-		<type>read</type>
-		<sourceId>initialized</sourceId>
-		<destinationId>move_item</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a10</id>
-		<type>read</type>
-		<sourceId>initialized</sourceId>
-		<destinationId>duplicate_item</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a12</id>
-		<type>read</type>
-		<sourceId>initialized</sourceId>
-		<destinationId>change_filter</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-	<arc>
-		<id>a13</id>
-		<type>read</type>
-		<sourceId>initialized</sourceId>
-		<destinationId>children_order</destinationId>
-		<multiplicity>1</multiplicity>
-	</arc>
-</document>
diff --git a/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy b/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy
index 822233d1664..d9280989a29 100644
--- a/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy
+++ b/application-engine/src/test/groovy/com/netgrif/application/engine/action/MenuItemApiTest.groovy
@@ -1,6 +1,5 @@
 package com.netgrif.application.engine.action
 
-
 import com.netgrif.application.engine.TestHelper
 import com.netgrif.application.engine.auth.service.GroupService
 import com.netgrif.application.engine.auth.service.UserService
@@ -8,7 +7,13 @@ import com.netgrif.application.engine.elastic.service.interfaces.IElasticCaseSer
 import com.netgrif.application.engine.elastic.web.requestbodies.CaseSearchRequest
 import com.netgrif.application.engine.objects.auth.domain.ActorTransformer
 import com.netgrif.application.engine.objects.petrinet.domain.I18nString
+import com.netgrif.application.engine.objects.petrinet.domain.UriContentType
+import com.netgrif.application.engine.objects.petrinet.domain.UriNode
+import com.netgrif.application.engine.objects.utils.MenuItemUtils
 import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemConstants
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.TabbedCaseViewConstants
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.TabbedTaskViewConstants
 import com.netgrif.application.engine.startup.runner.FilterRunner
 import com.netgrif.application.engine.startup.ImportHelper
 import com.netgrif.application.engine.objects.workflow.domain.Case
@@ -17,7 +22,6 @@ import com.netgrif.application.engine.workflow.service.interfaces.IDataService
 import com.netgrif.application.engine.workflow.service.interfaces.ITaskService
 import com.netgrif.application.engine.workflow.service.interfaces.IWorkflowService
 import org.junit.jupiter.api.BeforeEach
-import org.junit.jupiter.api.Disabled
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.extension.ExtendWith
 import org.springframework.beans.factory.annotation.Autowired
@@ -30,7 +34,6 @@ import org.springframework.test.context.junit.jupiter.SpringExtension
 
 import static org.junit.jupiter.api.Assertions.assertThrows
 
-@Disabled
 @SpringBootTest
 @ActiveProfiles(["test"])
 @ExtendWith(SpringExtension.class)
@@ -76,39 +79,58 @@ class MenuItemApiTest {
         Case filter = getFilter(caze)
 
         Thread.sleep(4000)
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_ICON.attributeId].value == "device_hub"
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME.attributeId].value == new I18nString("FILTER")
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER.attributeId].value.toString() == "new_menu_item"
-        assert (item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_FILTER_CASE.attributeId].value as List)[0] == filter.stringId
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_ALLOWED_ROLES.attributeId].options.containsKey("role_1:filter_api_test")
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_BANNED_ROLES.attributeId].options.containsKey("role_2:filter_api_test")
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_DEFAULT_HEADERS.attributeId].value == "meta-title,meta-title"
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_DEFAULT_HEADERS.attributeId].value == "meta-title,meta-title"
+        assert item.dataSet[MenuItemConstants.FIELD_MENU_ICON].value == "device_hub"
+        assert item.dataSet[MenuItemConstants.FIELD_MENU_NAME].value == new I18nString("FILTER")
+        assert item.dataSet[MenuItemConstants.FIELD_IDENTIFIER].value.toString() == "new_menu_item"
+        assert item.dataSet[MenuItemConstants.FIELD_BANNED_ROLES].options.containsKey("role_2:filter_api_test")
+        assert item.dataSet[MenuItemConstants.FIELD_ALLOWED_ROLES].options.containsKey("role_1:filter_api_test")
+        assert item.dataSet[MenuItemConstants.FIELD_USE_TABBED_VIEW].value == true
+        assert item.dataSet[MenuItemConstants.FIELD_VIEW_CONFIGURATION_TYPE].value == MenuItemView.TABBED_CASE_VIEW.identifier
 
         assert filter.dataSet["filter"].filterMetadata["filterType"] == "Case"
-        assert filter.dataSet["filter"].allowedNets == ["filter", "preference_item"]
-        assert filter.dataSet["filter"].value == "processIdentifier:filter OR processIdentifier:preference_item"
+        assert filter.dataSet["filter"].allowedNets == ["filter", "menu_item"]
+        assert filter.dataSet["filter"].value == "processIdentifier:filter OR processIdentifier:menu_item"
         assert filter.dataSet["filter_type"].value == "Case"
 
-        Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue.keyword:\"/netgrif/test\"", PageRequest.of(0, 1))[0]
-        Case netgrifFolder = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue.keyword:\"/netgrif\"", PageRequest.of(0, 1))[0]
-
-        Case rootFolder = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue.keyword:\"/\"", PageRequest.of(0, 1))[0]
-
-
-        assert testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value == [netgrifFolder.stringId]
-        assert (testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(item.stringId)
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value == [testFolder.stringId]
-        assert netgrifFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value == [rootFolder.stringId]
-        assert (netgrifFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(testFolder.stringId)
-        assert rootFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value == []
-        assert (rootFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(netgrifFolder.stringId)
+        String tabbedCaseViewId = MenuItemUtils.getCaseIdFromCaseRef(item, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedCaseViewId != null
+        Case tabbedCaseView = workflowService.findOne(tabbedCaseViewId)
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_VIEW_CONTAINS_FILTER].value == true
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_VIEW_FILTER_CASE].value[0] == filter.stringId
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_DEFAULT_HEADERS].value == "meta-title,meta-title"
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_CONFIGURATION_TYPE].value == MenuItemView.TABBED_TASK_VIEW.identifier
+
+        String tabbedTaskViewId = MenuItemUtils.getCaseIdFromCaseRef(tabbedCaseView, TabbedCaseViewConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedTaskViewId != null
+        Case tabbedTaskView = workflowService.findOne(tabbedTaskViewId)
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_VIEW_CONTAINS_FILTER].value == false
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_VIEW_FILTER_CASE].value == []
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_DEFAULT_HEADERS].value == "meta-title,meta-title"
+
+        Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif/test\"", PageRequest.of(0, 1))[0]
+        Case netgrifFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/netgrif\"", PageRequest.of(0, 1))[0]
+        Case rootFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue.keyword:\"/\"", PageRequest.of(0, 1))[0]
+
+        assert testFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [netgrifFolder.stringId]
+        assert (testFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(item.stringId)
+        assert item.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [testFolder.stringId]
+        assert netgrifFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [rootFolder.stringId]
+        assert (netgrifFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(testFolder.stringId)
+        assert rootFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == []
+        assert (rootFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(netgrifFolder.stringId)
     }
 
     @Test
     void testChangeFilterAndMenuItems() {
         Case caze = createMenuItem()
         Thread.sleep(3000)
+
+        Case item = getMenuItem(caze)
+        String tabbedCaseViewIdBeforeChange = MenuItemUtils.getCaseIdFromCaseRef(item, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID)
+        Case tabbedCaseViewBeforeChange = workflowService.findOne(tabbedCaseViewIdBeforeChange)
+        String tabbedTaskViewIdBeforeChange = MenuItemUtils.getCaseIdFromCaseRef(tabbedCaseViewBeforeChange, TabbedCaseViewConstants.FIELD_VIEW_CONFIGURATION_ID)
+
+//        def newUri = uriService.getOrCreate("/netgrif/test_new", UriContentType.DEFAULT)
         caze = setData(caze, [
                 "uri": "/netgrif/test_new",
                 "title": "CHANGED FILTER",
@@ -118,17 +140,33 @@ class MenuItemApiTest {
                 "icon": "",
                 "change_filter_and_menu": "0"
         ])
-        Case item = getMenuItem(caze)
+        item = getMenuItem(caze)
         Case filter = getFilter(caze)
 
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME.attributeId].value.toString() == "CHANGED FILTER"
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_ALLOWED_ROLES.attributeId].options.entrySet()[0].key.contains("role_2")
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_DEFAULT_HEADERS.attributeId].value == "meta-title,meta-title,meta-title"
-        assert item.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_DEFAULT_HEADERS.attributeId].value == "meta-title,meta-title,meta-title"
+        assert item.dataSet[MenuItemConstants.FIELD_MENU_NAME].value.toString() == "CHANGED FILTER"
+        assert item.dataSet[MenuItemConstants.FIELD_ALLOWED_ROLES].options.entrySet()[0].key.contains("role_2")
+        assert item.dataSet[MenuItemConstants.FIELD_USE_TABBED_VIEW].value == true
+        assert item.dataSet[MenuItemConstants.FIELD_VIEW_CONFIGURATION_TYPE].value == MenuItemView.TABBED_CASE_VIEW.identifier
+//        assert item.uriNodeId == newUri.stringId
 
         assert filter.dataSet["filter"].allowedNets == ["filter"]
         assert filter.dataSet["filter"].filterMetadata["defaultSearchCategories"] == false
         assert filter.dataSet["filter"].value == "processIdentifier:filter"
+
+        String tabbedCaseViewId = MenuItemUtils.getCaseIdFromCaseRef(item, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedCaseViewId != null && tabbedCaseViewId.equals(tabbedCaseViewIdBeforeChange)
+        Case tabbedCaseView = workflowService.findOne(tabbedCaseViewId)
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_VIEW_CONTAINS_FILTER].value == true
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_VIEW_FILTER_CASE].value[0] == filter.stringId
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_DEFAULT_HEADERS].value == "meta-title,meta-title,meta-title"
+        assert tabbedCaseView.dataSet[TabbedCaseViewConstants.FIELD_CONFIGURATION_TYPE].value == MenuItemView.TABBED_TASK_VIEW.identifier
+
+        String tabbedTaskViewId = MenuItemUtils.getCaseIdFromCaseRef(tabbedCaseView, TabbedCaseViewConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedTaskViewId != null && tabbedTaskViewId.equals(tabbedTaskViewIdBeforeChange)
+        Case tabbedTaskView = workflowService.findOne(tabbedTaskViewId)
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_VIEW_CONTAINS_FILTER].value == false
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_VIEW_FILTER_CASE].value == []
+        assert tabbedTaskView.dataSet[TabbedTaskViewConstants.FIELD_DEFAULT_HEADERS].value == "meta-title,meta-title,meta-title"
     }
 
     @Test
@@ -150,7 +188,6 @@ class MenuItemApiTest {
         apiCase = createMenuItem("/netgrif2/test2", "new_menu_item2")
         String viewId2 = apiCase.dataSet["menu_stringId"].value
 
-
         // move view
         Thread.sleep(2000)
         apiCase = setData(apiCase, [
@@ -163,12 +200,11 @@ class MenuItemApiTest {
         Case viewCase = workflowService.findOne(viewId)
         Thread.sleep(2000)
 
-        Case folderCase = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue:\"/netgrif2\"", PageRequest.of(0, 1))[0]
+        Case folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif2\"", PageRequest.of(0, 1))[0]
 
-        ArrayList<String> childIds = folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList<String>
+        ArrayList<String> childIds = folderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList<String>
         assert childIds.contains(viewId) && childIds.size() == 2
 
-
         // cyclic move
         assertThrows(IllegalArgumentException.class, () -> {
             setData(apiCase, [
@@ -179,7 +215,6 @@ class MenuItemApiTest {
             ])
         })
 
-
         // move folder
         setData(apiCase, [
             "move_dest_uri": "/netgrif/test3",
@@ -189,19 +224,19 @@ class MenuItemApiTest {
         ])
         Thread.sleep(2000)
 
-        folderCase = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue:\"/netgrif/test3\"", PageRequest.of(0, 1))[0]
-        Case folderCase2 = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue:\"/netgrif\"", PageRequest.of(0, 1))[0]
-        assert folderCase != null && folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value == [folderCase2.stringId]
+        folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3\"", PageRequest.of(0, 1))[0]
+        Case folderCase2 = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif\"", PageRequest.of(0, 1))[0]
+        assert folderCase != null && folderCase.dataSet[MenuItemConstants.FIELD_PARENT_ID].value == [folderCase2.stringId]
 
-        folderCase = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue:\"/netgrif/test3/netgrif2\"", PageRequest.of(0, 1))[0]
+        folderCase = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test3/netgrif2\"", PageRequest.of(0, 1))[0]
         assert folderCase != null
-        assert folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId].value == "/netgrif/test3/netgrif2"
+        assert folderCase.dataSet[MenuItemConstants.FIELD_NODE_PATH].value == "/netgrif/test3/netgrif2"
 
-        childIds = folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList<String>
+        childIds = folderCase.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList<String>
         assert childIds.size() == 2
 
         folderCase = workflowService.findOne(childIds[0])
-        assert folderCase.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId].value == "/netgrif/test3/netgrif2/test2"
+        assert folderCase.dataSet[MenuItemConstants.FIELD_NODE_PATH].value == "/netgrif/test3/netgrif2/test2"
 
         viewCase = workflowService.findOne(viewId2)
     }
@@ -210,9 +245,11 @@ class MenuItemApiTest {
     void testDuplicateMenuItem() {
         String starterUri = "/netgrif/test"
         Case apiCase = createMenuItem(starterUri, "new_menu_item")
+        Thread.sleep(2000)
+
         String itemId = apiCase.dataSet["menu_stringId"].value
         Case origin = workflowService.findOne(itemId)
-        Case testFolder = workflowService.findOne((origin.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value as ArrayList<String>)[0])
+        Case testFolder = workflowService.findOne((origin.dataSet[MenuItemConstants.FIELD_PARENT_ID].value as ArrayList<String>)[0])
 
         String newTitle = "New title"
         String newIdentifier = "new_identifier"
@@ -221,36 +258,37 @@ class MenuItemApiTest {
         taskService.assignTask(duplicateTaskId)
 
         assertThrows(IllegalArgumentException.class, () -> {
-            testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString("")
-            testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = newIdentifier
+            testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_TITLE].value = new I18nString("")
+            testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_IDENTIFIER].value = newIdentifier
             testFolder = workflowService.save(testFolder)
             taskService.finishTask(duplicateTaskId)
         })
 
         assertThrows(IllegalArgumentException.class, () -> {
-            testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString(newTitle)
-            testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = "new_menu_item"
+            testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_TITLE].value = new I18nString(newTitle)
+            testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_IDENTIFIER].value = "new_menu_item"
             testFolder = workflowService.save(testFolder)
             taskService.finishTask(duplicateTaskId)
         })
 
-        testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value = new I18nString(newTitle)
-        testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value = newIdentifier
+        testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_TITLE].value = new I18nString(newTitle)
+        testFolder.dataSet[MenuItemConstants.FIELD_DUPLICATE_IDENTIFIER].value = newIdentifier
         testFolder = workflowService.save(testFolder)
         taskService.finishTask(duplicateTaskId)
 
-        Case duplicated = workflowService.searchOne(QCase.case$.processIdentifier.eq("preference_item").and(QCase.case$.dataSet.get(MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER.attributeId).value.eq(newIdentifier)))
+        Case duplicated = workflowService.searchOne(QCase.case$.processIdentifier.eq("menu_item")
+                .and(QCase.case$.dataSet.get(MenuItemConstants.FIELD_IDENTIFIER).value.eq(newIdentifier)))
         assert duplicated != null
 
 
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE.attributeId].value == null
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER.attributeId].value == null
+        assert duplicated.dataSet[MenuItemConstants.FIELD_DUPLICATE_TITLE].value == new I18nString("")
+        assert duplicated.dataSet[MenuItemConstants.FIELD_DUPLICATE_IDENTIFIER].value == ""
         assert duplicated.title == newTitle
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME.attributeId].value == new I18nString(newTitle)
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER.attributeId].value == newIdentifier
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId].value == "/netgrif/" + newIdentifier
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value == []
-        assert duplicated.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_HAS_CHILDREN.attributeId].value == false
+        assert duplicated.dataSet[MenuItemConstants.FIELD_MENU_NAME].value == new I18nString(newTitle)
+        assert duplicated.dataSet[MenuItemConstants.FIELD_IDENTIFIER].value == newIdentifier
+        assert duplicated.dataSet[MenuItemConstants.FIELD_NODE_PATH].value == "/netgrif/" + newIdentifier
+        assert duplicated.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value == []
+        assert duplicated.dataSet[MenuItemConstants.FIELD_HAS_CHILDREN].value == false
         assert duplicated.activePlaces["initialized"] == 1
     }
 
@@ -266,8 +304,8 @@ class MenuItemApiTest {
         caze = setData(caze, [
                 "uri": uri,
                 "title": "FILTER",
-                "allowed_nets": "filter,preference_item",
-                "query": "processIdentifier:filter OR processIdentifier:preference_item",
+                "allowed_nets": "filter,menu_item",
+                "query": "processIdentifier:filter OR processIdentifier:menu_item",
                 "type": "Case",
                 "identifier": identifier,
                 "icon": "device_hub",
@@ -280,25 +318,37 @@ class MenuItemApiTest {
     void testRemoveMenuItem() {
         String starterUri = "/netgrif/test"
         Case apiCase = createMenuItem(starterUri, "new_menu_item")
-        String leafItemId = apiCase.dataSet["menu_stringId"].value
+        Case leafItemCase = getMenuItem(apiCase)
 
-        Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.PREFERRED_ITEM_NET_IDENTIFIER AND dataSet.${MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH.attributeId}.textValue:\"/netgrif/test\"", PageRequest.of(0, 1))[0]
-        String netgrifFolderId = (testFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID.attributeId].value as ArrayList<String>)[0]
+        sleep(2000)
+        Case testFolder = findCasesElastic("processIdentifier:$FilterRunner.MENU_NET_IDENTIFIER AND dataSet.${MenuItemConstants.FIELD_NODE_PATH}.textValue:\"/netgrif/test\"", PageRequest.of(0, 1))[0]
+        String netgrifFolderId = (testFolder.dataSet[MenuItemConstants.FIELD_PARENT_ID].value as ArrayList<String>)[0]
 
         Case netgrifFolder = workflowService.findOne(netgrifFolderId)
-        assert (netgrifFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(testFolder.stringId)
+        assert (netgrifFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(testFolder.stringId)
         assert workflowService.findOne(testFolder.stringId) != null
-        assert workflowService.findOne(leafItemId) != null
+        assert workflowService.findOne(leafItemCase.stringId) != null
+        String tabbedCaseViewId = MenuItemUtils.getCaseIdFromCaseRef(leafItemCase, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedCaseViewId != null
+        Case tabbedCaseView = workflowService.findOne(tabbedCaseViewId)
+        String tabbedTaskViewId = MenuItemUtils.getCaseIdFromCaseRef(tabbedCaseView, TabbedCaseViewConstants.FIELD_VIEW_CONFIGURATION_ID)
+        assert tabbedTaskViewId != null
 
         workflowService.deleteCase(testFolder)
         sleep(2000)
         netgrifFolder = workflowService.findOne(netgrifFolderId)
-        assert !(netgrifFolder.dataSet[MenuItemConstants.PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS.attributeId].value as ArrayList).contains(testFolder.stringId)
+        assert !(netgrifFolder.dataSet[MenuItemConstants.FIELD_CHILD_ITEM_IDS].value as ArrayList).contains(testFolder.stringId)
         assertThrows(IllegalArgumentException.class, () -> {
             workflowService.findOne(testFolder.stringId)
         })
         assertThrows(IllegalArgumentException.class, () -> {
-            workflowService.findOne(leafItemId)
+            workflowService.findOne(leafItemCase.stringId)
+        })
+        assertThrows(IllegalArgumentException.class, () -> {
+            workflowService.findOne(tabbedCaseViewId)
+        })
+        assertThrows(IllegalArgumentException.class, () -> {
+            workflowService.findOne(tabbedTaskViewId)
         })
     }
 
diff --git a/application-engine/src/test/resources/dashboard_management_test.xml b/application-engine/src/test/resources/dashboard_management_test.xml
new file mode 100644
index 00000000000..d3f1ae15906
--- /dev/null
+++ b/application-engine/src/test/resources/dashboard_management_test.xml
@@ -0,0 +1,55 @@
+<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://petriflow.com/petriflow.schema.xsd">
+    <id>dashboard_import</id>
+    <initials>MEI</initials>
+    <title>Dashboard import</title>
+    <icon>device_hub</icon>
+    <defaultRole>true</defaultRole>
+    <anonymousRole>true</anonymousRole>
+    <transitionRole>false</transitionRole>
+    <processEvents>
+        <event type="upload">
+            <id>new_model_upload</id>
+            <actions phase="post">
+                <action id="1">
+					<![CDATA[
+                    def filterBody = new com.netgrif.application.engine.menu.domain.FilterBody()
+                    filterBody.setTitle(new com.netgrif.application.engine.petrinet.domain.I18nString("Main"))
+                    filterBody.setQuery("_exists_:processIdentifier")
+                    filterBody.setType("Case")
+                    filterBody.setAllowedNets([])
+                    filterBody.setIcon("apps")
+                    filterBody.setVisibility("private")
+                    filterBody.setMetadata([:])
+
+                    def menuItemBody = new com.netgrif.application.engine.menu.domain.MenuItemBody(
+                            "/",
+                            "main",
+                            filterBody.getTitle(),
+                            filterBody.getIcon()
+                    )
+                    def singleTaskViewBody = new com.netgrif.application.engine.menu.domain.configurations.TabbedSingleTaskViewBody()
+                    def ticketViewBody = new com.netgrif.application.engine.menu.domain.configurations.TabbedTicketViewBody()
+                    ticketViewBody.setChainedView(singleTaskViewBody)
+                    menuItemBody.setAutoSelect(true)
+                    menuItemBody.setView(ticketViewBody)
+
+                    def menuItem = createOrIgnoreMenuItem(menuItemBody)
+
+                    def dashboardItemBody = new com.netgrif.application.engine.menu.domain.dashboard.DashboardItemBody("main", menuItem.stringId, "apps", new com.netgrif.application.engine.petrinet.domain.I18nString("Main"), true)
+                    dashboardItemBody.setMenuItems(menuItem.stringId)
+                    dashboardItemBody.setActive(true)
+
+                    def dashboardItem = createDashboardItem(dashboardItemBody)
+
+                    def mainDashboardCase = findDashboardManagement("main_dashboard")
+
+                    def dashboardManagementBody = new com.netgrif.application.engine.menu.domain.dashboard.DashboardManagementBody()
+                    dashboardManagementBody.setDashboardItems([(dashboardItem.stringId): dashboardItem.title])
+
+                    updateDashboardManagement(mainDashboardCase, dashboardManagementBody)
+                    ]]>
+				</action>
+            </actions>
+        </event>
+    </processEvents>
+</document>
\ No newline at end of file
diff --git a/application-engine/src/test/resources/petriNets/filter_api_test.xml b/application-engine/src/test/resources/petriNets/filter_api_test.xml
index 5bb13019442..37767079d60 100644
--- a/application-engine/src/test/resources/petriNets/filter_api_test.xml
+++ b/application-engine/src/test/resources/petriNets/filter_api_test.xml
@@ -107,31 +107,19 @@
 					title: f.title,
 					allowed_nets: f.allowed_nets,
 					query: f.query,
-					group: f.group,
 					identifier: f.identifier,
 					icon: f.icon;
 
-					def item = findMenuItem(identifier.value)
-					def filter = getFilterFromMenuItem(item)
-
-					changeFilter filter query { query.value }
-					changeFilter filter allowedNets { allowed_nets.value.split(",") as List }
-					changeFilter filter icon { icon.value }
-					changeFilter filter title { title.value }
-					changeFilter filter filterMetadata { [
+					def metadata = [
 							"searchCategories"       : [],
 							"predicateMetadata"      : [],
 							"filterType"             : type,
 							"defaultSearchCategories": false,
 							"inheritAllowedNets"     : false
-					] }
-
-					changeMenuItem item filter { filter }
-					changeMenuItem item allowedRoles { ["role_2": "filter_api_test"] }
-					changeMenuItem item uri { uri.value }
-					changeMenuItem item title { title.value }
-					changeMenuItem item caseDefaultHeaders { "meta-title,meta-title,meta-title" }
-					changeMenuItem item taskDefaultHeaders { "meta-title,meta-title,meta-title" }
+					]
+					createOrUpdateMenuItemAndFilter(uri.value, identifier.value, title.value, query.value, "Case",
+							"private", allowed_nets.value.split(",") as List, icon.value, ["role_2": "filter_api_test"],
+							[:], ["meta-title","meta-title","meta-title"], ["meta-title","meta-title","meta-title"], metadata)
 				</action>
 			</actions>
 		</event>
@@ -227,8 +215,7 @@
 					if (move_item_id.value) {
 						item = workflowService.findOne(move_item_id.value)
 					} else if (move_folder_path.value) {
-						def node = uriService.findByUri(move_folder_path.value)
-						item = findFolderCase(node)
+						item = findFolderCase(move_folder_path.value)
 					}
 
 					moveMenuItem(item, move_dest_uri.value)
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java
index 064e8ca610d..e4be87c6c0e 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/elastic/domain/ElasticPetriNet.java
@@ -12,6 +12,8 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import java.time.LocalDateTime;
+import java.util.HashSet;
+import java.util.Set;
 
 @Data
 @NoArgsConstructor
@@ -28,7 +30,7 @@ public abstract class ElasticPetriNet {
 
     private String stringId;
 
-    private I18nString title;
+    private I18nField title;
 
     private String initials;
 
@@ -41,7 +43,7 @@ public ElasticPetriNet(PetriNet net) {
         this.version = net.getVersion();
         this.uriNodeId = net.getUriNodeId();
         this.stringId = net.getStringId();
-        this.title = net.getTitle();
+        this.title = this.transformToField(net.getTitle());
         this.initials = net.getInitials();
         this.creationDate = net.getCreationDate();
     }
@@ -54,4 +56,6 @@ public void update(ElasticPetriNet net) {
         this.title = net.getTitle();
         this.initials = net.getInitials();
     }
+
+    protected abstract I18nField transformToField(I18nString field);
 }
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/utils/MenuItemUtils.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/utils/MenuItemUtils.java
new file mode 100644
index 00000000000..337ffdc7b18
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/utils/MenuItemUtils.java
@@ -0,0 +1,111 @@
+package com.netgrif.application.engine.objects.utils;
+
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.TaskPair;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemConstants;
+
+import java.text.Normalizer;
+import java.util.List;
+
+public class MenuItemUtils {
+
+    /**
+     * Sanitizes input. Removes any diacritical marks, replaces any special character with delimiter and lowers the
+     * characters
+     *
+     * @param input input string to be sanitized
+     * @return sanitized input string
+     */
+    public static String sanitize(String input) {
+        if (input == null) {
+            return null;
+        }
+        return Normalizer.normalize(input.trim(), Normalizer.Form.NFD)
+                .replaceAll("[^\\p{ASCII}]", "")
+                .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
+                .replaceAll("[\\W-]+", "-")
+                .toLowerCase();
+    }
+
+    /**
+     * Finds task id in the provided case instance by transition id
+     *
+     * @param useCase case instance containing the task id to be found
+     * @param transId transition identifier of the task
+     * @return id of found task or null otherwise
+     */
+    public static String findTaskIdInCase(Case useCase, String transId) {
+        if (useCase == null || transId == null) {
+            return null;
+        }
+
+        TaskPair resultPair = useCase.getTasks().stream()
+                .filter(taskPair -> taskPair.getTransition().equals(transId))
+                .findFirst().orElse(null);
+
+        if (resultPair == null) {
+            return null;
+        }
+
+        return resultPair.getTask();
+    }
+
+    /**
+     * This method is mainly used for {@link IMenuItemService#moveItem(Case, String)}
+     *
+     * @param folderItem case instance of folder menu item
+     * @param destUri    path of the uri node
+     * @return true, if the nodePath would become cyclic to folderItem's current nodePath after item move. F.e.
+     * "/node1/node2" would be cyclic to "/node1/node2/node3" after move
+     */
+    public static boolean isCyclicNodePath(Case folderItem, String destUri) {
+        String oldNodePath = (String) folderItem.getFieldValue(MenuItemConstants.FIELD_NODE_PATH);
+        return destUri.contains(oldNodePath);
+    }
+
+    /**
+     * @param useCase   case instance where the caseRef exists
+     * @param caseRefId id of caseRef field
+     * @return List of case ids inside caseRef field. Returns null if the field doesn't exist or the field's value is
+     * null.
+     */
+    @SuppressWarnings("unchecked")
+    public static List<String> getCaseIdsFromCaseRef(Case useCase, String caseRefId) {
+        try {
+            return (List<String>) useCase.getFieldValue(caseRefId);
+        } catch (NullPointerException ignore) {
+            return null;
+        }
+    }
+
+    /**
+     * @param useCase   case instance where the caseRef exists
+     * @param caseRefId id of caseRef field
+     * @return Case id inside caseRef field. Returns null if the field doesn't exist or the caseRef is empty.
+     */
+    public static String getCaseIdFromCaseRef(Case useCase, String caseRefId) {
+        List<String> caseIds = getCaseIdsFromCaseRef(useCase, caseRefId);
+        if (caseIds == null || caseIds.isEmpty()) {
+            return null;
+        }
+        return caseIds.get(0);
+    }
+
+    /**
+     * @param menuItemCase case instance of menu item
+     * @return true if the menu item contains view
+     */
+    public static boolean hasView(Case menuItemCase) {
+        return getCaseIdFromCaseRef(menuItemCase, MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID) != null;
+    }
+
+    /**
+     * @param folderCase case instance of folder menu item
+     * @return true if the folder case contains any child menu item cases
+     */
+    public static boolean hasFolderChildren(Case folderCase) {
+        List<String> childIds = MenuItemUtils.getCaseIdsFromCaseRef(folderCase, MenuItemConstants.FIELD_CHILD_ITEM_IDS);
+        return childIds != null && !childIds.isEmpty();
+    }
+
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/filter/FilterConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/filter/FilterConstants.java
new file mode 100644
index 00000000000..631fb07c604
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/filter/FilterConstants.java
@@ -0,0 +1,22 @@
+package com.netgrif.application.engine.objects.workflow.domain.filter;
+
+import lombok.Getter;
+
+public class FilterConstants {
+
+    public static final String AUTO_CREATE_TRANSITION = "auto_create";
+    public static final String DETAILS_TRANSITION = "t2";
+    public static final String FILTER_TYPE_FIELD_ID = "filter_type";
+    public static final String FILTER_ORIGIN_VIEW_ID_FIELD_ID = "origin_view_id";
+    public static final String FILTER_PARENT_CASE_ID_FIELD_ID = "parent_filter_id";
+    public static final String FILTER_VISIBILITY_FIELD_ID = "visibility";
+    public static final String FILTER_FIELD_ID = "filter";
+    public static final String FILTER_I18N_TITLE_FIELD_ID = "i18n_filter_name";
+    public static final String GERMAN_ISO_3166_CODE = "de";
+    public static final String SLOVAK_ISO_3166_CODE = "sk";
+    public static final String IS_IMPORTED = "is_imported";
+    public static final String FILTER_TYPE_CASE = "Case";
+    public static final String FILTER_TYPE_TASK = "Task";
+    public static final String FILTER_VISIBILITY_PRIVATE = "private";
+    public static final String FILTER_VISIBILITY_PUBLIC = "public";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/FilterBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/FilterBody.java
new file mode 100644
index 00000000000..c6e882a235f
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/FilterBody.java
@@ -0,0 +1,73 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.filter.FilterConstants;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+public class FilterBody {
+    private Case filter;
+    private I18nString title;
+    private String query;
+    private String type;
+    private List<String> allowedNets;
+    private String icon;
+    private String visibility;
+    private Map<String, Object> metadata;
+
+    public FilterBody(Case filterCase) {
+        this.filter = filterCase;
+    }
+
+    /**
+     * Gets default metadata with provided filter type
+     *
+     * @param type type of the filter
+     *
+     * @return metadata containing filter type as map
+     * */
+    public static Map<String, Object> getDefaultMetadata(String type) {
+        Map<String, Object> resultMap = new HashMap<>();
+
+        resultMap.put("searchCategories", List.of());
+        resultMap.put("predicateMetadata", List.of());
+        resultMap.put("filterType", type);
+        resultMap.put("defaultSearchCategories", true);
+        resultMap.put("inheritAllowedNets", false);
+
+        return resultMap;
+    }
+
+    /**
+     * Transforms attributes into dataSet for {@link IDataService#setData}
+     *
+     * @return {@link ToDataSetOutcome} object with dataSet
+     * */
+    public ToDataSetOutcome toDataSet() {
+        ToDataSetOutcome outcome = new ToDataSetOutcome();
+
+        outcome.putDataSetEntry(FilterConstants.FILTER_TYPE_FIELD_ID, FieldType.ENUMERATION_MAP, this.type);
+        outcome.putDataSetEntry(FilterConstants.FILTER_VISIBILITY_FIELD_ID, FieldType.ENUMERATION_MAP, this.visibility);
+        outcome.putDataSetEntry(FilterConstants.FILTER_I18N_TITLE_FIELD_ID, FieldType.I18N, this.title);
+        Map<String, Object> metadata = this.metadata;
+        if (metadata == null) {
+            metadata = getDefaultMetadata(this.type);
+        }
+        outcome.getDataSet().put(FilterConstants.FILTER_FIELD_ID, Map.of(
+                "type", "filter",
+                "value", this.query,
+                "allowedNets", this.allowedNets,
+                "filterMetadata", metadata
+        ));
+
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemBody.java
index f123d4af9e2..6a6bc49737b 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemBody.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemBody.java
@@ -2,67 +2,39 @@
 
 import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
 import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.utils.MenuItemUtils;
 import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.ViewBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.configurations.ViewConstants;
 import lombok.Data;
-import lombok.Getter;
 import lombok.NoArgsConstructor;
 
-import jakarta.annotation.Nullable;
-import java.text.Normalizer;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 /**
- * Class, that holds configurable attributes of menu item. In case of attribute addition, please update also
- * {@link MenuItemBody#toDataSet(String, String, boolean)} method.
+ * Class, that holds configurable attributes of menu item.
  */
 @Data
 @NoArgsConstructor
 public class MenuItemBody {
-
-    // generic attributes
-    private I18nString menuName;
-    private I18nString tabName;
-    private String menuIcon = "filter_none";
-    private String tabIcon;
-    @Getter
     private String path;
     private String identifier;
-    private Case filter;
-    private Map<String, I18nString> allowedRoles;
-    private Map<String, I18nString> bannedRoles;
-    private boolean useTabIcon = true;
+
+    private String menuIcon = "filter_none";
+    private I18nString menuName;
+    private Map<String, I18nString> allowedRoles = new HashMap<>();
+    private Map<String, I18nString> bannedRoles = new HashMap<>();
     private boolean useCustomView = false;
     private String customViewSelector;
+    private boolean isAutoSelect = false;
 
-    // case view attributes
-    private String caseViewSearchType = "fulltext_advanced";
-    private String createCaseButtonTitle;
-    private String createCaseButtonIcon = "add";
-    private boolean caseRequireTitleInCreation = true;
-    private boolean showCreateCaseButton = true;
-    private String bannedNetsInCreation;
-    private boolean caseShowMoreMenu = false;
-    private boolean caseAllowHeaderTableMode = true;
-    private List<String> caseHeadersMode = new ArrayList<>(List.of("sort", "edit", "search"));
-    private String caseHeadersDefaultMode = "sort";
-    private List<String> caseDefaultHeaders;
-    private boolean caseIsHeaderModeChangeable = true;
-    private boolean caseUseDefaultHeaders = true;
-
-    // task view attributes
-    private Case additionalFilter;
-    private boolean mergeFilters = true;
-    private String taskViewSearchType = "fulltext_advanced";
-    private List<String> taskHeadersMode = new ArrayList<>(List.of("sort", "edit"));
-    private String taskHeadersDefaultMode = "sort";
-    private boolean taskIsHeaderModeChangeable = true;
-    private boolean taskAllowHeaderTableMode = true;
-    private boolean taskUseDefaultHeaders = true;
-    private List<String> taskDefaultHeaders;
-    private boolean taskShowMoreMenu = true;
+    private boolean useTabbedView;
+    private String tabIcon;
+    private boolean useTabIcon = true;
+    private I18nString tabName;
+    private ViewBody view;
 
     public MenuItemBody(I18nString name, String icon) {
         this.menuName = name;
@@ -114,27 +86,8 @@ public MenuItemBody(String path, String identifier, String menuName, String tabN
         this.tabIcon = tabIcon;
     }
 
-    private static void putDataSetEntry(Map<String, Map<String, Object>> dataSet, MenuItemConstants fieldId, FieldType fieldType,
-                                        @Nullable Object fieldValue) {
-        Map<String, Object> fieldMap = new LinkedHashMap<>();
-        fieldMap.put("type", fieldType.getName());
-        fieldMap.put("value", fieldValue);
-        dataSet.put(fieldId.getValue(), fieldMap);
-    }
-
-    private static String sanitize(String input) {
-        if (input == null) {
-            return null;
-        }
-        return Normalizer.normalize(input.trim(), Normalizer.Form.NFD)
-                .replaceAll("[^\\p{ASCII}]", "")
-                .replaceAll("\\p{InCombiningDiacriticalMarks}+", "")
-                .replaceAll("[\\W-]+", "-")
-                .toLowerCase();
-    }
-
     public String getIdentifier() {
-        return sanitize(this.identifier);
+        return MenuItemUtils.sanitize(this.identifier);
     }
 
     public void setMenuName(I18nString name) {
@@ -153,106 +106,80 @@ public void setTabName(String name) {
         this.tabName = new I18nString(name);
     }
 
-    public Map<String, Map<String, Object>> toDataSet() {
-        return toDataSet(null, null, true);
+    public void setView(ViewBody viewBody) {
+        this.view = viewBody;
+        this.useTabbedView = viewBody == null || viewBody.getViewType().isTabbed();
     }
 
-    public Map<String, Map<String, Object>> toDataSet(String parentId, String nodePath) {
-        return toDataSet(parentId, nodePath, false);
+    /**
+     * @return true if the menu item contains view
+     */
+    public boolean hasView() {
+        return this.view != null;
     }
 
-    public void setPath(String path) {
-        this.path = path != null ? path.trim() : null;
+    /**
+     * Transforms attributes into dataSet for {@link IDataService#setData}
+     *
+     * @return {@link ToDataSetOutcome} object with dataSet
+     */
+    public ToDataSetOutcome toDataSet() {
+        return toDataSet(null, null, null);
     }
 
-    private Map<String, Map<String, Object>> toDataSet(String parentId, String nodePath, boolean ignoreParentId) {
-        Map<String, Map<String, Object>> dataSet = new LinkedHashMap<>();
+    /**
+     * Transforms attributes into dataSet for {@link IDataService#setData}
+     *
+     * @param viewCase case instance of view. If provided, caseRef and taskRef are initialized
+     * @return {@link ToDataSetOutcome} object with dataSet
+     */
+    public ToDataSetOutcome toDataSet(Case viewCase) {
+        return toDataSet(null, null, viewCase);
+    }
+
+    /**
+     * Transforms attributes into dataSet for {@link IDataService#setData}
+     *
+     * @param parentId identifier of parent menu item instance
+     * @param nodePath uri, that represents the menu item (f.e.: "/myItem1/myItem2")
+     * @param viewCase case instance of view. If provided, caseRef and taskRef are initialized
+     * @return {@link ToDataSetOutcome} object with dataSet
+     */
+    public ToDataSetOutcome toDataSet(String parentId, String nodePath, Case viewCase) {
+        ToDataSetOutcome outcome = new ToDataSetOutcome();
 
-        // GENERIC
-        ArrayList<String> filterIdCaseRefValue = new ArrayList<>();
-        if (this.filter != null) {
-            filterIdCaseRefValue.add(this.filter.getStringId());
-        }
-        ArrayList<String> parentIdCaseRef = new ArrayList<>();
         if (parentId != null) {
-            parentIdCaseRef.add(parentId);
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_PARENT_ID, FieldType.CASE_REF, List.of(parentId));
         }
-
         if (nodePath != null) {
-            putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_NODE_PATH, FieldType.TEXT, nodePath);
-        }
-        if (!ignoreParentId) {
-            putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_PARENT_ID, FieldType.CASE_REF, parentIdCaseRef);
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_NODE_PATH, FieldType.TEXT, nodePath);
         }
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_NAME, FieldType.I18N, this.menuName);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_MENU_ICON, FieldType.TEXT, this.menuIcon);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TAB_NAME, FieldType.I18N, this.tabName);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TAB_ICON, FieldType.TEXT, this.tabIcon);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_MENU_NAME, FieldType.I18N, this.menuName);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_MENU_ICON, FieldType.TEXT, this.menuIcon);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_USE_TABBED_VIEW, FieldType.BOOLEAN, this.useTabbedView);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_TAB_NAME, FieldType.I18N, this.tabName);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_TAB_ICON, FieldType.TEXT, this.tabIcon);
         if (this.identifier != null) {
-            putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_IDENTIFIER, FieldType.TEXT, this.getIdentifier());
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_IDENTIFIER, FieldType.TEXT, this.getIdentifier());
         }
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_FILTER_CASE, FieldType.CASE_REF, filterIdCaseRefValue);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_USE_TAB_ICON, FieldType.BOOLEAN, this.useTabIcon);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_USE_CUSTOM_VIEW, FieldType.BOOLEAN,
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_USE_TAB_ICON, FieldType.BOOLEAN, this.useTabIcon);
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_USE_CUSTOM_VIEW, FieldType.BOOLEAN,
                 this.useCustomView);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CUSTOM_VIEW_SELECTOR, FieldType.TEXT,
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_CUSTOM_VIEW_SELECTOR, FieldType.TEXT,
                 this.customViewSelector);
-
-        // CASE
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_VIEW_SEARCH_TYPE, FieldType.ENUMERATION_MAP,
-                this.caseViewSearchType);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CREATE_CASE_BUTTON_TITLE, FieldType.TEXT,
-                this.createCaseButtonTitle);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CREATE_CASE_BUTTON_ICON, FieldType.TEXT,
-                this.createCaseButtonIcon);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_REQUIRE_TITLE_IN_CREATION, FieldType.BOOLEAN,
-                this.caseRequireTitleInCreation);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_SHOW_CREATE_CASE_BUTTON, FieldType.BOOLEAN,
-                this.showCreateCaseButton);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_BANNED_NETS_IN_CREATION, FieldType.TEXT,
-                this.bannedNetsInCreation);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_SHOW_MORE_MENU, FieldType.BOOLEAN,
-                this.caseShowMoreMenu);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_ALLOW_HEADER_TABLE_MODE, FieldType.BOOLEAN,
-                this.caseAllowHeaderTableMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_HEADERS_MODE, FieldType.MULTICHOICE_MAP,
-                this.caseHeadersMode == null ? new ArrayList<>() : this.caseHeadersMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_HEADERS_DEFAULT_MODE, FieldType.ENUMERATION_MAP,
-                this.caseHeadersDefaultMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_DEFAULT_HEADERS, FieldType.TEXT,
-                this.caseDefaultHeaders != null ? String.join(",", this.caseDefaultHeaders) : null);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_CASE_IS_HEADER_MODE_CHANGEABLE, FieldType.BOOLEAN,
-                this.caseIsHeaderModeChangeable);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_USE_CASE_DEFAULT_HEADERS, FieldType.BOOLEAN,
-                this.caseUseDefaultHeaders);
-
-        // TASK
-        ArrayList<String> additionalFilterIdCaseRefValue = new ArrayList<>();
-        if (this.additionalFilter != null) {
-            additionalFilterIdCaseRefValue.add(this.additionalFilter.getStringId());
+        outcome.putDataSetEntry(MenuItemConstants.FIELD_IS_AUTO_SELECT, FieldType.BOOLEAN, this.isAutoSelect);
+        outcome.putDataSetEntryOptions(MenuItemConstants.FIELD_ALLOWED_ROLES, FieldType.MULTICHOICE_MAP, this.allowedRoles);
+        outcome.putDataSetEntryOptions(MenuItemConstants.FIELD_BANNED_ROLES, FieldType.MULTICHOICE_MAP, this.bannedRoles);
+
+        if (viewCase != null) {
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_VIEW_CONFIGURATION_TYPE, FieldType.ENUMERATION_MAP,
+                    this.view.getViewType().getIdentifier());
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_VIEW_CONFIGURATION_ID, FieldType.CASE_REF,
+                    List.of(viewCase.getStringId()));
+            String taskId = MenuItemUtils.findTaskIdInCase(viewCase, ViewConstants.TRANS_SETTINGS_ID);
+            outcome.putDataSetEntry(MenuItemConstants.FIELD_VIEW_CONFIGURATION_FORM, FieldType.TASK_REF, List.of(taskId));
         }
 
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_ADDITIONAL_FILTER_CASE, FieldType.CASE_REF,
-                additionalFilterIdCaseRefValue);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_MERGE_FILTERS, FieldType.BOOLEAN,
-                this.mergeFilters);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_VIEW_SEARCH_TYPE, FieldType.ENUMERATION_MAP,
-                this.taskViewSearchType);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_HEADERS_MODE, FieldType.MULTICHOICE_MAP,
-                this.taskHeadersMode == null ? new ArrayList<>() : this.taskHeadersMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_HEADERS_DEFAULT_MODE, FieldType.ENUMERATION_MAP,
-                this.taskHeadersDefaultMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_IS_HEADER_MODE_CHANGEABLE, FieldType.BOOLEAN,
-                this.taskIsHeaderModeChangeable);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_ALLOW_HEADER_TABLE_MODE, FieldType.BOOLEAN,
-                this.taskAllowHeaderTableMode);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_USE_TASK_DEFAULT_HEADERS, FieldType.BOOLEAN,
-                this.taskUseDefaultHeaders);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_DEFAULT_HEADERS, FieldType.TEXT,
-                this.taskDefaultHeaders != null ? String.join(",", this.taskDefaultHeaders) : null);
-        putDataSetEntry(dataSet, MenuItemConstants.PREFERENCE_ITEM_FIELD_TASK_SHOW_MORE_MENU, FieldType.BOOLEAN,
-                this.taskShowMoreMenu);
-
-        return dataSet;
+        return outcome;
     }
 }
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemConstants.java
index d31b84d8f77..5ab14f2e408 100644
--- a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemConstants.java
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemConstants.java
@@ -1,69 +1,39 @@
 package com.netgrif.application.engine.objects.workflow.domain.menu;
 
-import lombok.Getter;
 
 /**
  * Enumeration for menu items. It contains any constants needed in application.
  */
-public enum MenuItemConstants {
+public class MenuItemConstants {
+    public static final String FIELD_PARENT_ID = "parentId";
+    public static final String FIELD_CHILD_ITEM_IDS = "childItemIds";
+    public static final String FIELD_HAS_CHILDREN = "hasChildren";
+    public static final String FIELD_IDENTIFIER = "menu_item_identifier";
+    public static final String FIELD_APPEND_MENU_ITEM = "append_menu_item_stringId";
+    public static final String FIELD_ALLOWED_ROLES = "allowed_roles";
+    public static final String FIELD_BANNED_ROLES = "banned_roles";
+    public static final String FIELD_MENU_NAME = "menu_name";
+    public static final String FIELD_MENU_ICON = "menu_icon";
+    public static final String FIELD_TAB_NAME = "tab_name";
+    public static final String FIELD_USE_TABBED_VIEW = "use_tabbed_view";
+    public static final String FIELD_USE_TAB_ICON = "use_tab_icon";
+    public static final String FIELD_TAB_ICON = "tab_icon";
+    public static final String FIELD_VIEW_CONFIGURATION_TYPE = "view_configuration_type";
+    public static final String FIELD_NODE_PATH = "nodePath";
+    public static final String FIELD_NODE_NAME = "nodeName";
+    public static final String FIELD_DUPLICATE_TITLE = "duplicate_new_title";
+    public static final String FIELD_DUPLICATE_IDENTIFIER = "duplicate_view_identifier";
+    public static final String FIELD_DUPLICATE_RESET_CHILD_ITEM_IDS = "duplicate_reset_childItemIds";
+    public static final String FIELD_USE_CUSTOM_VIEW = "use_custom_view";
+    public static final String FIELD_CUSTOM_VIEW_SELECTOR = "custom_view_selector";
+    public static final String FIELD_IS_AUTO_SELECT = "is_auto_select";
+    public static final String FIELD_VIEW_CONFIGURATION_ID = "view_configuration_id";
+    public static final String FIELD_VIEW_CONFIGURATION_FORM = "view_configuration_form";
 
-    // FIELDS
-    PREFERENCE_ITEM_FIELD_NEW_FILTER_ID("new_filter_id"),
-    PREFERENCE_ITEM_FIELD_FILTER_CASE("filter_case"),
-    PREFERENCE_ITEM_FIELD_PARENT_ID("parentId"),
-    PREFERENCE_ITEM_FIELD_CHILD_ITEM_IDS("childItemIds"),
-    PREFERENCE_ITEM_FIELD_HAS_CHILDREN("hasChildren"),
-    PREFERENCE_ITEM_FIELD_CASE_DEFAULT_HEADERS("case_default_headers"),
-    PREFERENCE_ITEM_FIELD_TASK_DEFAULT_HEADERS("task_default_headers"),
-    PREFERENCE_ITEM_FIELD_IDENTIFIER("menu_item_identifier"),
-    PREFERENCE_ITEM_FIELD_APPEND_MENU_ITEM("append_menu_item_stringId"),
-    PREFERENCE_ITEM_FIELD_ALLOWED_ROLES("allowed_roles"),
-    PREFERENCE_ITEM_FIELD_BANNED_ROLES("banned_roles"),
-    PREFERENCE_ITEM_FIELD_MENU_NAME("menu_name"),
-    PREFERENCE_ITEM_FIELD_MENU_ICON("menu_icon"),
-    PREFERENCE_ITEM_FIELD_TAB_NAME("tab_name"),
-    PREFERENCE_ITEM_FIELD_USE_TAB_ICON("use_tab_icon"),
-    PREFERENCE_ITEM_FIELD_TAB_ICON("tab_icon"),
-    PREFERENCE_ITEM_FIELD_NODE_PATH("nodePath"),
-    PREFERENCE_ITEM_FIELD_NODE_NAME("nodeName"),
-    PREFERENCE_ITEM_FIELD_DUPLICATE_TITLE("duplicate_new_title"),
-    PREFERENCE_ITEM_FIELD_DUPLICATE_IDENTIFIER("duplicate_view_identifier"),
-    PREFERENCE_ITEM_FIELD_DUPLICATE_RESET_CHILD_ITEM_IDS("duplicate_reset_childItemIds"),
-    PREFERENCE_ITEM_FIELD_REQUIRE_TITLE_IN_CREATION("case_require_title_in_creation"),
-    PREFERENCE_ITEM_FIELD_USE_CUSTOM_VIEW("use_custom_view"),
-    PREFERENCE_ITEM_FIELD_CUSTOM_VIEW_SELECTOR("custom_view_selector"),
-    PREFERENCE_ITEM_FIELD_CASE_VIEW_SEARCH_TYPE("case_view_search_type"),
-    PREFERENCE_ITEM_FIELD_CREATE_CASE_BUTTON_TITLE("create_case_button_title"),
-    PREFERENCE_ITEM_FIELD_CREATE_CASE_BUTTON_ICON("create_case_button_icon"),
-    PREFERENCE_ITEM_FIELD_BANNED_NETS_IN_CREATION("case_banned_nets_in_creation"),
-    PREFERENCE_ITEM_FIELD_SHOW_CREATE_CASE_BUTTON("show_create_case_button"),
-    PREFERENCE_ITEM_FIELD_CASE_SHOW_MORE_MENU("case_show_more_menu"),
-    PREFERENCE_ITEM_FIELD_CASE_ALLOW_HEADER_TABLE_MODE("case_allow_header_table_mode"),
-    PREFERENCE_ITEM_FIELD_CASE_HEADERS_MODE("case_headers_mode"),
-    PREFERENCE_ITEM_FIELD_CASE_HEADERS_DEFAULT_MODE("case_headers_default_mode"),
-    PREFERENCE_ITEM_FIELD_CASE_IS_HEADER_MODE_CHANGEABLE("case_is_header_mode_changeable"),
-    PREFERENCE_ITEM_FIELD_USE_CASE_DEFAULT_HEADERS("case_is_header_mode_changeable"),
-    PREFERENCE_ITEM_FIELD_ADDITIONAL_FILTER_CASE("additional_filter_case"),
-    PREFERENCE_ITEM_FIELD_MERGE_FILTERS("merge_filters"),
-    PREFERENCE_ITEM_FIELD_TASK_VIEW_SEARCH_TYPE("task_view_search_type"),
-    PREFERENCE_ITEM_FIELD_TASK_HEADERS_MODE("task_headers_mode"),
-    PREFERENCE_ITEM_FIELD_TASK_HEADERS_DEFAULT_MODE("task_headers_default_mode"),
-    PREFERENCE_ITEM_FIELD_TASK_IS_HEADER_MODE_CHANGEABLE("task_is_header_mode_changeable"),
-    PREFERENCE_ITEM_FIELD_TASK_ALLOW_HEADER_TABLE_MODE("task_allow_header_table_mode"),
-    PREFERENCE_ITEM_FIELD_USE_TASK_DEFAULT_HEADERS("use_task_default_headers"),
-    PREFERENCE_ITEM_FIELD_TASK_SHOW_MORE_MENU("task_show_more_menu"),
-
-    // TRANSITIONS
-    PREFERENCE_ITEM_SETTINGS_TRANS_ID("item_settings"),
-    PREFERENCE_ITEM_FIELD_INIT_TRANS_ID("initialize"),
+    public static final String TRANS_SETTINGS_ID = "item_settings";
+    public static final String TRANS_INIT_ID = "initialize";
+    public static final String TRANS_SYNC_ID = "data_sync";
 
     // SEPARATOR
-    PATH_SEPARATOR("/");
-
-    @Getter
-    private final String value;
-
-    MenuItemConstants(String value) {
-        this.value = value;
-    }
+    public static final String PATH_SEPARATOR = "/";
 }
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemView.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemView.java
new file mode 100644
index 00000000000..cfc5cf6a935
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/MenuItemView.java
@@ -0,0 +1,90 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+
+/**
+ * Here is listed and configured every configuration process available for menu items.
+ * */
+@Getter
+public enum MenuItemView {
+    TABBED_CASE_VIEW(new I18nString("Tabbed case view", Map.of("sk", "Zobrazenie prípadov v taboch",
+            "de", "Fallansicht mit Registerkarten")), "tabbed_case_view", List.of("tabbed_task_view"),
+            true, true),
+    TABBED_TASK_VIEW(new I18nString("Tabbed task view", Map.of("sk", "Zobrazenie úloh v taboch",
+            "de", "Aufgabenansicht mit Registerkarten")), "tabbed_task_view", List.of(), true, true),
+    TABBED_TICKET_VIEW(new I18nString("Tabbed ticket view", Map.of("sk", "Tiketové zobrazenie v taboch",
+            "de", "Ticketansicht mit Registerkarten")), "tabbed_ticket_view",
+            List.of("tabbed_single_task_view"), true, true),
+    TABBED_SINGLE_TASK_VIEW(new I18nString("Tabbed single task view", Map.of("sk", "Zobrazenie jednej úlohy v taboch",
+            "de", "Einzelaufgabenansicht mit Registerkarten")), "tabbed_single_task_view", List.of(), true, false);
+
+    private final I18nString name;
+    private final String identifier;
+    /**
+     * List of view identifiers of views, that can be associated with the view
+     * */
+    private final List<String> allowedAssociatedViews;
+    private final boolean isTabbed;
+    /**
+     * if false, the view cannot be used as first configuration of the menu_item, but can be used as secondary
+     * (associated to another view)
+     * */
+    private final boolean isPrimary;
+
+    MenuItemView(I18nString name, String identifier, List<String> allowedAssociatedViews, boolean isTabbed, boolean isPrimary) {
+        this.name = name;
+        this.identifier = identifier;
+        this.allowedAssociatedViews = allowedAssociatedViews;
+        this.isTabbed = isTabbed;
+        this.isPrimary = isPrimary;
+    }
+
+    /**
+     * Builds enum value by the view identifier
+     * */
+    public static MenuItemView fromIdentifier(String identifier) {
+        for (MenuItemView view : MenuItemView.values()) {
+            if (view.identifier.equals(identifier)) {
+                return view;
+            }
+        }
+        throw new IllegalArgumentException(identifier);
+    }
+
+    /**
+     * Finds all enum values, that are tabbed or non-tabbed
+     *
+     * @param isTabbed if true, only tabbed values will be returned
+     * @param isPrimary if true, only views accessible directly from the menu_item will be returned
+     *
+     * @return List of views based on {@link #isTabbed}
+     * */
+    public static List<MenuItemView> findAllByIsTabbedAndIsPrimary(boolean isTabbed, boolean isPrimary) {
+        return Arrays.stream(MenuItemView.values())
+                .filter(view -> view.isTabbed == isTabbed && view.isPrimary == isPrimary)
+                .collect(Collectors.toList());
+    }
+
+    /**
+     * Finds all enum values, that are tabbed or non-tabbed and are defined in parent view as {@link #allowedAssociatedViews}
+     *
+     * @param isTabbed if true, set of views is reduced to only tabbed views
+     * @param parentIdentifier identifier of the view, that contains returned views in {@link #allowedAssociatedViews}
+     *
+     * @return List of views based on {@link #isTabbed} and {@link #allowedAssociatedViews}
+     * */
+    public static List<MenuItemView> findAllByIsTabbedAndParentIdentifier(boolean isTabbed, String parentIdentifier) {
+        MenuItemView parentView = fromIdentifier(parentIdentifier);
+        return Arrays.stream(MenuItemView.values())
+                .filter(view -> view.isTabbed == isTabbed
+                        && parentView.getAllowedAssociatedViews().contains(view.identifier))
+                .collect(Collectors.toList());
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/ToDataSetOutcome.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/ToDataSetOutcome.java
new file mode 100644
index 00000000000..6df026b05fd
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/ToDataSetOutcome.java
@@ -0,0 +1,56 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import jakarta.annotation.Nullable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+@Data
+@AllArgsConstructor
+public class ToDataSetOutcome {
+    private Map<String, Map<String, Object>> dataSet;
+
+    public ToDataSetOutcome() {
+        this.dataSet = new HashMap<>();
+    }
+
+    /**
+     * Puts provided value into {@link #dataSet} according to dataSet rules.
+     *
+     * @param fieldId importId of the field
+     * @param fieldType type of the field
+     * @param fieldValue new value of the field
+     * */
+    public void putDataSetEntry(String fieldId, FieldType fieldType, @Nullable Object fieldValue) {
+        Map<String, Object> fieldMap = new LinkedHashMap<>();
+        fieldMap.put("type", fieldType.getName());
+        fieldMap.put("value", fieldValue);
+        this.dataSet.put(fieldId, fieldMap);
+    }
+
+    /**
+     * Puts provided options into {@link #dataSet} according to dataSet rules.
+     *
+     * @param fieldId importId of the field
+     * @param fieldType type of the field
+     * @param options new options of the field
+     * */
+    public void putDataSetEntryOptions(String fieldId, FieldType fieldType, @Nullable Map<String, I18nString> options) {
+        Map<String, Object> fieldMap = new LinkedHashMap<>();
+        fieldMap.put("type", fieldType.getName());
+        if (fieldType.equals(FieldType.MULTICHOICE_MAP)) {
+            fieldMap.put("value", Set.of());
+        }
+        if (options == null) {
+            options = new HashMap<>();
+        }
+        fieldMap.put("options", options);
+        this.dataSet.put(fieldId, fieldMap);
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewBody.java
new file mode 100644
index 00000000000..19fcb38e4bf
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewBody.java
@@ -0,0 +1,76 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TabbedCaseViewBody extends ViewBody {
+    private String viewSearchType = "fulltext_advanced";
+    private String createCaseButtonTitle;
+    private String createCaseButtonIcon = "add";
+    private boolean requireTitleInCreation = true;
+    private boolean showCreateCaseButton = true;
+    private String bannedNetsInCreation;
+    private boolean showMoreMenu = false;
+    private boolean allowHeaderTableMode = true;
+    private List<String> headersMode = new ArrayList<>(List.of("sort", "edit", "search"));
+    private String headersDefaultMode = "sort";
+    private List<String> defaultHeaders;
+    private boolean isHeaderModeChangeable = true;
+    private boolean useDefaultHeaders = true;
+
+    private ViewBody chainedView;
+
+    @Override
+    public ViewBody getAssociatedViewBody() {
+        return this.chainedView;
+    }
+
+    @Override
+    public MenuItemView getViewType() {
+        return MenuItemView.TABBED_CASE_VIEW;
+    }
+
+    @Override
+    protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) {
+
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_VIEW_SEARCH_TYPE, FieldType.ENUMERATION_MAP,
+                this.viewSearchType);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_CREATE_CASE_BUTTON_TITLE, FieldType.TEXT,
+                this.createCaseButtonTitle);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_CREATE_CASE_BUTTON_ICON, FieldType.TEXT,
+                this.createCaseButtonIcon);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_REQUIRE_TITLE_IN_CREATION, FieldType.BOOLEAN,
+                this.requireTitleInCreation);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_SHOW_CREATE_CASE_BUTTON, FieldType.BOOLEAN,
+                this.showCreateCaseButton);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_BANNED_NETS_IN_CREATION, FieldType.TEXT,
+                this.bannedNetsInCreation);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_SHOW_MORE_MENU, FieldType.BOOLEAN,
+                this.showMoreMenu);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_ALLOW_HEADER_TABLE_MODE, FieldType.BOOLEAN,
+                this.allowHeaderTableMode);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_HEADERS_MODE, FieldType.MULTICHOICE_MAP,
+                this.headersMode == null ? new ArrayList<>() : this.headersMode);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_HEADERS_DEFAULT_MODE, FieldType.ENUMERATION_MAP,
+                this.headersDefaultMode);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_DEFAULT_HEADERS, FieldType.TEXT,
+                this.defaultHeaders != null ? String.join(",", this.defaultHeaders) : null);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_IS_HEADER_MODE_CHANGEABLE, FieldType.BOOLEAN,
+                this.isHeaderModeChangeable);
+        outcome.putDataSetEntry(TabbedCaseViewConstants.FIELD_USE_CASE_DEFAULT_HEADERS, FieldType.BOOLEAN,
+                this.useDefaultHeaders);
+
+        return outcome;
+    }
+}
+
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewConstants.java
new file mode 100644
index 00000000000..ca8e392d756
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedCaseViewConstants.java
@@ -0,0 +1,22 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+
+/**
+ * Here are declared constants of process tabbed_case_view_configuration.xml.
+ */
+public class TabbedCaseViewConstants extends ViewConstants {
+    public static final String FIELD_NEW_FILTER_ID = "new_filter_id";
+    public static final String FIELD_DEFAULT_HEADERS = "default_headers";
+    public static final String FIELD_REQUIRE_TITLE_IN_CREATION = "require_title_in_creation";
+    public static final String FIELD_VIEW_SEARCH_TYPE = "view_search_type";
+    public static final String FIELD_CREATE_CASE_BUTTON_TITLE = "create_case_button_title";
+    public static final String FIELD_CREATE_CASE_BUTTON_ICON = "create_case_button_icon";
+    public static final String FIELD_BANNED_NETS_IN_CREATION = "banned_nets_in_creation";
+    public static final String FIELD_SHOW_CREATE_CASE_BUTTON = "show_create_case_button";
+    public static final String FIELD_SHOW_MORE_MENU = "show_more_menu";
+    public static final String FIELD_ALLOW_HEADER_TABLE_MODE = "allow_header_table_mode";
+    public static final String FIELD_HEADERS_MODE = "headers_mode";
+    public static final String FIELD_HEADERS_DEFAULT_MODE = "headers_default_mode";
+    public static final String FIELD_IS_HEADER_MODE_CHANGEABLE = "is_header_mode_changeable";
+    public static final String FIELD_USE_CASE_DEFAULT_HEADERS = "use_case_default_headers";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewBody.java
new file mode 100644
index 00000000000..9a8a41e7f5e
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewBody.java
@@ -0,0 +1,31 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TabbedSingleTaskViewBody extends ViewBody {
+    private String transitionId;
+
+    @Override
+    public ViewBody getAssociatedViewBody() {
+        return null;
+    }
+
+    @Override
+    public MenuItemView getViewType() {
+        return MenuItemView.TABBED_SINGLE_TASK_VIEW;
+    }
+
+    @Override
+    protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) {
+        outcome.putDataSetEntry(TabbedSingleTaskViewConstants.FIELD_TRANSITION_ID, FieldType.TEXT, this.transitionId);
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewConstants.java
new file mode 100644
index 00000000000..d85a0774d84
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedSingleTaskViewConstants.java
@@ -0,0 +1,6 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+
+public class TabbedSingleTaskViewConstants extends ViewConstants {
+    public static final String FIELD_TRANSITION_ID = "transition_id";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewBody.java
new file mode 100644
index 00000000000..26846664402
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewBody.java
@@ -0,0 +1,63 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TabbedTaskViewBody extends ViewBody {
+    private Case filter;
+    private boolean mergeFilters = true;
+    private String viewSearchType = "fulltext_advanced";
+    private List<String> headersMode = new ArrayList<>(List.of("sort", "edit"));
+    private String headersDefaultMode = "sort";
+    private boolean isHeaderModeChangeable = true;
+    private boolean allowHeaderTableMode = true;
+    private boolean useDefaultHeaders = true;
+    private List<String> defaultHeaders;
+    private boolean showMoreMenu = true;
+
+    @Override
+    public ViewBody getAssociatedViewBody() {
+        return null;
+    }
+
+    @Override
+    public MenuItemView getViewType() {
+        return MenuItemView.TABBED_TASK_VIEW;
+    }
+
+    @Override
+    protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) {
+
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_MERGE_FILTERS, FieldType.BOOLEAN,
+                this.mergeFilters);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_VIEW_SEARCH_TYPE, FieldType.ENUMERATION_MAP,
+                this.viewSearchType);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_HEADERS_MODE, FieldType.MULTICHOICE_MAP,
+                this.headersMode == null ? new ArrayList<>() : this.headersMode);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_HEADERS_DEFAULT_MODE, FieldType.ENUMERATION_MAP,
+                this.headersDefaultMode);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_IS_HEADER_MODE_CHANGEABLE, FieldType.BOOLEAN,
+                this.isHeaderModeChangeable);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_ALLOW_HEADER_TABLE_MODE, FieldType.BOOLEAN,
+                this.allowHeaderTableMode);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_USE_DEFAULT_HEADERS, FieldType.BOOLEAN,
+                this.useDefaultHeaders);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_DEFAULT_HEADERS, FieldType.TEXT,
+                this.defaultHeaders != null ? String.join(",", this.defaultHeaders) : null);
+        outcome.putDataSetEntry(TabbedTaskViewConstants.FIELD_SHOW_MORE_MENU, FieldType.BOOLEAN,
+                this.showMoreMenu);
+
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewConstants.java
new file mode 100644
index 00000000000..db5ad865a66
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTaskViewConstants.java
@@ -0,0 +1,16 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+/**
+ * Here are declared constants of process tabbed_task_view_configuration.xml.
+ */
+public class TabbedTaskViewConstants extends ViewConstants {
+    public static final String FIELD_MERGE_FILTERS = "merge_filters";
+    public static final String FIELD_VIEW_SEARCH_TYPE = "view_search_type";
+    public static final String FIELD_DEFAULT_HEADERS = "default_headers";
+    public static final String FIELD_HEADERS_MODE = "headers_mode";
+    public static final String FIELD_HEADERS_DEFAULT_MODE = "headers_default_mode";
+    public static final String FIELD_IS_HEADER_MODE_CHANGEABLE = "is_header_mode_changeable";
+    public static final String FIELD_ALLOW_HEADER_TABLE_MODE = "allow_header_table_mode";
+    public static final String FIELD_USE_DEFAULT_HEADERS = "use_default_headers";
+    public static final String FIELD_SHOW_MORE_MENU = "show_more_menu";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewBody.java
new file mode 100644
index 00000000000..a8557ec4678
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewBody.java
@@ -0,0 +1,30 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
+public class TabbedTicketViewBody extends ViewBody {
+
+    private ViewBody chainedView;
+
+    @Override
+    public ViewBody getAssociatedViewBody() {
+        return this.chainedView;
+    }
+
+    @Override
+    public MenuItemView getViewType() {
+        return MenuItemView.TABBED_TICKET_VIEW;
+    }
+
+    @Override
+    protected ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome) {
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewConstants.java
new file mode 100644
index 00000000000..e5b97e61136
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/TabbedTicketViewConstants.java
@@ -0,0 +1,5 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+
+public class TabbedTicketViewConstants extends ViewConstants {
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewBody.java
new file mode 100644
index 00000000000..25b85a3320b
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewBody.java
@@ -0,0 +1,83 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.utils.MenuItemUtils;
+import com.netgrif.application.engine.objects.workflow.domain.Case;
+import com.netgrif.application.engine.objects.workflow.domain.menu.FilterBody;
+import com.netgrif.application.engine.objects.workflow.domain.menu.MenuItemView;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import jakarta.annotation.Nullable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public abstract class ViewBody {
+
+    @Nullable
+    protected FilterBody filterBody;
+
+    public abstract ViewBody getAssociatedViewBody();
+    public abstract MenuItemView getViewType();
+    /**
+     * Internal method, that must transform data in concrete class and add them into received outcome. Method must return
+     * the updated outcome.
+     * */
+    protected abstract ToDataSetOutcome toDataSetInternal(ToDataSetOutcome outcome);
+
+    /**
+     * Checks if the view has associated view
+     *
+     * @return true if this view has associated view
+     * */
+    public boolean hasAssociatedView() {
+        return this.getAssociatedViewBody() != null;
+    }
+
+    /**
+     * @return returns process identifier for this view
+     * */
+    public String getViewProcessIdentifier() {
+        return getViewType().getIdentifier() + "_configuration";
+    }
+
+    /**
+     * Transforms data of this class into {@link ToDataSetOutcome}, which contains prepared data for the {@link IDataService#setData}
+     *
+     * @return {@link ToDataSetOutcome} object containing dataSet
+     * */
+    public ToDataSetOutcome toDataSet() {
+        return toDataSet(null, null);
+    };
+
+    /**
+     * Transforms data of this class into {@link ToDataSetOutcome}, which contains prepared data for the {@link IDataService#setData}
+     *
+     * @param associatedViewCase case instance of associated view. If provided, caseRef and taskRef are initialized.
+     * @param filterCase case instance of filter. If provided, caseRef is initialized
+     *
+     * @return {@link ToDataSetOutcome} object containing dataSet
+     * */
+    public ToDataSetOutcome toDataSet(Case associatedViewCase, Case filterCase) {
+        ToDataSetOutcome outcome = new ToDataSetOutcome();
+
+        if (associatedViewCase != null) {
+            outcome.putDataSetEntry(ViewConstants.FIELD_CONFIGURATION_TYPE, FieldType.ENUMERATION_MAP,
+                    this.getAssociatedViewBody().getViewType().getIdentifier());
+            outcome.putDataSetEntry(ViewConstants.FIELD_VIEW_CONFIGURATION_ID, FieldType.CASE_REF,
+                    List.of(associatedViewCase.getStringId()));
+            String taskId = MenuItemUtils.findTaskIdInCase(associatedViewCase, ViewConstants.TRANS_SETTINGS_ID);
+            outcome.putDataSetEntry(ViewConstants.FIELD_VIEW_CONFIGURATION_FORM, FieldType.TASK_REF, List.of(taskId));
+        }
+        if (filterCase != null) {
+            outcome.putDataSetEntry(ViewConstants.FIELD_VIEW_FILTER_CASE, FieldType.CASE_REF, List.of(filterCase.getStringId()));
+        }
+
+        return toDataSetInternal(outcome);
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewConstants.java
new file mode 100644
index 00000000000..11f13ca7ee4
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/configurations/ViewConstants.java
@@ -0,0 +1,16 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.configurations;
+
+/**
+ * Here are declared general constants of menu item configuration processes.
+ */
+public class ViewConstants {
+    public static final String FIELD_CONFIGURATION_TYPE = "view_configuration_type";
+    public static final String FIELD_VIEW_CONFIGURATION_ID = "view_configuration_id";
+    public static final String FIELD_VIEW_CONFIGURATION_FORM = "view_configuration_form";
+    public static final String FIELD_VIEW_CONTAINS_FILTER = "contains_filter";
+    public static final String FIELD_VIEW_FILTER_CASE = "filter_case";
+
+    public static final String TRANS_INIT_ID = "initialize";
+    public static final String TRANS_SETTINGS_ID = "settings";
+    public static final String TRANS_SYNC_ID = "data_sync";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemBody.java
new file mode 100644
index 00000000000..23d2e66064c
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemBody.java
@@ -0,0 +1,54 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.dashboard;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+@AllArgsConstructor
+public class DashboardItemBody {
+
+    private String id;
+    private String menuItems;
+    private boolean isInternal;
+    private String externalUrl;
+    private String externalIcon;
+    private String iconColor;
+    private String itemIcon;
+    private String fontColor;
+    private String fontWeight;
+    private I18nString name;
+    private boolean inheritIcon;
+    private boolean inheritName;
+    private boolean isActive;
+
+    public DashboardItemBody(String id, String menuItems, String itemIcon, I18nString name, boolean isInternal) {
+        this.id = id;
+        this.menuItems = menuItems;
+        this.isInternal = isInternal;
+        this.itemIcon = itemIcon;
+        this.name = name;
+    }
+
+    public ToDataSetOutcome toDataSet() {
+        ToDataSetOutcome outcome = new ToDataSetOutcome();
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_ID, FieldType.TEXT, this.id);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_MENU_ITEM_LIST, FieldType.ENUMERATION_MAP, this.menuItems);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_IS_INTERNAL, FieldType.BOOLEAN, this.isInternal);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_EXTERNAL_URL, FieldType.TEXT, this.externalUrl);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_EXTERNAL_ICON, FieldType.BOOLEAN, this.externalIcon);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_ICON_COLOR, FieldType.TEXT, this.iconColor);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_ITEM_ICON, FieldType.TEXT, this.itemIcon);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_FONT_COLOR, FieldType.TEXT, this.fontColor);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_FONT_WEIGHT, FieldType.TEXT, this.fontWeight);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_ITEM_NAME, FieldType.I18N, this.name);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_INHERIT_ICON, FieldType.BOOLEAN, this.inheritIcon);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_INHERIT_NAME, FieldType.BOOLEAN, this.inheritName);
+        outcome.putDataSetEntry(DashboardItemConstants.FIELD_IS_ACTIVE, FieldType.BOOLEAN, this.isActive);
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemConstants.java
new file mode 100644
index 00000000000..8c6f7e624ac
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardItemConstants.java
@@ -0,0 +1,23 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.dashboard;
+
+/**
+ * Here are declared constants of process dashboard_management.xml.
+ */
+public class DashboardItemConstants {
+    public static final String PROCESS_IDENTIFIER = "dashboard_item";
+    public static final String TASK_CONFIGURE = "configuration";
+    public static final String FIELD_ID= "item_id";
+    public static final String FIELD_MENU_ITEM_LIST = "menu_items_list";
+    public static final String FIELD_IS_INTERNAL= "is_internal";
+    public static final String FIELD_EXTERNAL_URL= "external_url";
+    public static final String FIELD_EXTERNAL_ICON= "external_icon";
+    public static final String FIELD_ICON_COLOR= "icon_color";
+    public static final String FIELD_ITEM_ICON= "item_icon";
+    public static final String FIELD_FONT_COLOR= "font_color";
+    public static final String FIELD_FONT_WEIGHT= "font_weight";
+    public static final String FIELD_ITEM_NAME= "item_name";
+    public static final String FIELD_INHERIT_ICON= "inherit_icon";
+    public static final String FIELD_INHERIT_NAME= "inherit_name";
+    public static final String FIELD_IS_ACTIVE= "is_active";
+
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementBody.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementBody.java
new file mode 100644
index 00000000000..3ea137ce580
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementBody.java
@@ -0,0 +1,84 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.dashboard;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.HashMap;
+
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class DashboardManagementBody {
+    /**
+     * id
+     */
+    private String id;
+
+    /**
+     * name with translation
+     */
+    private I18nString name;
+    /**
+     * logo from assets on frontend
+     */
+    private String logo;
+    /**
+     * dashboardItems
+     */
+    private HashMap<String, I18nString> dashboardItems;
+    /**
+     * mapping for menuItems to DashboardItems
+     */
+    private HashMap<String, I18nString> menuItemsToDashboardItems;
+    /**
+     * should dashboard toolbar contains menu with options.
+     */
+    private boolean simpleDashboard = false;
+    /**
+     * should dashboard toolbar menu with profile.
+     */
+    private boolean profileDashboard = false;
+    /**
+     * should dashboard toolbar contains menu with language selection
+     */
+    private boolean languageDashboard = false;
+    /**
+     * should dashboard toolbar contains logout button.
+     */
+    private boolean logoutDashboard = false;
+
+
+    public DashboardManagementBody(String id, I18nString name) {
+        this.id = id;
+        this.name = name;
+    }
+
+    public ToDataSetOutcome toDataSet() {
+        DashboardToDataSetOutcome outcome = new DashboardToDataSetOutcome();
+        if (this.id != null) {
+            outcome.putDataSetEntry(DashboardManagementConstants.FIELD_ID, FieldType.TEXT, this.id);
+        }
+        if (this.id != null) {
+            outcome.putDataSetEntry(DashboardManagementConstants.FIELD_NAME, FieldType.I18N, this.name);
+        }
+        if (this.logo != null) {
+            outcome.putDataSetEntry(DashboardManagementConstants.FIELD_LOGO, FieldType.TEXT, this.logo);
+        }
+        outcome.putDataSetEntry(DashboardManagementConstants.FIELD_SIMPLE_DASHBOARD, FieldType.BOOLEAN, this.simpleDashboard);
+        outcome.putDataSetEntry(DashboardManagementConstants.FIELD_PROFILE_DASHBOARD, FieldType.BOOLEAN, this.profileDashboard);
+        outcome.putDataSetEntry(DashboardManagementConstants.FIELD_LANGUAGE_DASHBOARD, FieldType.BOOLEAN, this.profileDashboard);
+        outcome.putDataSetEntry(DashboardManagementConstants.FIELD_LOGOUT_DASHBOARD, FieldType.BOOLEAN, this.logoutDashboard);
+        if (this.dashboardItems != null) {
+            outcome.putDataSetEntryWithOptions(DashboardManagementConstants.FIELD_DASHBOARD_ITEM_LIST, FieldType.ENUMERATION_MAP, this.dashboardItems, "");
+            outcome.putDataSetEntryWithOptions(DashboardManagementConstants.FIELD_DASHBOARD_ITEM_TO_MENU_ITEM_LIST, FieldType.ENUMERATION_MAP, this.menuItemsToDashboardItems, "");
+            outcome.putDataSetEntry(DashboardManagementConstants.FIELD_ITEMS_ORDER, FieldType.TEXT, String.join(",", this.dashboardItems.keySet()));
+        }
+        return outcome;
+    }
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementConstants.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementConstants.java
new file mode 100644
index 00000000000..c9dcf70e2fd
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardManagementConstants.java
@@ -0,0 +1,20 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.dashboard;
+
+/**
+ * Here are declared constants of process dashboard_management.xml.
+ */
+public class DashboardManagementConstants {
+    public static final String PROCESS_IDENTIFIER = "dashboard_management";
+    public static final String TASK_CONFIGURE = "configure";
+    public static final String FIELD_ID = "dashboard_id";
+    public static final String FIELD_NAME = "dashboard_name";
+    public static final String FIELD_LOGO = "dashboard_logo";
+    public static final String FIELD_DASHBOARD_ITEM_LIST = "dashboard_item_list";
+    public static final String FIELD_DASHBOARD_ITEM_TO_MENU_ITEM_LIST = "dashboard_item_to_menu_item";
+    public static final String FIELD_SIMPLE_DASHBOARD = "simple_dashboard_toolbar";
+    public static final String FIELD_PROFILE_DASHBOARD = "profile_dashboard_toolbar";
+    public static final String FIELD_LANGUAGE_DASHBOARD = "language_dashboard_toolbar";
+    public static final String FIELD_LOGOUT_DASHBOARD = "logout_dashboard_toolbar";
+    public static final String FIELD_ITEMS_ORDER = "items_order";
+    public static final String FIELD_ADD_NEW_ITEM = "add_new_item";
+}
diff --git a/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardToDataSetOutcome.java b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardToDataSetOutcome.java
new file mode 100644
index 00000000000..6aebc5857fa
--- /dev/null
+++ b/nae-object-library/src/main/java/com/netgrif/application/engine/objects/workflow/domain/menu/dashboard/DashboardToDataSetOutcome.java
@@ -0,0 +1,35 @@
+package com.netgrif.application.engine.objects.workflow.domain.menu.dashboard;
+
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
+import com.netgrif.application.engine.objects.petrinet.domain.dataset.FieldType;
+import com.netgrif.application.engine.objects.workflow.domain.menu.ToDataSetOutcome;
+import jakarta.annotation.Nullable;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+public class DashboardToDataSetOutcome extends ToDataSetOutcome {
+    public void putDataSetEntryWithOptions(String fieldId, FieldType fieldType, @Nullable Map<String, I18nString> options, @Nullable Object fieldValue){
+        Map<String, Object> fieldMap = new LinkedHashMap<>();
+
+        fieldMap.put("type", fieldType.getName());
+        if (fieldType.equals(FieldType.MULTICHOICE_MAP)) {
+            fieldMap.put("value", Set.of());
+        }
+        if (options == null) {
+            options = new HashMap<>();
+        }
+        fieldMap.put("options", options);
+        fieldMap.put("value", fieldValue);
+        this.getDataSet().put(fieldId, fieldMap);
+    }
+}
diff --git a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java
index ae33ae757cd..f05f726a5ab 100644
--- a/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java
+++ b/nae-spring-core-adapter/src/main/java/com/netgrif/application/engine/adapter/spring/elastic/domain/ElasticPetriNet.java
@@ -1,5 +1,6 @@
 package com.netgrif.application.engine.adapter.spring.elastic.domain;
 
+import com.netgrif.application.engine.objects.petrinet.domain.I18nString;
 import com.netgrif.application.engine.objects.petrinet.domain.PetriNet;
 import lombok.NoArgsConstructor;
 import org.springframework.data.annotation.Id;
@@ -9,6 +10,9 @@
 import org.springframework.data.elasticsearch.annotations.FieldType;
 
 import java.time.LocalDateTime;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Set;
 
 import static org.springframework.data.elasticsearch.annotations.FieldType.Keyword;
 
@@ -59,4 +63,12 @@ public String getInitials() {
     public LocalDateTime getCreationDate() {
         return super.getCreationDate();
     }
+
+    protected I18nField transformToField(I18nString field) {
+        Set<String> keys =  field.getTranslations().keySet();
+        Set<String> values = new HashSet<>(field.getTranslations().values());
+        HashMap<String, String> translations = new HashMap<>(field.getTranslations());
+        values.add(field.getDefaultValue());
+        return new I18nField(keys, values, translations);
+    }
 }
