diff --git a/entity/Appointment_entity/Appointment_entity.aod b/entity/Appointment_entity/Appointment_entity.aod
index 6f51538041ffc0b890e44450ea85fd73235b5185..2b98d6bd2c33292ef54ca82d1d5c8f624b353cbf 100644
--- a/entity/Appointment_entity/Appointment_entity.aod
+++ b/entity/Appointment_entity/Appointment_entity.aod
@@ -171,11 +171,6 @@
     </entityParameter>
     <entityConsumer>
       <name>AppointmentLinks</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>AppointmentLink_entity</entityName>
-        <fieldName>Links</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AppointmentId_param</name>
@@ -187,6 +182,11 @@
           <expose v="false" />
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>AppointmentLink_entity</entityName>
+        <fieldName>Links</fieldName>
+      </dependency>
     </entityConsumer>
     <entityActionField>
       <name>deleteSeries</name>
@@ -254,6 +254,11 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityParameter>
+      <name>ErrorOnPermissionDenied</name>
+      <valueProcess>%aditoprj%/entity/Appointment_entity/entityfields/erroronpermissiondenied/valueProcess.js</valueProcess>
+      <expose v="true" />
+    </entityParameter>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Appointment_entity/entityfields/erroronpermissiondenied/valueProcess.js b/entity/Appointment_entity/entityfields/erroronpermissiondenied/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..e5bfa3bbe7f58d2ffaf401248014a6d1a560d2de
--- /dev/null
+++ b/entity/Appointment_entity/entityfields/erroronpermissiondenied/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("true");
\ No newline at end of file
diff --git a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
index 3d5ff22eafe395331b6e6d52bf359b60c6d91098..709bfac8d00e3b805a383dc0c78c0cb8b91a07d1 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/contentProcess.js
@@ -1,3 +1,4 @@
+import("Calendar_lib");
 import("Employee_lib");
 import("system.tools");
 import("system.db");
@@ -28,14 +29,14 @@ if(vars.exists("$param.Entry_param") && vars.get("$param.Entry_param"))
 
     //@TODO Icon 
     result.object([
-        buildEntry(entry, masterEntry)
+        CalendarUtil.buildEntry(entry, masterEntry)
     ]);
 }
 
 else if(vars.get("$sys.recordstate") != neon.OPERATINGSTATE_NEW && vars.get("$local.idvalues") != null && vars.get("$local.idvalues") != "")
 {
     var selectedids = vars.get("$local.idvalues");
-    result.object([buildEntry(calendars.getEntry(selectedids, null, null), null)]);
+    result.object([CalendarUtil.buildEntry(calendars.getEntry(selectedids, null, null), null)]);
 }
 
 else if(vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
@@ -43,7 +44,7 @@ else if(vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
     var contactid = EmployeeUtils.getCurrentContactId();
     
     appointmentSelect.whereIfSet("AB_APPOINTMENTLINK.OBJECT_ROWID", contactid)
-    result.object(buildEntriesFromUids(appointmentSelect.table()));
+    result.object(CalendarUtil.buildEntriesFromUids(appointmentSelect.table()));
 }
 
 /**
@@ -52,78 +53,5 @@ else if(vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
 else if(vars.getString("$param.LinkedObjectId_param") != undefined)
 {
     appointmentSelect.whereIfSet("AB_APPOINTMENTLINK.OBJECT_ROWID", "$param.LinkedObjectId_param")
-    result.object(buildEntriesFromUids(appointmentSelect.table()));
-}
-
-function buildEntriesFromUids(appointmentUids)
-{
-    var entryArray = new Array(appointmentUids.length);
-    
-    for(var i = 0; i < appointmentUids.length; i++)
-        entryArray[i] = buildEntry(calendars.getEntry(appointmentUids[i], null, null), null);
-    
-    return entryArray;
-}
-
-
-function buildEntry(pEntry, pMasterentry)
-{
-    var uid = pEntry[calendars.ID];    
-    var summary = pEntry[calendars.SUMMARY];
-    var attendees = pEntry[calendars.AFFECTEDUSERS];
-    var startdate = pEntry[calendars.DTSTART];
-    var enddate = pEntry[calendars.DTEND];
-    var links = pEntry[calendars.LINKS];
-    var description = pEntry[calendars.DESCRIPTION];
-    if(pEntry[calendars.ORGANIZER2] != undefined)
-        var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"];
-    if(pEntry[calendars.USER2] != undefined)
-        var owner = JSON.stringify(pEntry[calendars.USER2]);
-    var status = pEntry[calendars.STATUS];
-    var location = pEntry[calendars.LOCATION];
-    var reminder = pEntry[calendars.REMINDER_DURATION];
-    var remindercheck = pEntry[calendars.HASREMINDER]
-    var classification = pEntry[calendars.CLASSIFICATION];
-    var transparency = pEntry[calendars.TRANSPARENCY];
-    var categories = pEntry[calendars.CATEGORIES];
-    var isAllDay = pEntry["X-ADITO-ISALLDAYEVENT"] != null ? pEntry["X-ADITO-ISALLDAYEVENT"] : "FALSE";
-    
-    var masterBegin = pMasterentry != null ? pMasterentry[calendars.DTSTART] : null
-    var masterEnd = pMasterentry != null ? pMasterentry[calendars.DTEND] : null
-    
-    // Recurrence
-    var recurrenceID = pEntry[calendars.RECURRENCEID];
-    var rrule = null;
-    if (pMasterentry != null) { // Entry is a recurrence exception, therefore get rrule from master
-        rrule = pMasterentry[calendars.RRULE] != null ? pMasterentry[calendars.RRULE][0] : null;
-    } else {
-        rrule = pEntry[calendars.RRULE] != null ? pEntry[calendars.RRULE][0] : null;
-    }
-    
-    return [
-            uid, 
-            attendees.length, 
-            startdate, 
-            enddate, 
-            summary, 
-            organizer,
-            owner,
-            attendees, 
-            status,  
-            description, 
-            location, 
-            '', 
-            isAllDay,
-            classification,
-            transparency, 
-            categories, 
-            reminder, 
-            remindercheck, 
-            rrule, 
-            recurrenceID, 
-            null, 
-            masterBegin, 
-            masterEnd,
-            null
-        ];
+    result.object(CalendarUtil.buildEntriesFromUids(appointmentSelect.table()));
 }
diff --git a/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js b/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js
index afff252f743faff586199e13333a707e5d52c51e..d6495461f9409c2d28cd62951d09cc6797a4eb69 100644
--- a/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js
+++ b/entity/Appointment_entity/recordcontainers/jdito/rowCountProcess.js
@@ -1,3 +1,4 @@
+import("Calendar_lib");
 import("system.db");
 import("Employee_lib");
 import("Sql_lib");
@@ -5,7 +6,7 @@ import("system.vars");
 import("system.result");
 
 var rowCount = "0";
-var cond = newSelect("count(APPOINTMENT_ID)")
+var cond = newSelect("APPOINTMENT_ID")
                .from("AB_APPOINTMENTLINK");
 
 if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
@@ -13,7 +14,7 @@ if (vars.exists("$local.idvalues") && vars.get("$local.idvalues"))
 else if (vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
 {
     cond.whereIfSet("AB_APPOINTMENTLINK.OBJECT_ROWID", EmployeeUtils.getCurrentContactId());
-    rowCount = cond.cell();
+    rowCount = CalendarUtil.countEntriesFromUids(cond.table());
 }
 
 /**
@@ -22,7 +23,7 @@ else if (vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
 else if (vars.getString("$param.LinkedObjectId_param") != undefined)
 {
     cond.whereIfSet("AB_APPOINTMENTLINK.OBJECT_ROWID", "$param.LinkedObjectId_param");
-    rowCount = cond.cell();
+    rowCount = CalendarUtil.countEntriesFromUids(cond.table());
 }
 /**
  * Will be used, if the user is operating the calendar.
diff --git a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
index bae83161b6a2b2580cbc7734093346ce3596a028..60d85496e220808f40709d4fd7fc80bbba176c0a 100644
--- a/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
+++ b/entity/BulkMailRecipient_entity/BulkMailRecipient_entity.aod
@@ -121,6 +121,13 @@
           <iconId>VAADIN:BAN</iconId>
           <tooltipProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/removewithcommrestriction/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>startMarketingWorkflows</name>
+          <title>Start marketing mailing</title>
+          <onActionProcess>%aditoprj%/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconId>VAADIN:ENVELOPES</iconId>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityField>
diff --git a/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js b/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..cbe91449e5c258643491b9020a7bc6d1b534e7ec
--- /dev/null
+++ b/entity/BulkMailRecipient_entity/entityfields/recipientactions/children/startmarketingworkflows/onActionProcess.js
@@ -0,0 +1,34 @@
+import("Util_lib");
+import("system.entities");
+import("Context_lib");
+import("system.vars");
+import("system.neon");
+
+var rows = vars.get("$sys.selectionRows");
+var filter = vars.get("$sys.filter").filter;
+var targets = [];
+
+if (Utils.isNullOrEmpty(rows))
+{
+    let loadConfig = entities.createConfigForLoadingRows()
+        .entity("BulkMailRecipient_entity")
+        .provider("BulkMailRecipients")
+        .fields(["CONTACT_ID", "TARGETCONTEXT"])
+        .addParameter("BulkMailId_param", vars.get("$param.BulkMailId_param"));
+
+    if (filter)
+        loadConfig.filter(JSON.stringify(filter));
+    
+    rows = entities.getRows(loadConfig);
+}
+
+rows = rows.map(function (row)
+{
+    return [row["CONTACT_ID"], row["TARGETCONTEXT"]];
+});
+
+
+neon.openContext("MarketingWorkflowLauncher", "MarketingWorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
+    "ObjectIds_param": JSON.stringify(rows),
+    "ObjectType_param": ContextUtils.getCurrentContextId()
+});
\ No newline at end of file
diff --git a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
index 3c8e5a5655f3c8320c4188939e9588988e7b9b44..4d3b86ba02c4c01afcd977df57bbd15e493c3c08 100644
--- a/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
+++ b/entity/CampaignParticipant_entity/CampaignParticipant_entity.aod
@@ -177,6 +177,13 @@
           <tooltip>Update campaign step</tooltip>
           <tooltipProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/setsteptoparticipantselection/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>startMarketingWorkflows</name>
+          <title>Start marketing mailing</title>
+          <onActionProcess>%aditoprj%/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconId>VAADIN:ENVELOPES</iconId>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityField>
diff --git a/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..40e60ff20d2ca20af3b447981c2a988959d2de63
--- /dev/null
+++ b/entity/CampaignParticipant_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
@@ -0,0 +1,36 @@
+import("Util_lib");
+import("system.entities");
+import("Context_lib");
+import("system.vars");
+import("system.neon");
+
+var rows = vars.get("$sys.selectionRows");
+var filter = vars.get("$sys.filter").filter;
+var targets = [];
+
+if (Utils.isNullOrEmpty(rows))
+{
+    let loadConfig = entities.createConfigForLoadingRows()
+        .entity("CampaignParticipant_entity")
+        .provider("CampaignParticipantsProvider")
+        .fields(["CONTACT_ID", "CONTACTCONTEXT"])
+        .addParameter("CampaignId_param", vars.get("$param.CampaignId_param"))
+        .addParameter("CampaignStepId_param", vars.get("$param.CampaignStepId_param"))
+        .addParameter("ContactId_param", vars.get("$param.ContactId_param"));
+
+    if (filter)
+        loadConfig.filter(JSON.stringify(filter));
+    
+    rows = entities.getRows(loadConfig);
+}
+
+rows = rows.map(function (row)
+{
+    return [row["CONTACT_ID"], row["CONTACTCONTEXT"]];
+});
+
+
+neon.openContext("MarketingWorkflowLauncher", "MarketingWorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
+    "ObjectIds_param": JSON.stringify(rows),
+    "ObjectType_param": ContextUtils.getCurrentContextId()
+});
\ No newline at end of file
diff --git a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
index 9cf1d9cca301bb4240acea90684327824bbd201d..dbb9e49a3b635be85e5615422520d9f08d387aac 100644
--- a/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
+++ b/entity/DocumentTemplate_entity/DocumentTemplate_entity.aod
@@ -321,6 +321,7 @@
     <entityConsumer>
       <name>DocumentTemplatePlaceOfUse</name>
       <stateProcess>%aditoprj%/entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/stateProcess.js</stateProcess>
+      <onValidation>%aditoprj%/entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/onValidation.js</onValidation>
       <dependency>
         <name>dependency</name>
         <entityName>DocumentTemplatePlaceOfUse_entity</entityName>
diff --git a/entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/onValidation.js b/entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/onValidation.js
new file mode 100644
index 0000000000000000000000000000000000000000..a40be7eb7d8e21b088a3cf4683b41849239e35ee
--- /dev/null
+++ b/entity/DocumentTemplate_entity/entityfields/documenttemplateplaceofuse/onValidation.js
@@ -0,0 +1,14 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("Entity_lib");
+
+var usages = EntityConsumerRowsHelper.getCurrentConsumerRows("DocumentTemplatePlaceOfUse", ["PLACEOFUSE"]);
+var hasMarketingWorkflowUsage = usages.some(function (usage)
+{
+    return usage["PLACEOFUSE"] == "MarketingWorkflowLauncher";
+});
+if (hasMarketingWorkflowUsage && !vars.get("$field.Content").includes("{@workflowActionLink@}"))
+{
+    result.string(translate.text("The template must contain the placeholder for the worklow-link to use it with the marketing workflow"));
+}
diff --git a/entity/Document_entity/Document_entity.aod b/entity/Document_entity/Document_entity.aod
index 420157a37135f2b6b3fd1105810584e32ac6935e..cba9173b17cbedf17fc79b500cd69af232cb8c10 100644
--- a/entity/Document_entity/Document_entity.aod
+++ b/entity/Document_entity/Document_entity.aod
@@ -144,6 +144,26 @@
     <entityProvider>
       <name>Documents</name>
       <recordContainer>jdito</recordContainer>
+      <children>
+        <entityParameter>
+          <name>AssignmentName_param</name>
+          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/documents/children/assignmentname_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+          <documentation>%aditoprj%/entity/Document_entity/entityfields/documents/children/assignmentname_param/documentation.adoc</documentation>
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentRowId_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>AssignmentTable_param</name>
+          <expose v="true" />
+        </entityParameter>
+        <entityParameter>
+          <name>Keyword_param</name>
+          <expose v="true" />
+        </entityParameter>
+      </children>
       <dependencies>
         <entityDependency>
           <name>1eae1907-53ea-4d6f-bcf1-772052365020</name>
@@ -225,7 +245,7 @@
         </entityDependency>
         <entityDependency>
           <name>2e6fcf27-ee98-4f7d-a99d-7ce02774076b</name>
-          <entityName>UserhelpResources</entityName>
+          <entityName>UserhelpResources_entity</entityName>
           <fieldName>Documents</fieldName>
           <isConsumer v="false" />
         </entityDependency>
@@ -242,12 +262,23 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
+    </entityProvider>
+    <entityProvider>
+      <name>MainDocuments</name>
+      <recordContainer>jdito</recordContainer>
       <children>
+        <entityParameter>
+          <name>Keyword_param</name>
+          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/keyword_param/valueProcess.js</valueProcess>
+          <expose v="true" />
+          <mandatory v="true" />
+          <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
+        </entityParameter>
         <entityParameter>
           <name>AssignmentName_param</name>
-          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/documents/children/assignmentname_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/assignmentname_param/valueProcess.js</valueProcess>
           <expose v="true" />
-          <documentation>%aditoprj%/entity/Document_entity/entityfields/documents/children/assignmentname_param/documentation.adoc</documentation>
+          <documentation>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/assignmentname_param/documentation.adoc</documentation>
         </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
@@ -258,14 +289,10 @@
           <expose v="true" />
         </entityParameter>
         <entityParameter>
-          <name>Keyword_param</name>
-          <expose v="true" />
+          <name>DisallowCreate_param</name>
+          <expose v="false" />
         </entityParameter>
       </children>
-    </entityProvider>
-    <entityProvider>
-      <name>MainDocuments</name>
-      <recordContainer>jdito</recordContainer>
       <dependencies>
         <entityDependency>
           <name>87d738a5-5d5e-425e-b013-007371475a38</name>
@@ -310,33 +337,6 @@
           <isConsumer v="false" />
         </entityDependency>
       </dependencies>
-      <children>
-        <entityParameter>
-          <name>Keyword_param</name>
-          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/keyword_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-          <mandatory v="true" />
-          <description>TODO: expose auf false. aktuell wird der Code nicht ausgeführt, wenn Expose false ist.</description>
-        </entityParameter>
-        <entityParameter>
-          <name>AssignmentName_param</name>
-          <valueProcess>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/assignmentname_param/valueProcess.js</valueProcess>
-          <expose v="true" />
-          <documentation>%aditoprj%/entity/Document_entity/entityfields/maindocuments/children/assignmentname_param/documentation.adoc</documentation>
-        </entityParameter>
-        <entityParameter>
-          <name>AssignmentRowId_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>AssignmentTable_param</name>
-          <expose v="true" />
-        </entityParameter>
-        <entityParameter>
-          <name>DisallowCreate_param</name>
-          <expose v="false" />
-        </entityParameter>
-      </children>
     </entityProvider>
     <entityParameter>
       <name>DisallowCreate_param</name>
@@ -346,14 +346,6 @@
     <entityProvider>
       <name>SingleDocument</name>
       <titlePlural>Document</titlePlural>
-      <dependencies>
-        <entityDependency>
-          <name>91f87622-d0e8-43c6-99a0-5f9cebf79aaf</name>
-          <entityName>SerialLetter_entity</entityName>
-          <fieldName>Documents</fieldName>
-          <isConsumer v="false" />
-        </entityDependency>
-      </dependencies>
       <children>
         <entityParameter>
           <name>AssignmentName_param</name>
@@ -365,6 +357,14 @@
           <expose v="true" />
         </entityParameter>
       </children>
+      <dependencies>
+        <entityDependency>
+          <name>91f87622-d0e8-43c6-99a0-5f9cebf79aaf</name>
+          <entityName>SerialLetter_entity</entityName>
+          <fieldName>Documents</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
     </entityProvider>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/EmployeeToken_entity/EmployeeToken_entity.aod b/entity/EmployeeToken_entity/EmployeeToken_entity.aod
new file mode 100644
index 0000000000000000000000000000000000000000..0303a7a0bc5d1bd5989b3bdc68d335f64e921ad4
--- /dev/null
+++ b/entity/EmployeeToken_entity/EmployeeToken_entity.aod
@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.17" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.17">
+  <name>EmployeeToken_entity</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <title>User token</title>
+  <titlePlural>User tokens</titlePlural>
+  <recordContainer>db</recordContainer>
+  <entityFields>
+    <entityProvider>
+      <name>#PROVIDER</name>
+    </entityProvider>
+    <entityProvider>
+      <name>#PROVIDER_AGGREGATES</name>
+      <useAggregates v="true" />
+    </entityProvider>
+    <entityField>
+      <name>ID</name>
+      <title>Token</title>
+    </entityField>
+    <entityField>
+      <name>VALID_STATUS_ICON</name>
+      <title>Valid</title>
+      <colorProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/valid_status_icon/colorProcess.js</colorProcess>
+      <contentType>IMAGE</contentType>
+      <mandatory v="false" />
+      <displayValueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/valid_status_icon/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>VALID_TO</name>
+      <title>Valid to</title>
+      <contentType>DATE</contentType>
+      <mandatory v="false" />
+    </entityField>
+    <entityField>
+      <name>GROUP_ID</name>
+      <title>Group</title>
+      <mandatory v="true" />
+      <dropDownProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id/dropDownProcess.js</dropDownProcess>
+      <textInputAllowed v="true" />
+      <stateProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id/stateProcess.js</stateProcess>
+      <valueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id/valueProcess.js</valueProcess>
+      <displayValueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id/displayValueProcess.js</displayValueProcess>
+    </entityField>
+    <entityField>
+      <name>LOGIN_USER_ID</name>
+      <title>User</title>
+      <valueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/login_user_id/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>VALID_FROM</name>
+      <title>Valid from</title>
+      <contentType>DATE</contentType>
+      <mandatory v="false" />
+      <valueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/valid_from/valueProcess.js</valueProcess>
+    </entityField>
+    <entityProvider>
+      <name>EmployeeTokenProvider</name>
+      <dependencies>
+        <entityDependency>
+          <name>08c3e88c-5119-477e-8374-3f89bbc4ded0</name>
+          <entityName>Employee_entity</entityName>
+          <fieldName>EmployeeTokens</fieldName>
+          <isConsumer v="false" />
+        </entityDependency>
+      </dependencies>
+    </entityProvider>
+    <entityParameter>
+      <name>employeeId_param</name>
+      <expose v="true" />
+    </entityParameter>
+    <entityField>
+      <name>VALID</name>
+      <title>Valid</title>
+      <contentType>BOOLEAN</contentType>
+      <mandatory v="true" />
+      <valueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/valid/valueProcess.js</valueProcess>
+    </entityField>
+    <entityField>
+      <name>GROUP_ID_DISPLAY</name>
+      <title>Group</title>
+      <stateProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id_display/stateProcess.js</stateProcess>
+      <displayValueProcess>%aditoprj%/entity/EmployeeToken_entity/entityfields/group_id_display/displayValueProcess.js</displayValueProcess>
+    </entityField>
+  </entityFields>
+  <recordContainers>
+    <dbRecordContainer>
+      <name>db</name>
+      <alias>_____SYSTEMALIAS</alias>
+      <conditionProcess>%aditoprj%/entity/EmployeeToken_entity/recordcontainers/db/conditionProcess.js</conditionProcess>
+      <linkInformation>
+        <linkInformation>
+          <name>98f70a7c-4e43-4984-ad69-44339150f1ee</name>
+          <tableName>ASYS_USERTOKEN</tableName>
+          <primaryKey>ID</primaryKey>
+          <isUIDTable v="true" />
+          <readonly v="false" />
+        </linkInformation>
+      </linkInformation>
+      <recordFieldMappings>
+        <dbRecordFieldMapping>
+          <name>ID.value</name>
+          <recordfield>ASYS_USERTOKEN.ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VALID_STATUS_ICON.value</name>
+          <recordfield>ASYS_USERTOKEN.VALID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VALID_TO.value</name>
+          <recordfield>ASYS_USERTOKEN.VALID_TO</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>GROUP_ID.value</name>
+          <recordfield>ASYS_USERTOKEN.GROUP_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>LOGIN_USER_ID.value</name>
+          <recordfield>ASYS_USERTOKEN.LOGIN_USER_ID</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VALID_FROM.value</name>
+          <recordfield>ASYS_USERTOKEN.VALID_FROM</recordfield>
+        </dbRecordFieldMapping>
+        <dbRecordFieldMapping>
+          <name>VALID.value</name>
+          <recordfield>ASYS_USERTOKEN.VALID</recordfield>
+        </dbRecordFieldMapping>
+      </recordFieldMappings>
+    </dbRecordContainer>
+  </recordContainers>
+</entity>
diff --git a/entity/EmployeeToken_entity/entityfields/group_id/displayValueProcess.js b/entity/EmployeeToken_entity/entityfields/group_id/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..b8857b8ffd70bbb62ff1dce0e3eff18072071bc1
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id/displayValueProcess.js
@@ -0,0 +1,5 @@
+import("system.vars");
+import("system.translate");
+import("system.result");
+
+result.string(translate.text(vars.get("$this.value")));
diff --git a/entity/EmployeeToken_entity/entityfields/group_id/dropDownProcess.js b/entity/EmployeeToken_entity/entityfields/group_id/dropDownProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..623334e4f6e5cbcc5bfb6cd3b81bcd2c5e77c935
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id/dropDownProcess.js
@@ -0,0 +1,16 @@
+import("system.vars");
+import("system.logging");
+import("system.translate");
+import("system.result");
+
+
+var rawElements = ["#login"];
+
+var resultName = [[]];
+
+for (var i = 0; i < rawElements.length; i++)
+{​​​​​
+    var translation = translate.text(rawElements[i]);
+    resultName[i] = [rawElements[i], translation];
+}​​​​​
+result.object(resultName);
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/group_id/stateProcess.js b/entity/EmployeeToken_entity/entityfields/group_id/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..95a51884cfd65c5baad3dfd7052b2eaa8d88c014
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id/stateProcess.js
@@ -0,0 +1,8 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+if (vars.get("$this.value") == "#rememberme")
+{
+  result.object(neon.COMPONENTSTATE_INVISIBLE);
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/group_id/valueProcess.js b/entity/EmployeeToken_entity/entityfields/group_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a5687a87183f89fa8fb0bc1eb973c624f8bf550
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id/valueProcess.js
@@ -0,0 +1,12 @@
+import("system.translate");
+import("system.datetime");
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+     result.string("#login");
+}
+
+   
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/group_id_display/displayValueProcess.js b/entity/EmployeeToken_entity/entityfields/group_id_display/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..bcdae240e819ca56b8698b135a391247a52abf12
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id_display/displayValueProcess.js
@@ -0,0 +1,4 @@
+import("system.translate");
+import("system.result");
+
+result.string(translate.text("#rememberme"));
diff --git a/entity/EmployeeToken_entity/entityfields/group_id_display/stateProcess.js b/entity/EmployeeToken_entity/entityfields/group_id_display/stateProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3193715cde37ad50aa8d4e379ad0e1ef98d80919
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/group_id_display/stateProcess.js
@@ -0,0 +1,13 @@
+import("system.translate");
+import("system.result");
+import("system.vars");
+import("system.neon");
+
+if (vars.get("$field.GROUP_ID") == "#rememberme")
+{
+    vars.set("$field.GROUP_ID_DISPLAY", translate.text("#rememberme"));
+    result.object(neon.COMPONENTSTATE_READONLY);
+    
+} else {
+    result.object(neon.COMPONENTSTATE_INVISIBLE);
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/login_user_id/valueProcess.js b/entity/EmployeeToken_entity/entityfields/login_user_id/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..3559d3173e4aec628d202cba352b9d1dacd36ebb
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/login_user_id/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.util");
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) // &&!vars.get("$this.value"))
+{
+  result.string(vars.get("$param.employeeId_param"));
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/valid/valueProcess.js b/entity/EmployeeToken_entity/entityfields/valid/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..365ab4d8ed55e67e2976d51f5f344c39b87fb03c
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/valid/valueProcess.js
@@ -0,0 +1,8 @@
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+     result.string("1");
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/valid_from/valueProcess.js b/entity/EmployeeToken_entity/entityfields/valid_from/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..0859e9d5c4e7d5b3df77c352c2aa455d1d0ff090
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/valid_from/valueProcess.js
@@ -0,0 +1,9 @@
+import("system.datetime");
+import("system.neon");
+import("system.result");
+import("system.vars");
+
+if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$this.value"))
+{
+     result.object(datetime.date());
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/entityfields/valid_status_icon/colorProcess.js b/entity/EmployeeToken_entity/entityfields/valid_status_icon/colorProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..deb8250edaf71db8d987585811d8032aefac62f5
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/valid_status_icon/colorProcess.js
@@ -0,0 +1,13 @@
+import("system.result");
+import("system.vars");
+import("system.neon");
+                
+if(vars.get("$field.VALID") == 1)
+{
+    result.string(neon.PRIORITY_LOW_COLOR);
+}
+else
+{
+    result.string(neon.PRIORITY_HIGH_COLOR);
+}
+
diff --git a/entity/EmployeeToken_entity/entityfields/valid_status_icon/displayValueProcess.js b/entity/EmployeeToken_entity/entityfields/valid_status_icon/displayValueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..db3e32fd16f6d4023d039fcff0f6b950f0e517df
--- /dev/null
+++ b/entity/EmployeeToken_entity/entityfields/valid_status_icon/displayValueProcess.js
@@ -0,0 +1,12 @@
+import("system.result");
+import("system.vars");
+
+// Now show warning always, if any commrestriction exists. No matter which medium the current step has.
+if (vars.get("$field.VALID") == 1)
+{
+    result.string("VAADIN:CHECK");
+}
+else
+{
+    result.string("VAADIN:CLOSE");
+}
\ No newline at end of file
diff --git a/entity/EmployeeToken_entity/recordcontainers/db/conditionProcess.js b/entity/EmployeeToken_entity/recordcontainers/db/conditionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..1fdb9ffc999c069fc4cd2092f6ad030980580319
--- /dev/null
+++ b/entity/EmployeeToken_entity/recordcontainers/db/conditionProcess.js
@@ -0,0 +1,23 @@
+import("system.db");
+import("system.neon");
+import("system.result");
+import("system.vars");
+import("Employee_lib");
+import("Sql_lib");
+
+
+var userTitle = vars.get("$param.employeeId_param");
+if(userTitle)
+{
+    result.string(newWhere("ASYS_USERTOKEN.LOGIN_USER_ID", vars.get("$param.employeeId_param")).toString());
+//} else if (recordState != neon.OPERATINGSTATE_NEW && recordState != neon.OPERATINGSTATE_EDIT) {
+//    var condition = new SqlBuilder()
+//        .whereIfSet("STEPDATESTART_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID")
+//        .andIfSet("STEPDATEEND_TABLEALIAS.CAMPAIGN_ID = CAMPAIGN.CAMPAIGNID")
+//        ;
+//
+//    result.string(condition.toString());
+//} else {
+//    
+//    result.string(newWhere().toString());
+}
\ No newline at end of file
diff --git a/entity/Employee_entity/Employee_entity.aod b/entity/Employee_entity/Employee_entity.aod
index c3144f1349c9b1618e1f5d48999a1152564db3a8..c6c1df49e89ca1dde5d9de14f50e8f38a120fe4c 100644
--- a/entity/Employee_entity/Employee_entity.aod
+++ b/entity/Employee_entity/Employee_entity.aod
@@ -4,6 +4,7 @@
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <documentation>%aditoprj%/entity/Employee_entity/documentation.adoc</documentation>
   <title>Employee</title>
+  <siblings />
   <grantDeleteProcess>%aditoprj%/entity/Employee_entity/grantDeleteProcess.js</grantDeleteProcess>
   <contentTitleProcess>%aditoprj%/entity/Employee_entity/contentTitleProcess.js</contentTitleProcess>
   <afterUiInit>%aditoprj%/entity/Employee_entity/afterUiInit.js</afterUiInit>
@@ -395,6 +396,20 @@
       <name>DepartmentAttrIdByEmployeeContactId_param</name>
       <expose v="true" />
     </entityParameter>
+    <entityConsumer>
+      <name>EmployeeTokens</name>
+      <dependency>
+        <name>dependency</name>
+        <entityName>EmployeeToken_entity</entityName>
+        <fieldName>EmployeeTokenProvider</fieldName>
+      </dependency>
+      <children>
+        <entityParameter>
+          <name>employeeId_param</name>
+          <valueProcess>%aditoprj%/entity/Employee_entity/entityfields/employeetokens/children/employeeid_param/valueProcess.js</valueProcess>
+        </entityParameter>
+      </children>
+    </entityConsumer>
   </entityFields>
   <recordContainers>
     <jDitoRecordContainer>
diff --git a/entity/Employee_entity/entityfields/employeetokens/children/employeeid_param/valueProcess.js b/entity/Employee_entity/entityfields/employeetokens/children/employeeid_param/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..470eab86ed8cf58f3bffe0ee46e6b1f68163ac3f
--- /dev/null
+++ b/entity/Employee_entity/entityfields/employeetokens/children/employeeid_param/valueProcess.js
@@ -0,0 +1,4 @@
+import("system.result");
+import("system.vars");
+
+result.string(vars.get("$field.TITLE"));
diff --git a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
index 40b9b39c8993d2b421f368b11fca27d80abb24f5..791b08d72b2e85a807d11a6c47284056ae16a977 100644
--- a/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
+++ b/entity/MarketingWorkflowLauncher_entity/MarketingWorkflowLauncher_entity.aod
@@ -14,7 +14,7 @@
     </entityProvider>
     <entityField>
       <name>DOCUMENTTEMPLATE_ID</name>
-      <title>Document template</title>
+      <title>Document Template</title>
       <consumer>EmailTemplates</consumer>
       <mandatory v="true" />
       <state>EDITABLE</state>
@@ -80,6 +80,7 @@
   <recordContainers>
     <datalessRecordContainer>
       <name>dataLess</name>
+      <alias>Data_alias</alias>
     </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/processvariables_param/valueProcess.js b/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/processvariables_param/valueProcess.js
index b81df3d4fb93fc9608febd7783247052a61d4acd..cea637a710a0e3e0903248241654aec944c88137 100644
--- a/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/processvariables_param/valueProcess.js
+++ b/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/processvariables_param/valueProcess.js
@@ -2,6 +2,7 @@ import("system.vars");
 import("system.result");
 
 var variables = {
-    documentTemplate: vars.get("$field.DOCUMENTTEMPLATE_ID")
+    documentTemplateId: vars.get("$field.DOCUMENTTEMPLATE_ID"),
+    originUrl: vars.get("$sys.origin")
 };
 result.string(JSON.stringify(variables));
\ No newline at end of file
diff --git a/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js b/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js
index 6a28aafa528aa4130e913b642f80e04cfadc8b19..cca5f0e8d7ce5b6b8bb2ad60f3ffb068c4c6f1a1 100644
--- a/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js
+++ b/entity/MarketingWorkflowLauncher_entity/entityfields/workflowlauncherintegration/children/targets_param/valueProcess.js
@@ -1,13 +1,17 @@
 import("Util_lib");
 import("system.vars");
 import("system.result");
+import("FilterViewAction_lib");
 
 var context = vars.get("$param.ObjectType_param");
-var targets = Utils.parseJSON(vars.get("$param.ObjectIds_param")) || [];
-targets = targets.map(function (targetId)
+var targets = Utils.parseJSON(vars.get("$param.ObjectIds_param"));
+var filter = Utils.parseJSON(vars.get("$param.ObjectFilter_param"));
+
+targets = FilterViewActionUtils.getUidsBySelectionOrFilter(context, targets, filter).map(function (targetId)
 {
     if (Utils.isString(targetId))
         return [targetId, context]; //todo: context dynamic (eg for participants)
     return targetId;
 });
+
 result.string(JSON.stringify(targets));
\ No newline at end of file
diff --git a/entity/Organisation_entity/Organisation_entity.aod b/entity/Organisation_entity/Organisation_entity.aod
index 4d5db6ed1a8789383791d9793b7c5791ae8f30a6..50afcd2e32295cc01c67e21a154d33520e99a7ce 100644
--- a/entity/Organisation_entity/Organisation_entity.aod
+++ b/entity/Organisation_entity/Organisation_entity.aod
@@ -812,6 +812,10 @@
           <name>LinkedObjectId_param</name>
           <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/linkedappointments/children/linkedobjectid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>ErrorOnPermissionDenied</name>
+          <valueProcess>%aditoprj%/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityConsumer>
@@ -955,6 +959,13 @@
           <tooltip>Export fields of this table</tooltip>
           <tooltipProcess>%aditoprj%/entity/Organisation_entity/entityfields/filterviewactiongroup/children/export/tooltipProcess.js</tooltipProcess>
         </entityActionField>
+        <entityActionField>
+          <name>startMarketingWorkflows</name>
+          <title>Start marketing mailing</title>
+          <onActionProcess>%aditoprj%/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
+          <isObjectAction v="false" />
+          <iconId>VAADIN:ENVELOPES</iconId>
+        </entityActionField>
       </children>
     </entityActionGroup>
     <entityActionField>
diff --git a/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js b/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..2b04867cc90fd72a300747605800b32664d4b5b4
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
@@ -0,0 +1,9 @@
+import("Context_lib");
+import("system.vars");
+import("system.neon");
+
+neon.openContext("MarketingWorkflowLauncher", "MarketingWorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
+    "ObjectIds_param": JSON.stringify(vars.get("$sys.selection")),
+    "ObjectFilter_param": JSON.stringify(vars.get("$sys.filter")),
+    "ObjectType_param": ContextUtils.getCurrentContextId()
+});
\ No newline at end of file
diff --git a/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js b/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..15b1f8d0322593145f40d707c61dfdfd9babf0fe
--- /dev/null
+++ b/entity/Organisation_entity/entityfields/linkedappointments/children/erroronpermissiondenied/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("false");
\ No newline at end of file
diff --git a/entity/Person_entity/Person_entity.aod b/entity/Person_entity/Person_entity.aod
index c66ce949329c5b9e71486cb5802b41b0b2244ddf..42f436e7093dbe2303fabd9df2a098fc792ca049 100644
--- a/entity/Person_entity/Person_entity.aod
+++ b/entity/Person_entity/Person_entity.aod
@@ -884,6 +884,10 @@
           <name>LinkedObjectId_param</name>
           <valueProcess>%aditoprj%/entity/Person_entity/entityfields/appointments/children/linkedobjectid_param/valueProcess.js</valueProcess>
         </entityParameter>
+        <entityParameter>
+          <name>ErrorOnPermissionDenied</name>
+          <valueProcess>%aditoprj%/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js</valueProcess>
+        </entityParameter>
       </children>
     </entityConsumer>
     <entityField>
@@ -1099,9 +1103,10 @@
         </entityActionField>
         <entityActionField>
           <name>startMarketingWorkflows</name>
-          <title>Marketing Workflow</title>
+          <title>Start marketing mailing</title>
           <onActionProcess>%aditoprj%/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js</onActionProcess>
           <isObjectAction v="false" />
+          <iconId>VAADIN:ENVELOPES</iconId>
         </entityActionField>
       </children>
     </entityActionGroup>
diff --git a/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js b/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js
new file mode 100644
index 0000000000000000000000000000000000000000..15b1f8d0322593145f40d707c61dfdfd9babf0fe
--- /dev/null
+++ b/entity/Person_entity/entityfields/appointments/children/erroronpermissiondenied/valueProcess.js
@@ -0,0 +1,3 @@
+import("system.result");
+
+result.string("false");
\ No newline at end of file
diff --git a/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js b/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
index 3e462ab4498eb4215bac2daa8457aee59ae8cd2a..2b04867cc90fd72a300747605800b32664d4b5b4 100644
--- a/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
+++ b/entity/Person_entity/entityfields/filterviewactiongroup/children/startmarketingworkflows/onActionProcess.js
@@ -4,5 +4,6 @@ import("system.neon");
 
 neon.openContext("MarketingWorkflowLauncher", "MarketingWorkflowLauncherEdit_view", null, neon.OPERATINGSTATE_VIEW, {
     "ObjectIds_param": JSON.stringify(vars.get("$sys.selection")),
+    "ObjectFilter_param": JSON.stringify(vars.get("$sys.filter")),
     "ObjectType_param": ContextUtils.getCurrentContextId()
 });
\ No newline at end of file
diff --git a/entity/UserhelpResources/UserhelpResources.aod b/entity/UserhelpResources_entity/UserhelpResources_entity.aod
similarity index 70%
rename from entity/UserhelpResources/UserhelpResources.aod
rename to entity/UserhelpResources_entity/UserhelpResources_entity.aod
index 7775d3fd5a4ba8d43ec112062c7772b437bd68c9..32f253d41162e3e5c8b4e33f1bcba45bdc803965 100644
--- a/entity/UserhelpResources/UserhelpResources.aod
+++ b/entity/UserhelpResources_entity/UserhelpResources_entity.aod
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.17" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.17">
-  <name>UserhelpResources</name>
+  <name>UserhelpResources_entity</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
-  <documentation>%aditoprj%/entity/UserhelpResources/documentation.adoc</documentation>
+  <documentation>%aditoprj%/entity/UserhelpResources_entity/documentation.adoc</documentation>
   <entityFields>
     <entityProvider>
       <name>#PROVIDER</name>
@@ -12,21 +12,21 @@
     </entityField>
     <entityConsumer>
       <name>Documents</name>
-      <dependency>
-        <name>dependency</name>
-        <entityName>Document_entity</entityName>
-        <fieldName>Documents</fieldName>
-      </dependency>
       <children>
         <entityParameter>
           <name>AssignmentTable_param</name>
-          <valueProcess>%aditoprj%/entity/UserhelpResources/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/UserhelpResources_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js</valueProcess>
         </entityParameter>
         <entityParameter>
           <name>AssignmentRowId_param</name>
-          <valueProcess>%aditoprj%/entity/UserhelpResources/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
+          <valueProcess>%aditoprj%/entity/UserhelpResources_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js</valueProcess>
         </entityParameter>
       </children>
+      <dependency>
+        <name>dependency</name>
+        <entityName>Document_entity</entityName>
+        <fieldName>Documents</fieldName>
+      </dependency>
     </entityConsumer>
     <entityProvider>
       <name>#PROVIDER_AGGREGATES</name>
diff --git a/entity/UserhelpResources/documentation.adoc b/entity/UserhelpResources_entity/documentation.adoc
similarity index 100%
rename from entity/UserhelpResources/documentation.adoc
rename to entity/UserhelpResources_entity/documentation.adoc
diff --git a/entity/UserhelpResources/entityfields/documents/children/assignmentrowid_param/valueProcess.js b/entity/UserhelpResources_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
similarity index 100%
rename from entity/UserhelpResources/entityfields/documents/children/assignmentrowid_param/valueProcess.js
rename to entity/UserhelpResources_entity/entityfields/documents/children/assignmentrowid_param/valueProcess.js
diff --git a/entity/UserhelpResources/entityfields/documents/children/assignmenttable_param/valueProcess.js b/entity/UserhelpResources_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js
similarity index 100%
rename from entity/UserhelpResources/entityfields/documents/children/assignmenttable_param/valueProcess.js
rename to entity/UserhelpResources_entity/entityfields/documents/children/assignmenttable_param/valueProcess.js
diff --git a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
index f1640dc1aacfcbb6ebd9de2ce5afb3d6ca8b92c9..e5749fe5101007e83c45d26c9f24bd15561458b1 100644
--- a/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
+++ b/entity/WorkflowLauncher_entity/WorkflowLauncher_entity.aod
@@ -88,6 +88,7 @@
   <recordContainers>
     <datalessRecordContainer>
       <name>dataLess</name>
+      <alias>Data_alias</alias>
     </datalessRecordContainer>
   </recordContainers>
 </entity>
diff --git a/entity/WorkflowTask_entity/afterSave.js b/entity/WorkflowTask_entity/afterSave.js
index 383331b295d04ac28a4ea7a170827b2ce9d6e4c2..61b54c53434b45f42ffd7184e88c153966cfac5c 100644
--- a/entity/WorkflowTask_entity/afterSave.js
+++ b/entity/WorkflowTask_entity/afterSave.js
@@ -30,9 +30,9 @@ if (entityData["FORMRESULT"])
     else
     {
         var params = {
-            "TaskTitle_param" : rowData["NAME"]
+            "TaskTitle_param": entityData["NAME"]
         };
         //if you try to open the task now, it will display "Task done"
-        neon.openContext("WorkflowTask", "WorkflowTaskPreview_view", [rowData["UID"]], neon.OPERATINGSTATE_VIEW, params);
+        neon.openContext("WorkflowTask", "WorkflowTaskPreview_view", [entityData["UID"]], neon.OPERATINGSTATE_VIEW, params);
     }
 }
\ No newline at end of file
diff --git a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
index b563a3076d29b855c8dfeda7e01fccac5bb6025d..5ae81ef6a8a2856d375b73be7156726e401553e4 100644
--- a/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
+++ b/language/_____LANGUAGE_de/_____LANGUAGE_de.aod
@@ -2795,6 +2795,10 @@
       <key>new</key>
       <value>neu</value>
     </entry>
+    <entry>
+      <key>Start marketing mailing</key>
+      <value>Marketing Mailing starten</value>
+    </entry>
     <entry>
       <key>Adviser</key>
       <value>Berater</value>
@@ -6568,7 +6572,7 @@
     </entry>
     <entry>
       <key>Print reminder</key>
-      <value>Mahnung drucken</value>
+      <value>Mahnung anzeigen</value>
     </entry>
     <entry>
       <key>Rech.-Betrag</key>
@@ -6628,7 +6632,7 @@
     </entry>
     <entry>
       <key>This error should never appear - contact administrator (PermissionDetail_entity.PermissionAction.onValidation).</key>
-      <value>Dieser Fehler sollte nie erscheinen - kontaktieren sie einen Administrator (PermissionDetail_entity.PermissionAction.onValidation).</value>
+      <value>Dieser Fehler sollte nie erscheinen - kontaktieren Sie einen Administrator (PermissionDetail_entity.PermissionAction.onValidation).</value>
     </entry>
     <entry>
       <key>Empty actions are invalid!</key>
@@ -9678,6 +9682,14 @@ Bitte Datumseingabe prüfen</value>
       <key>Outstanding Amount</key>
       <value>Offener Betrag</value>
     </entry>
+    <entry>
+      <key>#rememberme</key>
+      <value>Angemeldet bleiben</value>
+    </entry>
+    <entry>
+      <key>#login</key>
+      <value>Login Token</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
index cf8d0df31f43a9a569871c3e265165a6bf38e44a..193aaea85b4963c84362c964b8e24578e77c0212 100644
--- a/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
+++ b/language/_____LANGUAGE_en/_____LANGUAGE_en.aod
@@ -7377,6 +7377,14 @@
     <entry>
       <key>Outstanding Amount</key>
     </entry>
+    <entry>
+      <key>#rememberme</key>
+      <value>Stay logged in</value>
+    </entry>
+    <entry>
+      <key>#login</key>
+      <value>Login token</value>
+    </entry>
   </keyValueMap>
   <font name="Dialog" style="0" size="11" />
 </language>
diff --git a/neonContext/EmployeeToken/EmployeeToken.aod b/neonContext/EmployeeToken/EmployeeToken.aod
new file mode 100644
index 0000000000000000000000000000000000000000..61348f1c4bae1052b4a292c41da61cd4309f34ae
--- /dev/null
+++ b/neonContext/EmployeeToken/EmployeeToken.aod
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
+  <name>EmployeeToken</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterView>EmployeeTokenFilter_view</filterView>
+  <editView>EmployeeTokenEdit_view</editView>
+  <entity>EmployeeToken_entity</entity>
+  <references>
+    <neonViewReference>
+      <name>3ba4cdfb-ed9e-4bdf-bb03-4a9106ef67d6</name>
+      <view>EmployeeTokenEdit_view</view>
+    </neonViewReference>
+    <neonViewReference>
+      <name>88ca4edd-e890-4052-b66a-ec277956853f</name>
+      <view>EmployeeTokenFilter_view</view>
+    </neonViewReference>
+  </references>
+</neonContext>
diff --git a/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod b/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod
index bad0c03850983d94a74b3d3af4896308fb1e2086..e200a8a70f878ecb8c691752d3585cf3880e5bef 100644
--- a/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod
+++ b/neonContext/MarketingWorkflowLauncher/MarketingWorkflowLauncher.aod
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1">
   <name>MarketingWorkflowLauncher</name>
-  <title>f</title>
+  <title>Marketing workflow</title>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <entity>MarketingWorkflowLauncher_entity</entity>
   <references>
diff --git a/neonContext/Userhelp/Userhelp.aod b/neonContext/Userhelp/Userhelp.aod
index 435de68c2c1e230ca426a074593bb1004a7ebf6d..057b38dda494f9366cb2e2f617314104f8fd2dd3 100644
--- a/neonContext/Userhelp/Userhelp.aod
+++ b/neonContext/Userhelp/Userhelp.aod
@@ -3,7 +3,7 @@
   <name>Userhelp</name>
   <majorModelMode>DISTRIBUTED</majorModelMode>
   <filterView>Userhelp_FilterView</filterView>
-  <entity>UserhelpResources</entity>
+  <entity>UserhelpResources_entity</entity>
   <references>
     <neonViewReference>
       <name>2a1dd62b-0f30-442b-aa1d-969b46312d2a</name>
diff --git a/neonView/EmployeeMain_view/EmployeeMain_view.aod b/neonView/EmployeeMain_view/EmployeeMain_view.aod
index f52e1c289cf5fed0abf7fa7768073a8d76e778fe..94d73c9fd2ed4bcec0c7792bdfd856e732d35ea0 100644
--- a/neonView/EmployeeMain_view/EmployeeMain_view.aod
+++ b/neonView/EmployeeMain_view/EmployeeMain_view.aod
@@ -34,5 +34,10 @@
       <entityField>#ENTITY</entityField>
       <view>EmployeePermission_view</view>
     </neonViewReference>
+    <neonViewReference>
+      <name>6d6a2677-8be1-41a8-923a-030a72e370cd</name>
+      <entityField>EmployeeTokens</entityField>
+      <view>EmployeeTokenFilter_view</view>
+    </neonViewReference>
   </children>
 </neonView>
diff --git a/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod b/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..9a0bad8cead47190e646443b59d950cd3120f835
--- /dev/null
+++ b/neonView/EmployeeTokenEdit_view/EmployeeTokenEdit_view.aod
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.6" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.6">
+  <name>EmployeeTokenEdit_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <layout>
+    <boxLayout>
+      <name>layout</name>
+    </boxLayout>
+  </layout>
+  <children>
+    <genericViewTemplate>
+      <name>EditForm</name>
+      <editMode v="true" />
+      <fields>
+        <entityFieldLink>
+          <name>516cda4b-3ea2-4631-ad90-cbaeb778830b</name>
+          <entityField>VALID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>08577880-9ef5-4c54-bf5f-599125407904</name>
+          <entityField>VALID_FROM</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>b2e11525-ad9a-4efc-90ee-1bfd4d00a13c</name>
+          <entityField>VALID_TO</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>82c4cfd3-8448-4758-af64-553a3d64ddf3</name>
+          <entityField>GROUP_ID</entityField>
+        </entityFieldLink>
+        <entityFieldLink>
+          <name>542417a1-2ec7-472f-99fa-359d1e7d3ae3</name>
+          <entityField>GROUP_ID_DISPLAY</entityField>
+        </entityFieldLink>
+      </fields>
+    </genericViewTemplate>
+  </children>
+</neonView>
diff --git a/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod b/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod
new file mode 100644
index 0000000000000000000000000000000000000000..852a0eed7cce66f29cb3aeebab709d526a7898a7
--- /dev/null
+++ b/neonView/EmployeeTokenFilter_view/EmployeeTokenFilter_view.aod
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.6" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.6">
+  <name>EmployeeTokenFilter_view</name>
+  <majorModelMode>DISTRIBUTED</majorModelMode>
+  <filterable v="true" />
+  <layout>
+    <groupLayout>
+      <name>layout</name>
+    </groupLayout>
+  </layout>
+  <children>
+    <tableViewTemplate>
+      <name>TokenTable</name>
+      <linkedColumns />
+      <fixedFilterFields />
+      <title>Token</title>
+      <columns>
+        <neonTableColumn>
+          <name>eee2b9fd-89c2-454c-a589-6b5b83e4f538</name>
+          <entityField>VALID_STATUS_ICON</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>b89778da-071e-4a8c-8009-582d5cd31f1a</name>
+          <entityField>VALID_FROM</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>7ae721f4-21d9-4b71-a414-abf1cd411c01</name>
+          <entityField>VALID_TO</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>c6e2c00a-368d-4f16-aef3-579876a236a5</name>
+          <entityField>GROUP_ID</entityField>
+        </neonTableColumn>
+        <neonTableColumn>
+          <name>e511fc55-3c97-4230-a816-38613e448376</name>
+          <entityField>ID</entityField>
+        </neonTableColumn>
+      </columns>
+    </tableViewTemplate>
+  </children>
+</neonView>
diff --git a/process/Calendar_lib/process.js b/process/Calendar_lib/process.js
index 0a9a4b99e7c0c1abbe9d41af4f6ca2b2a734cab1..e9f96a4a9089f1ff65bb69dfb21ff41063f90ab8 100644
--- a/process/Calendar_lib/process.js
+++ b/process/Calendar_lib/process.js
@@ -538,4 +538,113 @@ CalendarUtil.getCalendarSystemType = function(pScope)
 
     // Everything is none
     return calendars.BACKEND_NONE;
+}
+
+CalendarUtil.buildEntriesFromUids = function(appointmentUids) 
+{
+    var entryArray = new Array(appointmentUids.length);
+    
+    for(var i = 0; i < appointmentUids.length; i++)
+    {
+        var hasPermission = true;
+        
+        if(vars.get("$param.ErrorOnPermissionDenied") == "false" || vars.getString("$param.LinkedAppointmentsFromDashlet_param"))
+            hasPermission = hasUserPermissionForReadingEntry(getEntryOwnerCn(appointmentUids[i]));
+       
+        if(hasPermission)
+            entryArray[i] = CalendarUtil.buildEntry(calendars.getEntry(appointmentUids[i], null, null), null);
+    }
+    
+    //filter out all null
+    var filteredEntryArray = entryArray.filter(function (el) {
+        return el != null;
+    });
+    
+    return filteredEntryArray;
+}
+
+
+CalendarUtil.countEntriesFromUids = function(appointmentUids) 
+{
+    return CalendarUtil.buildEntriesFromUids(appointmentUids).length;
+}
+
+CalendarUtil.buildEntry = function (pEntry, pMasterentry)
+{
+    var uid = pEntry[calendars.ID];    
+    var summary = pEntry[calendars.SUMMARY];
+    var attendees = pEntry[calendars.AFFECTEDUSERS];
+    var startdate = pEntry[calendars.DTSTART];
+    var enddate = pEntry[calendars.DTEND];
+    var links = pEntry[calendars.LINKS];
+    var description = pEntry[calendars.DESCRIPTION];
+    if(pEntry[calendars.ORGANIZER2] != undefined)
+        var organizer = pEntry[calendars.ORGANIZER2]["paramvalue"];
+    if(pEntry[calendars.USER2] != undefined)
+        var owner = JSON.stringify(pEntry[calendars.USER2]);
+    var status = pEntry[calendars.STATUS];
+    var location = pEntry[calendars.LOCATION];
+    var reminder = pEntry[calendars.REMINDER_DURATION];
+    var remindercheck = pEntry[calendars.HASREMINDER]
+    var classification = pEntry[calendars.CLASSIFICATION];
+    var transparency = pEntry[calendars.TRANSPARENCY];
+    var categories = pEntry[calendars.CATEGORIES];
+    var isAllDay = pEntry["X-ADITO-ISALLDAYEVENT"] != null ? pEntry["X-ADITO-ISALLDAYEVENT"] : "FALSE";
+    
+    var masterBegin = pMasterentry != null ? pMasterentry[calendars.DTSTART] : null
+    var masterEnd = pMasterentry != null ? pMasterentry[calendars.DTEND] : null
+    
+    // Recurrence
+    var recurrenceID = pEntry[calendars.RECURRENCEID];
+    var rrule = null;
+    if (pMasterentry != null) { // Entry is a recurrence exception, therefore get rrule from master
+        rrule = pMasterentry[calendars.RRULE] != null ? pMasterentry[calendars.RRULE][0] : null;
+    } else {
+        rrule = pEntry[calendars.RRULE] != null ? pEntry[calendars.RRULE][0] : null;
+    }
+    
+    return [
+            uid, 
+            attendees.length, 
+            startdate, 
+            enddate, 
+            summary, 
+            organizer,
+            owner,
+            attendees, 
+            status,  
+            description, 
+            location, 
+            '', 
+            isAllDay,
+            classification,
+            transparency, 
+            categories, 
+            reminder, 
+            remindercheck, 
+            rrule, 
+            recurrenceID, 
+            null, 
+            masterBegin, 
+            masterEnd,
+            null
+        ];
+}
+
+
+function hasUserPermissionForReadingEntry(calUserCn)
+{
+    return calendars.hasPermission(calUserCn, calendars.VEVENT, "READ");
+}
+
+function getEntryOwnerCn(appointmentUid)
+{
+    
+    var owner = newSelect("ASYS_CALENDARBACKEND.OWNER", "_____SYSTEMALIAS")
+        .from("ASYS_CALENDARBACKEND")
+        .whereIfSet("ASYS_CALENDARBACKEND.ELEMENTUID", appointmentUid)
+        .cell(true);
+        
+    var ownerArr = text.decodeMS(owner);
+    return ownerArr[1].split(":")[1];
 }
\ No newline at end of file
diff --git a/process/FilterViewAction_lib/process.js b/process/FilterViewAction_lib/process.js
index b0fa04291d03107498b6eaf03adbe5aa17326186..afd89d4d6d45e7afbd01146356a20eadd053896f 100644
--- a/process/FilterViewAction_lib/process.js
+++ b/process/FilterViewAction_lib/process.js
@@ -40,7 +40,7 @@ FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter)
     {
         return new SqlBuilder()
             .selectDistinct("CONTACT.CONTACTID")
-            .from("PERSON")
+            .from("ORGANISATION")
             .join("CONTACT", newWhere("ORGANISATION.ORGANISATIONID = CONTACT.ORGANISATION_ID").and("CONTACT.PERSON_ID is null"))
             .leftJoin("ADDRESS", "ADDRESS.ADDRESSID = CONTACT.ADDRESS_ID")
             .leftJoin("CLASSIFICATIONSTORAGE", "CLASSIFICATIONSTORAGE.OBJECT_ROWID = CONTACT.CONTACTID")
@@ -52,7 +52,10 @@ FilterViewActionUtils.getUidsByEntityFilter = function (pContext, pFilter)
     var loadRowsConfig = entities.createConfigForLoadingRows()
         .entity(ContextUtils.getEntity(pContext))
         .fields(["#UID"])
-        .filter(JSON.stringify(pFilter.filter || pFilter));
+    if (pFilter.filter)
+        loadRowsConfig.filter(JSON.stringify(pFilter.filter));
+    else if (pFilter)
+        loadRowsConfig.filter(JSON.stringify(pFilter));
         
     return entities.getRows(loadRowsConfig).map(function (row)
     {
diff --git a/process/Order_lib/process.js b/process/Order_lib/process.js
index d6938458c59687ef679f1d437661ec456e01f2e8..bcb1b8428693ab99e51713ecb61a1b44fc6a4857 100644
--- a/process/Order_lib/process.js
+++ b/process/Order_lib/process.js
@@ -545,7 +545,8 @@ OrderUtils.buildReminderReport = function (pOrderID)
         "Ordernumber": translate.text("Order number",language),
         "Orderdate": translate.text("Order date",language),
         "Orderamount": translate.text("Order amount",language),
-        "Dunninglevel": translate.text("Dunning level",language)  
+        "Dunninglevel": translate.text("Dunning level",language),
+        "OutstandingAmount": translate.text("Outstanding Amount",language)
     };
     
     
diff --git a/process/SendEmail_workflowService/process.js b/process/SendEmail_workflowService/process.js
index 6ccbfe3e76006ca51544b503453320d416d35951..14247ad4e4b3dda3ab4be65989fa896e1434a894 100644
--- a/process/SendEmail_workflowService/process.js
+++ b/process/SendEmail_workflowService/process.js
@@ -10,19 +10,24 @@ import("Workflow_lib");
 
 var processInstanceId = vars.get("$local.uid");
 var variables = JSON.parse(vars.get("$local.value"));
-var recipientContactId = variables.recipientContactId;
+var recipientContactId = variables.recipientContactId || variables.targetId;
 var documentTemplateId = variables.documentTemplateId;
 var senderName = variables.senderName;
 var mailSubject = variables.mailSubject;
+var aditoUrl = variables.originUrl;
 
 var actionParams = Utils.clone(variables);
 actionParams.processInstanceId = processInstanceId;
-var linkPlaceholder = new Placeholder("workflowActionLink", Placeholder.types.CALLBACKFUNCTION, function ()
+var additionalPlaceholders = [];
+if (aditoUrl)
 {
-    return WorkflowLinkActions.getActionLink("https://localhost:8443", actionParams.linkActionType, actionParams.redirectLink, actionParams);
-});
+    additionalPlaceholders.push(linkPlaceholder = new Placeholder("workflowActionLink", Placeholder.types.CALLBACKFUNCTION, function ()
+    {
+        return WorkflowLinkActions.getActionLink(aditoUrl, actionParams.linkActionType, actionParams.redirectLink, actionParams);
+    }));
+}
 
-var email = Email.fromTemplate(documentTemplateId, recipientContactId, null, [linkPlaceholder]);
+var email = Email.fromTemplate(documentTemplateId, recipientContactId, null, additionalPlaceholders);
 email.subject = mailSubject;
 email.toRecipients = [CommUtil.getStandardMail(recipientContactId)];
 
diff --git a/report/Reminder_report/reportData.jrxml b/report/Reminder_report/reportData.jrxml
index ca529152a3fbd0034322ba26a655361e685a1ac9..1347b1ef959b34c58be528e8eecfb4bc139ff51a 100644
--- a/report/Reminder_report/reportData.jrxml
+++ b/report/Reminder_report/reportData.jrxml
@@ -2,7 +2,7 @@
 <jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="Mahnung" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="e7a916c8-3f9a-497d-84bb-3909b15271ea">
 	<property name="ireport.zoom" value="2.1435888100000016"/>
 	<property name="ireport.x" value="0"/>
-	<property name="ireport.y" value="57"/>
+	<property name="ireport.y" value="0"/>
 	<parameter name="myAddr" class="java.lang.String"/>
 	<parameter name="Kontenabstimmung" class="java.lang.String"/>
 	<parameter name="Rech.-Nr" class="java.lang.String"/>
@@ -22,6 +22,7 @@
 	<parameter name="Due" class="java.lang.String"/>
 	<parameter name="DUEDATE" class="java.lang.String"/>
 	<parameter name="Dunninglevel" class="java.lang.String"/>
+	<parameter name="OutstandingAmount" class="java.lang.String"/>
 	<field name="PAYED" class="java.lang.String"/>
 	<field name="RELATION_ID" class="java.lang.String"/>
 	<field name="CURRENCY" class="java.lang.String"/>
@@ -59,13 +60,6 @@
 					</textElement>
 					<textFieldExpression><![CDATA[$P{DueDate}]]></textFieldExpression>
 				</textField>
-				<textField>
-					<reportElement x="408" y="0" width="103" height="15" uuid="62a0909f-ef03-4242-969a-8a9532d1aa9a"/>
-					<textElement textAlignment="Right">
-						<font size="8"/>
-					</textElement>
-					<textFieldExpression><![CDATA[$P{Outstanding Amount}]]></textFieldExpression>
-				</textField>
 				<line>
 					<reportElement x="13" y="33" width="527" height="1" uuid="d5108302-191f-4e27-8920-fcd330d335e8"/>
 				</line>
@@ -125,6 +119,13 @@
 					</textElement>
 					<textFieldExpression><![CDATA[$R{Rechnungsbetrag}]]></textFieldExpression>
 				</textField>
+				<textField>
+					<reportElement x="430" y="0" width="81" height="15" uuid="8eee46c0-f3c3-4563-b1b1-746aeb7e73c6"/>
+					<textElement>
+						<font size="8"/>
+					</textElement>
+					<textFieldExpression><![CDATA[$P{OutstandingAmount}]]></textFieldExpression>
+				</textField>
 			</band>
 		</groupHeader>
 	</group>